




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
QQ 290632690 肤浅 制作 1 MATLAB 设计 设计 FPGA 实现 联合实现 联合 ISE 和和 Modelsim 仿真的仿真的 FIR 滤波器设计滤波器设计 摘要 本文首先利用 MATLAB 产生两个频率不一样的正弦信号 并将这两个正弦信号相加 得到一 个混叠的波形 然后利用 MATLAB 设计一个 FIR 低通滤波器 并由 Verilog 实现 联合 ISE 和 Modelsim 仿真 实现滤除频率较高的信号 并将滤波后的数据送到 MATLAB 中分析 本文首先介绍 FIR 滤波器的基本原理 然后从目前最流行的的设计方式入手 逐步介 绍 FIR 滤波器的设计 其流程图如图 1 所示 MATLAB产生仿真 所需要的输入信号 以十六进制的格式存放到 txt格式的文本文件中 在Modelsim中用Verilog编写 仿真测试文件 通过系统函数 readmemh读 入 txt格式的仿真数据 在Modelsim中做功能仿真和时 序仿真 调用 fopen函数打开另外一个 数据文件 调用 fdisply函数将仿真的结果 写入上述打开的文件 在MATLAB中将仿真输出输 出读入一个数组做分析 图 1 一 一 FIR 滤波器的基本原理 滤波器的基本原理 数字滤波器是从分析信号中提取用户需要的信息 滤去不需要的信号成分或者干 扰成分 数字滤波器的数学模型 线性时不变数字滤波器的数学模型在时域中可以用线性 常系数差分方程给出 10 NM kq kq y ndy nkp x nq AA 其等效的 Z 变换为 0 1 1 M q q q N k k k p z H z dz A A 当 全为 0 时 Z 域系统函数只有零点 数字滤波器的单位脉冲响应有限 通 k d QQ 290632690 肤浅 制作 2 常这用滤波器被称为有限冲激响应 FIR 滤波器 它的输出只与当前的输入和过去的 输入有关 跟过去的输出无关 FIR 滤波器的一个重要特性是具有线性相位 即系统的 相异和频率成正比 可达到无失真传输 更加详细的介绍 FIR 滤波器的理论算法知识 请参考别的先关书籍资料 二 二 FIR 滤波器的设计及验证 滤波器的设计及验证 1 由 MATLAB 产生 FIR 滤波器的输入数据 并存放到 txt 文件中 用 MATLAB 产生两个频率分别为 0 5MHz 和 2MHz 的正弦信号 并将这两个正弦 信号叠加 得到一个混叠的信号 并将这个混叠信号的波形数据存放到 C 盘根目录下 面的 matlab wave data txt 文件中 MATLAB 实现代码如下 clear all fs 25000000 25M 采样率 t 0 1 fs 0 0002 共 0 0002 25000000 5000 个点 f1 500000 f2 2000000 signal1 sin 2 pi f1 t 频率为 0 5MHz 的正弦信号 QQ 290632690 肤浅 制作 3 signal2 sin 2 pi f2 t 频率为 2 0MHz 的正弦信 由于正 余弦波形的值在 0 1 之间 需要量化成 16bit 先将数值放大 y2 fix 16384 2 14 1 signal1 量化到 15bit y3 fix 16384 2 14 1 signal2 量化到 15bit y1 y2 y3 量化到 16bit 再将放大的浮点值量化 并写道到存放在 C 盘的文本中 fid fopen c matlab wave data txt wt fprintf fid x n y1 以 16 进制的格式将数据存放到 txt 文件中 如果不用 16 进制 后 面 读数会出错 fclose fid plot y2 b hold on plot y3 b hold on plot y1 r legend 0 5MHz 正弦 2MHz 正弦 两者叠加 title MATLAB 产生的两个正弦信号的叠加波形 信号波形图如图 2 所示 QQ 290632690 肤浅 制作 4 图 2 存放数据的文件路径 名称已经文本的内容如图 3 所示 图 3 用 MATLAB 回读 C 盘根目录下的 matlab wave data txt 文件 验证存入的波形数据是 否正确 MATLAB 代码如下 fid fopen c matlab wave data txt r for i 1 5001 一共有 5001 个数据 num i fscanf fid x 1 从 fid 所指的文件中 以 16 进制的方式读出一个数据 end fclose fid figure 2 plot num b legend MATLAB 从 txt 文件中读出的原始叠加波形数据 title 直接回读 MATLAB 产生的两个正弦信号的叠加波形 显示的波形如图 4 所示 QQ 290632690 肤浅 制作 5 图 4 对比图 4 和图 2 中的叠加波形 可知以上操作的正确性 2 用 MATLAB 设计 FIR 滤波器 输入信号是频率别为 0 5MHz 和 2MHz 的正弦信号的叠加 我们的任务是设计一个低通 滤波器滤除掉 2MHz 的干扰信号 因此 我们可以设计一个采样率为 25MHz 的低通滤波器 其通带带宽为 1MHz 阻带宽度为 2MHz 通带内纹波抖动为 1dB 阻带下降为 80dB 在 MATLAB 的命令窗口输入 fdatool 命令并回车 打开 FDATool 工具箱 用 MATLAB 的 FDATool 工具设计该滤波器 参数设置如图 5 所示 设计好参数后 点击 DesignFilter 可以在 FDATool 窗口的左上角看到滤波器的阶数为 63 阶 点击 File Generate M file 并将滤波器命名为 mylowfilter QQ 290632690 肤浅 制作 6 图 5 编写如下代码 滤除混叠信号中的高频信号 Hd mylowfilter 滤波器名称 output filter Hd y1 对叠加信号 y 进行滤波处理 figure 3 plot y2 k hold on plot output r legend 0 5MHz 原始信号 滤波后取出的信号 title 信号通过 MTALAB 的低通滤波器后的波形 滤波后的波形如图 6 所示 QQ 290632690 肤浅 制作 7 图 6 生成 coe 文件 用于 Xilinx 的 IPCore 设计滤波器 FDATool 窗口点击 File Export 保持默认设置 点击 Export 即可 次数在 MATLAB 的 workspace 窗口多出一个 Num 的 1 64 的数组 这就是滤波器的系数 如图 7 所示 图 7 由于 MATLAB 生成的滤波器系数全是一些小数 而 FPGA 只能处理整数 因此我们必 须将这些小数扩大一定的倍数 使它们变成整数 在 MATLAB 的命令窗口输入下面的一段代码然后按 Enter 即可将上面这些系数变为整 数 注意这里的 32767 表示将系数扩大 32767 倍 这里的扩大倍数只能选 2 N 目的是 为了后面滤波后的波形数据的高位截取 丢掉低位 即除以 2 N 返回 ans 0 表示操作 QQ 290632690 肤浅 制作 8 正确 coeff round Num max abs Num 32767 abs 求绝对值 max 求最大值 round 四舍五入 fid fopen e fircoe txt wt 将滤波器系数写入文件件中 fprintf fid 16 0f n coeff 将滤波器系数以 16 位浮点数的格式保存 fclose fid 程序运行的结果如图 8 所示 图 8 将文件的格式改为 coe 格式 在文件的开口加上 radix 10 coefdata 在每个数字前的空格处加一个逗号 并在最后一个数字后面加上分号 如图 9 所示 QQ 290632690 肤浅 制作 9 图 9 这样就产生了可供 FIR 滤波器的 IPCore 可调用的 coe 文件 3 用 Verilog 编程读取 MATLAB 产生的波形数据 通过 Verilog 的 readmemh 函数即可读出 txt 文件中的数据 这里的数据是以 16 进制 形式存储的 具体用法如下 reg 15 0 data in 0 2000 定义一个 16bit 2001 的数组 initial begin 读出 MATLAB 产生的波形数据 0 5MHz sin 4MHz sin 信号 readmemh c matlab wave data txt data in 将 matlab wave data txt 中的数据读入存储器 data in End 我在 modelsim 中尝试用 readmemh 来读取 matlab 生成的数据 但是一旦到了负数的 地方就出现问题了 之后的所有数据都变成了 xxxxx 因此我在用 MATLAB 产生波形数据时 都给正弦信号添加了一个偏移量 将正弦信号平移到了 0 之上 用 Modelsim 仿真工具可以看到读出的数据 并与原文件数据 图 3 比较 可以判断 读出的数据是否正确 这里是 ISE 和 Modelsim 联合仿真的结果 如图 10 所示 图 10 4 由 Xilinx 的 FIR 的 IPCore 实现 FIR 滤波器 FIR 的 IPCore 的生成步骤就不多说了 简单的说一下参数配置情况 a 我们使用由 MATLAB 生成的 coe 文件导入滤波器的系数 b 输入信号的采样频率为 25MHz 这里必须和 MATLAB 产生的波形数据的采样频率 保持一致 c FIR 滤波器的运行时钟 这里我们选择 250MHz 这里必须和仿真文件里给的时钟 保持一致 d 输入数据的类型 我们这里选择了无符号数 输入数据位宽为 16bit 因为 QQ 290632690 肤浅 制作 10 modelsim 不能读出负数 要么用补码 要么加偏移 如图 11 图 12 所示 图 11 图 12 FIR 的 IPCore 的列化如下 FIR16 IP FIR16 IP ins clk clk input clk QQ 290632690 肤浅 制作 11 rfd rfd output rfd 在其上升沿将输入数据加载到滤波器内核中 rdy rdy output rdy 在其上升沿输出滤波器的计算结果 din data in reg input 15 0 din dout dout output 35 0 dout 特别注意这个数据位宽 我们主要对其进行简单的控制 在 rfd 上升沿将输入数据加载到滤波器内核中 在 rdy 上升沿输出滤波器的计算结果 具体的 Verilog 代码如下 always posedge clk begin if reset 1 b0 begin i 1 b0 m 1 b0 data in reg 16 h0000 end else begin rfd 1q rfd rfd 2q rfd 1q if rfd 1q i i 1 m m if i 2002 i 0 end end end always posedge clk begin if reset 1 b0 begin Data out reg 0 j 0 n 0 QQ 290632690 肤浅 制作 12 end else begin rdy 1q rdy rdy 2q rdy 1q if rdy 1q j j 1 b1 n n end end end 这里还做了一个附加功能 将 FIR 滤波器的输入数据存放到一个 txt 文件当中 然后用 MATLAB 去读取这个波形文件数据 看看读出的波形是否和原来的混叠波形一样 具体的 Verilog 和 MATLAB 代码如下 integer wr file initial wr file fopen c FIR in data txt always m begin if reset 1 b1 begin fdisplay wr file h data in reg 33bit 数 if j 11 d2002 共写入 2001 个数据 stop end end fid fopen c FIR in data txt r for j 1 2000 num1 j fscanf fid x 1 这句话的意思是从 fid 所指的文件以 16 进制方式读出一个数据 end fclose fid QQ 290632690 肤浅 制作 13 figure 4 plot num1 r legend Verilog 读出的 txt 文件中的数据 title FIR 滤波器的输入数据 MATLAB 读出的波形数据如图 13 所示 图 13 5 将 FIR 滤波器的输出存入 txt 文件中 有上面的步骤我们已经验证了输入到 FIR 滤波器的数据都是正确的 下面就将 FIR 滤波 器的输出数据保存到一个 txt 文件当中供 MATLAB 读取 刚刚的问题是 matlab 读一个数据是 32bit 的 而 FIR 的输出是 36bit 的 因此高 4bit 根本没有读上来 assignData out 31 0 Data out reg 35 4 integer w file initial w file fopen c FIR out txt always n begin if reset 1 b1 begin fdisplay w file h Data out 31 14 33bit 数 if j 11 d2002 共写入 2001 个数据 stop QQ 290632690 肤浅 制作 14 end end 这里我也搞了好久才搞好 这里 FIR 滤波器的输出数据位宽变成了 36bit 而输入数据 位宽是 16bit 为什么数据会变大几万倍呢 因为我们在将滤波器的系数由小数变成整数的时候 对这些系数整体扩大了 32767 倍 再做了一个四舍五入 影响滤波器精度 对滤波器的系数扩大的倍数越大 四舍五入对精 度的影响就越小 但是系数乘的倍数越大 FPGA 在做乘加运算也就越复杂 也就越耗时 越耗资源 因此我们需要找一个平衡点 这里为了将信号的幅度变回原始的幅度 尽可能的靠近 我们只能通过将低位截取掉 截取低位相当于对数据做除法 除 2 所以前面的滤波器系数的扩大倍数我们一定要用 2 N 这样我们在这里还原信号幅度的时候 只需要截位就能达到目的 比如这里我们对滤波器的系数乘了 32767 那我们在做除法还原波形幅度时 只需要 除以 32767 即可 即截掉低 16bit 还有一种操作方式就是我们只保留数据的高 16bit 和 输入数据的位宽保持一致 这两种方式波形的幅度也就几倍的差距 我还没有完全搞懂这 里 究竟怎样才能将波形的幅度完全的还原回去 还是一个值得好好思考的问题 另一个问题是我的电脑是 32bit 位宽的 如果我们一次性让 MATLAB 读取 36bit 的数据 那么数据的高 4bit 会读不上来 会导致很奇怪的波形 我也遇到了这个问题 如图 14 所 示 波形明显可以通过一些平移拼合成一个正弦波 通过对波形数据一个个的分析 我找 到了这个问题 QQ 290632690 肤浅 制作 15 图 14 图 15 是波形幅度发生变化的截图 图 15 6 由 MATLAB 读入 FIR 滤波器的输出数据 并分析滤波结果 由 MATLAB 读取 FIR 滤波器的输出数据 分析波形 具体的代码如下 fid fopen c FIR out txt r for i 1 2000 num i fscanf fid x 1 这句话的意思是从 fid 所指的文件以 16 进制方式读出一个数据 end fclose fid figure 5 plot num r y4 y2 hold on plot y4 k legend 经过 FIR IPCore 滤波后的数据 0 5MHz 的原始数据放大 16384 倍 title 经过 FIR 滤波器的输出数据 波形数据如图 16 所示 QQ 290632690 肤浅 制作 16 图 16 三 三 总结总结 本次设计我大约耗时一周 从 0 开始研究 FIR 滤波器的设计 联合了 MATLAB ISE Modelsim 三个工具 不得不佩服 MABLAB 在数据分析方面强大的功能 本次设计走通了 FIR 滤波器的总体设计流程 为以后的工程实用打下了基础 当然还 有一些基本问题 如波形幅度如何完美的还原还没搞清楚 有待进一步研究 在实际 工程应用时 我们可以通过联合 MATLAB ISE Modelsim 三个工具完全脱离硬件来设 计 仿真 验证 FIR 数字滤波器的性能 肯定能够大大的缩短设计周期 提升滤波器 性能 附录 附录为 Verilog 源代码和 MATLAB 源代码 这些源代码是经过调试的 是可以直接使用的 供大家参 考 Verilog 源代码 module FIR Lowpass clk reset Data out QQ 290632690 肤浅 制作 17 inputclk inputreset output 31 0 Data out reg 35 0 Data out reg reg 10 0 i 0 reg 10 0 j 0 reg 15 0 data in 0 2000 定义一个 16bit 2001 的数组 reg 15 0 data in reg 0 initial begin 读出 MATLAB 产生的波形数据 0 5MHz sin 4MHz sin 信号 readmemh c matlab wave data txt data in 将 matlab wave data txt 中的数据读 入存储器 data in end wirerfd wirerdy wire 35 0 dout reg rfd 1q reg rfd 2q reg rdy 1q reg rdy 2q reg n 0 reg m 0 always posedge clk begin if reset 1 b0 begin i 1 b0 m 1 b0 data in reg 16 h0000 end else begin rfd 1q rfd QQ 290632690 肤浅 制作 18 rfd 2q rfd 1q if rfd 1q i i 1 m m if i 2002 i 0 end end end FIR16 IP FIR16 IP ins clk clk input clk rfd rfd output rfd 在其上升沿将输入数据加载到滤波器内核中 rdy rdy output rdy 在其上升沿输出滤波器的计算结果 din data in reg input 15 0 din dout dout output 35 0 dout always posedge clk begin if reset 1 b0 begin Data out reg 0 j 0 n 0 end else begin rdy 1q rdy rdy 2q rdy 1q if rdy 1q j j 1 b1 n n end QQ 290632690 肤浅 制作 19 end end 刚刚的问题是 matlab 读一个数据是 32bit 的 而 FIR 的输出是 36bit 的 因此高 4bit 根 本没有读上来 assign Data out 31 0 Data out reg 35 4 assignData out 31 0 Data out reg 35 4 integer wr file initial wr file fopen c FIR in data txt always m begin if reset 1 b1 begin fdisplay wr file h data in reg 33bit 数 if j 11 d2002 共写入 2001 个数据 stop end end integer w file initial w file fopen c FIR out txt always n begin if reset 1 b1 begin fdisplay w file h Data out 31 14 33bit 数 if j 11 d2002 共写入 2001 个数据 stop end end endmodule QQ 290632690 肤浅 制作 20 MATLAB 源代码 MATLAB 产生信号并保存到 txt 文件中 clear all fs 25000000 25M 采样率 t 0 1 fs 0 0002 共 0 0002 25000000 5000 个点 f1 500000 f2 2000000 signal1 sin 2 pi f1 t 频率为 0 5MHz 的正弦信号 signal2 sin 2 pi f2 t 频率为 4 0MHz 的正弦信号 y1 signal1 signal2 两个正弦信号叠加 x linspace 0 12 56 2048 在区间 0 6 28 2 pi 之间等间隔的取 1024 个点 y1 sin x 计算相应的余弦值 由于正 余弦波形的值在 0 1 之间 需要量化成 16bit 先将数值放大 y1 y1 32768 32 1024 32768 y1 y1 16384 32 1024 32768 y1 y1 32768 y2 fix 16384 2 14 1 signal1 y3 fix 16384 2 14 1 signal2 y1 y2 y3 再将放大的浮点值量化 并写道到存放在 C 盘的文本中 fid fopen c matlab wave data txt wt fprintf fid 16 0f n y1 在写文件时量化为 16bit 的定点实数 16 0f 16 0 表示 16bit 定点数 f 表示实数 范围是 32768 32767 fprintf fid x n y1 在写文件时量化为 16bit 的定点实数 16 0f 16 0 表示 16bit 定点 数 f 表示实数 范围是 32768 32767 fclose fid figure 1 plot y2 b QQ 290632690 肤浅 制作 21 ho
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文化产业管理考试的众多考点与试题及答案解析
- 爆破技术员试题及答案
- 提升光电工程师能力的试题及答案
- 药物临床试验设计与管理试题及答案
- 药物临床试验的伦理审查与实施试题及答案
- 经典考法西医临床考试试题及答案
- 文化产业管理实践案例试题及答案探索
- 药物受体作用基本知识试题及答案
- 网络设计师考试的思维训练试题及答案
- 如何在2024年信息系统项目管理师考试中实现高效备考试题及答案
- 江苏省苏州市2022-2023学年高二下学期数学期中试卷(含答案)
- 中华人民共和国国家安全法全文
- 人工智能导论-第2版-全套课件
- 勘察任务委托书范本
- 数控技术(第4版)课件:数控技术的发展及机械加工自动化
- 《孔雀鱼组》课件
- 江苏省徐州市(2024年-2025年小学六年级语文)部编版小升初真题(下学期)试卷及答案
- 《习近平法治思想概论(第二版)》 课件 11.第十一章 坚持依法治国、依法执政、依法行政共同推进法治国家、法治政府、法治社会一体建设
- 设计单位施工期间配合及技术服务措施
- 2024版编剧网络剧保密及收益分配协议3篇
- 《混凝土坝智能建造技术导则》知识培训
评论
0/150
提交评论