基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx
- 文档编号:11586509
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:12
- 大小:373.50KB
基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx
《基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx》由会员分享,可在线阅读,更多相关《基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
基于matlab和FPGA联合仿真的FIR低通滤波器设计报告
FIR低通滤波器设计报告
1.设计内容
本设计是基于FPGA的一个FIR低通滤波器设计,给定一段有高频干扰的信号Hnoise.wav,要求使用matlab设计出一个低通滤波器滤除其干扰频率,并取出10000到10160点进行时频分析。
然后使用verilog语言编写出滤波器,联合modelsim进行编译仿真,并将结果与matlab结果进行对比。
2.设计原理
FIR滤波器响应(简称FIR)系统的单位脉冲响应
为有限长序列,系统函数
在有限z平面上不存在极点,其运算结构中不存在反馈支路,即没有环路。
如果
的长度为N,则它的系统函数和差分方程一般具有如下形式:
根据差分方程直接画出FIR滤波器的结构,称为直接型结构。
如图所示:
图2.1FIR滤波器直接结构
FIR滤波器的特点:
单位脉冲响应序列为有限个;可快速实现;可得到线性相位;滤波器阶数较高。
对线性时不变系统保持线性相位的条件是:
单位脉冲响应为偶对称或奇对称。
即:
为设计线性滤波器,应保证h(n)为对称的。
1)若N为偶数,其线性相位FIR滤波器的对称结构流图:
图2.2若N为偶数线性相位FIR滤波器的对称结构流图
图中:
“+1”对应偶对称情况,“-1”对应奇对称情况。
当n为奇数时,最后一个支路断开。
2)若N为奇数,其线性相位FIR滤波器的对称结构流图:
图2.3N为奇数线性相位FIR滤波器的对称结构流图
在本设计中,我们采用线性FIR低通滤波器,所采用的阶数N=8,所以是偶对称的,估采取图2.2的结构,其中“±1“取“+1”。
3.设计思路
首先要用matlab对给定的信号进行时频分析来确定干扰信号的中心频率,然后再设计出相应的数字滤波器进行滤波,最后要在FPGA上实现FIR滤波器。
首先要确定滤波器的抽头系数。
其系数的确定,我们可以通过两种办法来实现:
第一种就是通过matlab编写FIR滤波器程序,然后直接导出抽头系数“h(n)”,另外一种办法就是使用matlab自带的FDATOOL简便地设计一个FIR滤波器,然后导出系数。
考虑到要更直观地描述FIR滤波器的设计,我采用了第二种方法,用fdatool设计滤波器并导出参数。
设计好滤波器后,接着要用matlab对给定的信号进行采样,保存,量化,导出以供FPGA的FIR滤波器模块使用。
做好准备工作后,就可以在QUARTUSII里面编写Verilog代码了。
由于是硬件描述语言,所以设计的思路很简单,就是通过把输入序列移位,然后首位对称相加再乘以抽头系数,然后把相乘结果再相加最后给输出。
其中涉及的难点是FPGA对有符号小数的乘法处理部分。
在QUARTUSII编写好模块之后,就要用到modelsim来对设计进行仿真。
对于仿真信号的输入,我们直接使用系统函数$readmemh()来读取matlab产生的信号采样值,然后通过时钟的驱动一个一个输入到FIR滤波器模块,最后在modelsim中显示滤波器的输出结果。
验证的最后一步,就是要把modelsim输出的仿真结果用matlab进行绘图,和之前matlab程序的输出结果进行比较,从而验证滤波器的设计是否成功。
4.设计过程
1)对信号进行时频分析
语音信号是非平稳的随机过程,频率会随着时间而变化。
在语音信号处理研究领域,通常用短时间的傅里叶变换(STFT)来分析其时域和频率特性,也就是在20ms~50ms以内,可以将语音信号看成是平稳的随机过程。
平稳的随机过程是功率信号,可以用功率谱来描述。
所加的噪声干扰是单音干扰,单音干扰是周期信号。
这里提取了20ms的语音信号来分析其时域和频域特性,由于采样频率是8000Hz,因此我们利用了160个采样点,起始点在第10001点,结束点在第10160点。
图4.1滤波前的时域图
图4.2滤波前的频谱图
通过上图可以看出信号在3800HZ左右的地方受到严重的干扰。
2)使用matlab设计FIR滤波器
用matlab设计线性FIR滤波器,首先要确定其指标,在本设计里,我们规定滤波器的指标如下:
阶数N=34,抽样频率fs=8000Hz,截止频率为3300用窗函数设计FIR滤波器,窗函数选择汉明窗。
其幅频响应如下:
图4.3滤波器幅频响应
可以导出滤波器抽头系数h(n)为:
h=
0.000780227960895479-0.001771093775299170.00203379258009801-0.000494245608574501-0.003344650598584810.00754651554336203-0.00762305727075547-0.0002838373332175980.0145004055957633.025*********.020*********0.00783243571565760-0.0501058634318108.0793********-0.0569389948191050-0.06821550694176550.5819265274085500.581926527408550-0.0682155069417655-0.0569389948191050.0793********-0.05010586343181080.00783243571565760.020*********.025*********0.0145004055957633-0.000283837333217598-0.007623057270755470.00754651554336203-0.00334465059858481-0.0004942456085745010.00203379258009801-0.001771093775299170.000780227960895479
由于FPGA不支持浮点数的运算,所以我们采用定点数的格式来量化抽头系数。
对于16位的输入数据,我们这里采用Q11的定点小数格式,即11位小数位,4位整数位,1位符号位。
将抽头系数乘以2^11可得:
hn=
1-34-1-615-15029-524116-102162-116-13911911191-139-116162-1021641-52290-1515-6-14-31
这样我们就得到了34阶FIR滤波器的量化系数了。
确定好FIR滤波器的系数了,我们用matlab对信号进行滤波。
图4.4滤波后的信号时域图
图4.5滤波后的信号频谱图
可以看出信号的干扰已被滤除,接下来,就先把信号的采样值进行移位量化处理,然后保存到txt文件,供后续仿真使用,具体matlab代码如下:
值得一提的是此处还需要将数据转换成16进制的格式才可以由modelsim直接读取。
具体可以matlab里使用dec2hex语句进行转换。
图4.6matlba命令将数据导出到txt中
3)用Verilog编写滤波器模块
由于Verilog是一种行为描述语言,所以用来描述FIR的结构是很方便的,其关键程序就是有符号小数的乘法处理模块。
为了方便后续的仿真,整一个FIR滤波器程序可以分为两个部分:
FIR滤波器主程序以及有符号小数的乘法模块。
(2)FIR滤波器主程序:
其主程序的变量定义如下:
图4.7主程序变量
其中输入数据和滤波器的抽头系数,都是16位,所以相加结果仍然是16位。
相乘的结果用32位表示。
为了防止相乘再相加后数据的溢出,我们在这里把存放相乘再相加的结果扩大了2位,用到34位,然后最后的输出,在原来的基础上再扩大1位,35位的输出。
在最后的输出中,可以把低位去掉,只保留若干高位,但这里只需要仿真出结果便可,所以没有进行截断处理,然而在实际工程中,由于数位的限制,还是要注意这点。
FIR主程序就是描述图2.2的FIR滤波器结构,其行为描述,具体可以用以下代码实现:
其中x1~x34通过前一个值对后一个值的赋值,可以实现移位操作;而s1~s17是用来存放首位对称相加的结果;然后y1~y17是乘法输出的结果,通过y1到y17的累加,最后输出到结果out。
其中乘法的运算,我们调用17次乘法模块(因为线性FIR滤波器是对称结构,所以可以只进行34/2=17次的乘法运算。
(3)乘法模块
对于有符号的小数运算,在FPGA里面,其实是和有符号整数的运算是一样的。
只是定点数的小数点的位置,我们需要牢记,在最后输出结果的时候,要适当的进行移位。
由于负数在Verilog中是以补码形式保存的,所以在输入16位有符号数的时候,在进行相乘之前,要把负数变为原码再相乘,而正数的补码就是其本身,所以不用转换。
然后把符号位提出来,进行异或运算,得到输出的符号位,再把有效数位的原码进行相乘,最后得到1位符号位和30位相乘结果。
为了补全32位,可以在最低位加上一个无关位0。
最终输出如果是负数,还需要把它变成补码的形式输出。
至此,一个有符号的小数乘法运算就完成了。
根据以上思路,我们可以写出出乘法模块的代码:
5.分析验证
设计好以上模块后,可以进行编译综合了。
最后的编译综合结果如下图所示:
图5.1编译结果
从上图可以看出,最后编译成功,程序设计没有语法错误。
但具体要测试其工作是否正常,我们接下来,就需要用到modelsim对其进行仿真。
我们要写testbench文件,就需要三个输入,一个输出。
其中一个输入是时钟,一个复位信号,还有随时钟变化的地址输入和最后的输出。
根据此可以写出测试文件:
由于最后输出的数是补码,为了能在modelsim的下方报告栏能显示出正常的十进制负数,我们定义了一个有符号寄存器out1,然后通过$display命令把结果按照时钟一个个输出到报告栏里。
仿真得到的波形和结果如下图所示:
图5.2modelsim仿真波形
Modelsim会自动把滤波结束的数据写入到一个fir_result文件中去用于matlab绘图。
图5.3modelsim产生的输出文件
可以看到数据中出现了很多2147xxxxxx的数,这些数其实是补码的的十进制形式。
运算的过程中出现的bug,暂时还没法解决。
但是可以用matlab将数据变成正常的形式。
只要执行下面命令即可解决:
由于我们没有对输出的35位数据进行截断处理,所以在最后的输出结果,我们要处以2^23。
这是因为两个Q11的小数相乘,其小数位扩大了11位,变成了22位;然后加上1位的无关位,所以最后输出要处以2的23次方。
最后得出滤波器仿真的波形和matlab产生的结果进行比较:
图5.4modelsim输出的波形和matlab仿真的波形比较
由于滤波器参数设置有精度上的限制。
而且前几个数据会有无效数据。
但仍可以看得出,modelsim的输出波形是和matlab的输出波形一致的,可以确定滤波器正常工作,达到了预期的效果。
6.设计总结
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 matlab FPGA 联合 仿真 FIR 滤波器 设计 报告