FIR低通滤波器设计报告
1. 设计内容
本设计是基于FPGA的一个FIR低通滤波器设计,给定一段有高频干扰的信号Hnoise.wav,要求使用matlab设计出一个低通滤波器滤除其干扰频率,并取出10000到10160点进行时频分析。然后使用verilog语言编写出滤波器,联合modelsim进行编译仿真,并将结果与matlab结果进行对比。
2. 设计原理
FIR滤波器响应(简称FIR)系统的单位脉冲响应h(n)为有限长序列,系统函数H(z) 在有限z平面上不存在极点,其运算结构中不存在反馈支路,即没有环路。如果h(n)的长度为N,则它的系统函数和差分方程一般具有如下形式:
H(z)??h(n)z?n
n?0N?1y(n)??h(m)x(n?m)
m?0N?1根据差分方程直接画出FIR滤波器的结构,称为直接型结构。如图所示:
图2.1 FIR滤波器直接结构
FIR滤波器的特点:单位脉冲响应序列为有限个;可快速实现;可得到线性相位;滤波器阶数较高。对线性时不变系统保持线性相位的条件是:单位脉冲响应为偶对称或奇对称。即:
为设计线性滤波器,应保证h(n)为对称的。
1)若N为偶数,其线性相位FIR滤波器的对称结构流图:
图2.2 若N为偶数线性相位FIR滤波器的对称结构流图
图中:“ +1 ” 对应偶对称情况,“ -1 ” 对应奇对称情况。当n为奇数时,最后一个支路断开。
2)若N为奇数,其线性相位FIR滤波器的对称结构流图:
图2.3 N为奇数线性相位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 滤波前的时域图