基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx

上传人:b****4 文档编号:11586509 上传时间:2023-03-19 格式:DOCX 页数:12 大小:373.50KB
下载 相关 举报
基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx_第1页
第1页 / 共12页
基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx_第2页
第2页 / 共12页
基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx_第3页
第3页 / 共12页
基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx_第4页
第4页 / 共12页
基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx

《基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx》由会员分享,可在线阅读,更多相关《基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx(12页珍藏版)》请在冰豆网上搜索。

基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx

基于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.设计总结

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1