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

来源:互联网 发布:剑三盾萝捏脸数据 编辑:程序博客网 时间:2024/04/27 14:15
http://blog.sina.com.cn/s/blog_139b6f6130102whcx.html
一、IIR滤波器理论基础
IIR滤波器,即无限脉冲响应滤波器,其单位脉冲响应是无限长的,其系统传递函数为

 

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

系统的差分方程可以写成

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

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

 


 

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

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


四、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滤波器设计与实现


4.1.直接型结构的FPGA实现

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

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

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

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

4.2零点系数的FPGA实现

基于FPGA与MATLAB的IIR滤波器设计与实现
4.3极点系数的FPGA实现

 

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

4.4顶层模块实现
基于FPGA与MATLAB的IIR滤波器设计与实现

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

 

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

五、实验结果与分析

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

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

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

六、总结

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

0 0
原创粉丝点击