您的位置:首页 > 编程语言 > MATLAB

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

2016-06-07 16:38 597 查看
http://blog.sina.com.cn/s/blog_139b6f6130102whcx.html

一、IIR滤波器理论基础

IIR滤波器,即无限脉冲响应滤波器,其单位脉冲响应是无限长的,其系统传递函数为

 





系统的差分方程可以写成




二、IIR滤波器的设计方法

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

 

 

三、IIR滤波器的MATLAB设计

一是使用MATLAB提供的IIR滤波器函数。

二是直接调用FDTOOL工具设计

以调用Butter函数为例子





滤波后的数据





四、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滤波器系统函数,可以直接写出滤波器的差分方程为





4.1.直接型结构的FPGA实现

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













4.2零点系数的FPGA实现





4.3极点系数的FPGA实现

 




4.4顶层模块实现





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

 




五、实验结果与分析









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

六、总结

IIR滤波器因具有较高的滤波效率,十分有利于在不需要 严格线性相位特性的系统中使用,IIR滤波器的FPGA实现相对FIR滤波器来讲要复杂一些,主要原因在于其反馈结构。实现过程中需要注意的诸如系数量化方法、计算输出数据位宽、MATLAB仿真及FPGA实现等关键问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: