基于FPGA与MATLAB的IIR滤波器设计与实现

http://blog.sina.com.cn/s/blog_139b6f6130102whcx.html
一、 IIR滤波器理论基础
IIR 滤波器,即无限脉冲响应滤波器,其单位脉冲响应是无限长的,其系统传递函数为

 

基于FPGA与MATLAB的IIR滤波器设计与实现_第1张图片

系统的差分方程可以写成

基于FPGA与MATLAB的IIR滤波器设计与实现_第2张图片

二、IIR滤波器的设计方法
一般来讲, IIR 滤波器的设计方法可以分为三种:原型转换设计方法、直接设计法、以及调用 MATLAB IIR 函数设计。前两种方法都比较麻烦,需要更大的滤波器基础理论知识,因此实际中多采用直接调用 MATLAB IIR 函数进行设计。

 


 

三、IIR滤波器的MATLAB设计
一是使用MATLAB提供的IIR滤波器函数。
二是直接调用FDTOOL工具设计
以调用 Butter 函数为例子
基于FPGA与MATLAB的IIR滤波器设计与实现_第3张图片
滤波后的数据

基于FPGA与MATLAB的IIR滤波器设计与实现_第4张图片


四、IIR滤波器的FPGA实现

IIR滤波器的两种最基本、使用最为广泛的实现结构——直接型及级联型结构。虽然级联型结构比直接型结构更准确,受参数量化影响较少,但设计起来更负责,所以本设计采用直接型结构。

1.量化直接型结构的IIR滤波器系数

MATLAB输入

[Bb Ba]=butter(N,Wn,'low');   

可以看到滤波器系数向量

Ba=[1 -1.79158135278860 2.53189988089812 -2.11822942034193 1.37075629439323 -0.6090389130764730.199331556962956 -0.0431047310152813 0.00580426165430880 -0.000355580604257623]

Bb=[0.00106539452359780 0.00958855071238024 0.0383542028495210 0.08949313998221560.134239709973323 0.134239709973323 0.0894931399822156 0.0383542028495210 0.009588550712380240.00106539452359780]

MATLAB输入

Qb = round(Bb*2^9);

Qa = round(Ba*2^9);

可以看到量化后滤波器系数向量

Qa=[512 -917 1296 -1085 702 -312 102 -22 3 0]

Qb=[1 5 20 46 69 69 46 20 5 1]

根据IIR滤波器系统函数,可以直接写出滤波器的差分方程为

基于FPGA与MATLAB的IIR滤波器设计与实现_第5张图片


4.1.直接型结构的FPGA实现

根据滤波器的差分方程可以把方程分开零点系数和极点系数两部分组成,

基于FPGA与MATLAB的IIR滤波器设计与实现_第6张图片

基于FPGA与MATLAB的IIR滤波器设计与实现_第7张图片

基于FPGA与MATLAB的IIR滤波器设计与实现_第8张图片

4.2零点系数的FPGA实现

基于FPGA与MATLAB的IIR滤波器设计与实现_第9张图片
4.3 极点系数的 FPGA 实现

 

基于FPGA与MATLAB的IIR滤波器设计与实现_第10张图片

4.4 顶层模块实现
基于FPGA与MATLAB的IIR滤波器设计与实现_第11张图片

4.5 直接型结构的 FPGA 实现后的测试仿真

 

基于FPGA与MATLAB的IIR滤波器设计与实现_第12张图片

五、实验结果与分析

基于FPGA与MATLAB的IIR滤波器设计与实现_第13张图片

基于FPGA与MATLAB的IIR滤波器设计与实现_第14张图片

从图中可以明显看出,FPGA滤波后的信号几乎接近原始信号,有效地滤除了叠加信号中250hz的高频信号,还原了10hz的低频信号,说明该设计正确,达到设计要求。

六、总结

IIR滤波器因具有较高的滤波效率,十分有利于在不需要 严格线性相位特性的系统中使用,IIR滤波器的FPGA实现相对FIR滤波器来讲要复杂一些,主要原因在于其反馈结构。实现过程中需要注意的诸如系数量化方法、计算输出数据位宽、MATLAB仿真及FPGA实现等关键问题。

你可能感兴趣的:(语音识别)