ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:373.50KB ,
资源ID:11586509      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11586509.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于matlab和FPGA联合仿真的FIR低通滤波器设计报告.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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

2、如下形式:根据差分方程直接画出FIR滤波器的结构,称为直接型结构。如图所示:图2.1 FIR滤波器直接结构FIR滤波器的特点:单位脉冲响应序列为有限个;可快速实现;可得到线性相位;滤波器阶数较高。对线性时不变系统保持线性相位的条件是:单位脉冲响应为偶对称或奇对称。即:为设计线性滤波器,应保证h(n)为对称的。1)若N为偶数,其线性相位FIR滤波器的对称结构流图:图2.2 若N为偶数线性相位FIR滤波器的对称结构流图图中:“ +1 ” 对应偶对称情况,“ -1 ” 对应奇对称情况。当n为奇数时,最后一个支路断开。2)若N为奇数,其线性相位FIR滤波器的对称结构流图:图2.3 N为奇数线性相位FI

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

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

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

6、域和频域特性,由于采样频率是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.

7、00177109377529917 0.00203379258009801 -0.000494245608574501 -0.00334465059858481 0.00754651554336203 -0.00762305727075547 -0.000283837333217598 0.0145004055957633.025*.020* 0.00783243571565760 -0.0501058634318108.0793* -0.0569389948191050 -0.0682155069417655 0.581926527408550 0.581926527408550 -0.06

8、82155069417655 -0.0569389948191050.0793* -0.0501058634318108 0.00783243571565760.020*.025* 0.0145004055957633 -0.000283837333217598 -0.00762305727075547 0.00754651554336203 -0.00334465059858481 -0.000494245608574501 0.00203379258009801 -0.00177109377529917 0.000780227960895479由于FPGA不支持浮点数的运算,所以我们采用定

9、点数的格式来量化抽头系数。对于16位的输入数据,我们这里采用Q11的定点小数格式,即11位小数位,4位整数位,1位符号位。将抽头系数乘以211可得:hn= 1 -3 4 -1 -6 15 -15 0 29 -52 41 16 -102 162 -116 -139 1191 1191 -139 -116 162 -102 16 41 -52 29 0 -15 15 -6 -1 4 -3 1这样我们就得到了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滤波器主程序以及有符号小数的乘法模块。(2)FIR滤波器主程序:其主程序的变量定义如下: 图4.7 主程序

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

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

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

14、码,为了能在modelsim的下方报告栏能显示出正常的十进制负数,我们定义了一个有符号寄存器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. 设计总结

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

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