iir数字滤波器的设计实验,iir和fir数字滤波器的比较
该作品是2007年全国电子设计大赛d的主题,主题要求如下
这个东西的目的是制作截止(中心)频率可变、通带类型可变(低通、高通)的可编程滤波器。 大二前期我用运算放大器实现过这个功能,这次我打算学习实现数字滤波器,顺便再做一次可编程滤波器的主题。
实现数字滤波器可以使用单片机或FPGA,但一开始毫无头绪,不知道用什么,所以打算一边制作一边看。
一开始就喜欢IIR (无限脉冲响应)滤波器。 为什么这么说呢,因为有、传递函数,所以设计方法和模拟滤波器很相似,比较熟悉。
我在网上找了两天资料。 看了SystemView,DSPBuilder,发现还是手写代码好。 然后,看了matlab的simulink,打算先用simulink模拟,看看效果,找找,费了两天劲。 因此,有以下内容。
图1、simulink的模拟图、串联型、并联型进行了尝试,发现还是串联更容易使用
图2、仿真结果完美实现预期要求,
于是,我开始用c语言按照这个simulink的结构图进行模拟,结果、效果很好,于是我开始写FPGA代码
图3,modelsim模拟结果
图4、仿真的各种数据、调试的工作量大部分是将其中的数据与c语言仿真的数据进行比较,看哪一步出了问题,然后修改,最后修改,几百万的仿真数据和c语言仿真
图5,quartus最后集成的框图
图6、signalTab模拟、同样,与c语言模拟结果一模一样的
图7、滤波器的内部结构图、滤波器的系数都存储在RAM中,FPGA滤波器计算时从RAM读取系数,单片机通过SPI接口修改RAM中的数据,达到程序控制功能。
FGA完成,成为单片机的一部分。 FPGA实现了可以变更滤波器各级系数的功能,系数来自哪里? 一开始是查找表。 要实现例如低通、截止频率1Khz、2Khz这两种滤波器,matlab会生成这两种滤波器的系数并存储在单片机中,这显然很不方便。 于是大学二年级寒假后,写了IIR过滤器设计函数库。 根据滤波指标可以直接生成lcdc、自觉可乐型、自觉可乐型滤波系数,从而方便了。 该函数库可以实现100阶以内的lcdc、自觉可乐I型、自觉可乐II型滤波系数的生成,通带类型可以实现高通、低通、带通、带阻。
图8、3个函数分别能够生成lcdc、自觉可乐I型、自觉可乐II型滤波系数
图9、约束滤波器指标的结构体
图10,利用这个代码库和C# WPF,仿照matlab的过滤器设计器写了小工具。 实现了过滤器设计器的一部分功能,也可以生成matlab验证码。 图中右侧是与小工具生成系数对应的数字滤波器的振幅特性和相位特性。
图11,代码一部分
结束了