基于某matlab和FPGA联合仿真地FIR低通滤波器设计报告材料

上传人:公**** 文档编号:470313475 上传时间:2023-04-05 格式:DOC 页数:13 大小:468.50KB
返回 下载 相关 举报
基于某matlab和FPGA联合仿真地FIR低通滤波器设计报告材料_第1页
第1页 / 共13页
基于某matlab和FPGA联合仿真地FIR低通滤波器设计报告材料_第2页
第2页 / 共13页
基于某matlab和FPGA联合仿真地FIR低通滤波器设计报告材料_第3页
第3页 / 共13页
基于某matlab和FPGA联合仿真地FIR低通滤波器设计报告材料_第4页
第4页 / 共13页
基于某matlab和FPGA联合仿真地FIR低通滤波器设计报告材料_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《基于某matlab和FPGA联合仿真地FIR低通滤波器设计报告材料》由会员分享,可在线阅读,更多相关《基于某matlab和FPGA联合仿真地FIR低通滤波器设计报告材料(13页珍藏版)》请在金锄头文库上搜索。

1、wordFIR低通滤波器设计报告1. 设计内容本设计是基于FPGA的一个FIR低通滤波器设计,给定一段有高频干扰的信号Hnoise.wav,要求使用matlab设计出一个低通滤波器滤除其干扰频率,并取出10000到10160点进展时频分析。然后使用verilog语言编写出滤波器,联合modelsim进展编译仿真,并将结果与matlab结果进展比照。2. 设计原理FIR滤波器响应简称FIR系统的单位脉冲响应为有限长序列,系统函数 在有限z平面上不存在极点,其运算结构中不存在反应支路,即没有环路。如果的长度为N,如此它的系统函数和差分方程一般具有如下形式:根据差分方程直接画出FIR滤波器的结构,称

2、为直接型结构。如下列图:图2.1 FIR滤波器直接结构FIR滤波器的特点:单位脉冲响应序列为有限个;可快速实现;可得到线性相位;滤波器阶数较高。对线性时不变系统保持线性相位的条件是:单位脉冲响应为偶对称或奇对称。即:为设计线性滤波器,应保证h(n)为对称的。1假如N为偶数,其线性相位FIR滤波器的对称结构流图:图2.2 假如N为偶数线性相位FIR滤波器的对称结构流图图中:“ +1 对应偶对称情况,“ -1 对应奇对称情况。当n为奇数时,最后一个支路断开。2假如N为奇数,其线性相位FIR滤波器的对称结构流图:图2.3 N为奇数线性相位FIR滤波器的对称结构流图在本设计中,我们采用线性FIR低通滤

3、波器,所采用的阶数N=8,所以是偶对称的,估采取图2.2的结构,其中“1“取“1。3. 设计思路首先要用matlab对给定的信号进展时频分析来确定干扰信号的中心频率,然后再设计出相应的数字滤波器进展滤波,最后要在FPGA上实现FIR滤波器。首先要确定滤波器的抽头系数。其系数确实定,我们可以通过两种方法来实现:第一种就是通过matlab编写FIR滤波器程序,然后直接导出抽头系数“hn,另外一种方法就是使用matlab自带的FDATOOL简便地设计一个FIR滤波器,然后导出系数。考虑到要更直观地描述FIR滤波器的设计,我采用了第二种方法,用fdatool设计滤波器并导出参数。设计好滤波器后,接着要

4、用matlab对给定的信号进展采样,保存,量化,导出以供FPGA的FIR滤波器模块使用。做好准备工作后,就可以在QUARTUSII里面编写Verilog代码了。由于是硬件描述语言,所以设计的思路很简单,就是通过把输入序列移位,然后首位对称相加再乘以抽头系数,然后把相乘结果再相加最后给输出。其中涉与的难点是FPGA对有符号小数的乘法处理局部。在QUARTUSII编写好模块之后,就要用到modelsim来对设计进展仿真。对于仿真信号的输入,我们直接使用系统函数$readmemh()来读取matlab产生的信号采样值,然后通过时钟的驱动一个一个输入到FIR滤波器模块,最后在modelsim中显示滤波

5、器的输出结果。验证的最后一步,就是要把modelsim输出的仿真结果用matlab进展绘图,和之前matlab程序的输出结果进展比拟,从而验证滤波器的设计是否成功。4. 设计过程1) 对信号进展时频分析 语音信号是非平稳的随机过程,频率会随着时间而变化。在语音信号处理研究领域,通常用短时间的傅里叶变换STFT来分析其时域和频率特性,也就是在20ms50ms以内,可以将语音信号看成是平稳的随机过程。平稳的随机过程是功率信号,可以用功率谱来描述。所加的噪声干扰是单音干扰,单音干扰是周期信号。这里提取了20ms的语音信号来分析其时域和频域特性,由于采样频率是8000Hz,因此我们利用了160个采样点

6、,起始点在第10001点,完毕点在第10160点。 图4.1 滤波前的时域图 图4.2 滤波前的频谱图 通过上图可以看出信号在3800HZ左右的地方受到严重的干扰。 2) 使用matlab设计FIR滤波器用matlab设计线性FIR滤波器,首先要确定其指标,在本设计里,我们规定滤波器的指标如下:阶数N=34,抽样频率fs=8000Hz,截止频率为3300用窗函数设计FIR滤波器,窗函数选择汉明窗。其幅频响应如下:图4.3 滤波器幅频响应可以导出滤波器抽头系数hn为:h =0.000780227960895479-0.001771093775299170.00203379258009801-0.

7、000494245608574501-0.003344650598584810.00754651554336203-0.00762305727075547-0.0002838373332175980.0145004055957633-0.02556763039525060.02040310781520230.00783243571565760-0.05010586343181080.0793218675548351-0.0569389948191050-0.06821550694176550.5819265274085500.581926527408550-0.0682155069417655

8、-0.05693899481910500.0793218675548351-0.05010586343181080.007832435715657600.0204031078152023-0.02556763039525060.0145004055957633-0.000283837333217598-0.007623057270755470.00754651554336203-0.00334465059858481-0.0004942456085745010.00203379258009801-0.001771093775299170.000780227960895479由于FPGA不支持浮

9、点数的运算,所以我们采用定点数的格式来量化抽头系数。对于16位的输入数据,我们这里采用Q11的定点小数格式,即11位小数位,4位整数位,1位符号位。将抽头系数乘以211可得: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 滤波后的信号频谱图可以看出信号的干扰已被滤除,接下来,就先把信号的采样值进展移位量化处理,然后保存到

10、txt文件,供后续仿真使用,具体matlab代码如下:值得一提的是此处还需要将数据转换成16进制的格式才可以由modelsim直接读取。具体可以matlab里使用dec2hex语句进展转换。图4.6 matlba命令将数据导出到txt中3) 用Verilog编写滤波器模块由于Verilog是一种行为描述语言,所以用来描述FIR的结构是很方便的,其关键程序就是有符号小数的乘法处理模块。为了方便后续的仿真,整一个FIR滤波器程序可以分为两个局部:FIR滤波器主程序以与有符号小数的乘法模块。2FIR滤波器主程序:其主程序的变量定义如下: 图4.7 主程序变量其中输入数据和滤波器的抽头系数,都是16位

11、,所以相加结果仍然是16位。相乘的结果用32位表示。为了防止相乘再相加后数据的溢出,我们在这里把存放相乘再相加的结果扩大了2位,用到34位,然后最后的输出,在原来的根底上再扩大1位,35位的输出。在最后的输出中,可以把低位去掉,只保存假如干高位,但这里只需要仿真出结果便可,所以没有进展截断处理,然而在实际工程中,由于数位的限制,还是要注意这点。FIR主程序就是描述图2.2的FIR滤波器结构,其行为描述,具体可以用以下代码实现:其中x1x34通过前一个值对后一个值的赋值,可以实现移位操作;而s1s17是用来存放首位对称相加的结果;然后y1y17是乘法输出的结果,通过y1到y17的累加,最后输出到

12、结果out。其中乘法的运算,我们调用17次乘法模块因为线性FIR滤波器是对称结构,所以可以只进展34/2=17次的乘法运算。3乘法模块对于有符号的小数运算,在FPGA里面,其实是和有符号整数的运算是一样的。只是定点数的小数点的位置,我们需要牢记,在最后输出结果的时候,要适当的进展移位。由于负数在Verilog中是以补码形式保存的,所以在输入16位有符号数的时候,在进展相乘之前,要把负数变为原码再相乘,而正数的补码就是其本身,所以不用转换。然后把符号位提出来,进展异或运算,得到输出的符号位,再把有效数位的原码进展相乘,最后得到1位符号位和30位相乘结果。为了补全32位,可以在最低位加上一个无关位

13、0。最终输出如果是负数,还需要把它变成补码的形式输出。至此,一个有符号的小数乘法运算就完成了。根据以上思路,我们可以写出出乘法模块的代码:5. 分析验证设计好以上模块后,可以进展编译综合了。最后的编译综合结果如如下图所示:图5.1 编译结果从上图可以看出,最后编译成功,程序设计没有语法错误。但具体要测试其工作是否正常,我们接下来,就需要用到modelsim对其进展仿真。我们要写testbench文件,就需要三个输入,一个输出。其中一个输入是时钟,一个复位信号,还有随时钟变化的地址输入和最后的输出。根据此可以写出测试文件:由于最后输出的数是补码,为了能在modelsim的下方报告栏能显示出正常的

14、十进制负数,我们定义了一个有符号存放器out1,然后通过$display命令把结果按照时钟一个个输出到报告栏里。仿真得到的波形和结果如如下图所示:图5.2modelsim仿真波形Modelsim会自动把滤波完毕的数据写入到一个fir_result文件中去用于matlab绘图。图5.3 modelsim产生的输出文件可以看到数据中出现了很多2147xxxxxx的数,这些数其实是补码的的十进制形式。运算的过程中出现的bug,暂时还没法解决。但是可以用matlab将数据变成正常的形式。只要执行下面命令即可解决:由于我们没有对输出的35位数据进展截断处理,所以在最后的输出结果,我们要处以223。这是因为两个Q11的小数相乘,其小数位扩大了11位,变成了22位;然后加上1位的无关位,所以最后输出要处以2的23次方。最后得出滤波器仿真的波形和matlab产生的结果进展比拟:图5.4 modelsim输出的波形和matlab仿真的波形比拟由于滤波器参数设置有精度上的限制。而且前几个数据会有无效数据。但仍可以看得出,modelsim的输出波形是和matlab的输出波形一致的,可以确定滤波器正常工作,达到了预期的效果。6. 设计总结 /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号