设计IIR滤波器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设计IIR滤波器
使用Matlab的FDAtool工具可以很方便地IIR设计滤波器。

使用File菜单中的export 选项可以把滤波器的参数输出到Matlab的工作空间中。

若滤波器为IIR型,则输出的变量名为G和SOS。

它把高阶的IIR滤波器转换为一系列二阶IIR滤波器的级联。

SOS为二阶IIR滤波器的参数,G为缩放系数。

计算IIR滤波器的输出的时候,先将输入数据乘以G,然后一一通过SOS中的每个IIR滤波器,就得到最终的结果了。

但是如果二阶IIR滤波器的程序只支持定点小数运算的话,那么就需要调整一下系数了。

因为设计出来的G有时候很小(不知道会不会很大),这样一旦把输入数据乘以G后,就会使得二阶IIR滤波器的输入过小,造成很大的误差。

我们需要把G分配到每个二阶IIR滤波器的系数中,使得每次得到的中间结果都刚好不会溢出。

若以IIRi表示第I个二阶IIR 滤波器的话,则我们需要保证IIR1, IIR1 * IIR2, IIR1 * IIR2 * IIR3, … 的频率响应都不超过0dB,*号表示级联。

为了使得输出的精度最好,我们还需要让上面这些滤波器的频率响应中的最大值最接近0dB。

我用Python写了个小程序来实现这样的计算,其中最重要的部分就是计算二阶IIR滤波器的频率响应,还好在网上找到了直接计算的公式,省去了不少麻烦。

【作者: 红岩若愚】【访问统计: 1562】【2006年01月6日星期五12:45】【加入博采】【打
印】Trackback
你可以使用这个链接引用该篇文章/blog/tb.b?dia ryID=4113371
博客手拉手
回复
请问一下应该怎么乘呀?
- 评论人:Jimmeny 2006-04-30 12:35:37
问题解决了,在调它的库的时候,IIR的系数一定要做到双精度字对齐
- 评论人:Jimmeny 2006-04-26 15:12:24
我用的是-O2的优化级别,146条指令是经过C编译器优化之后的结果的了,
之前我也用过DSPF_sp_biquad,2阶的时候是可以的,但记得级联之后的结果就完全不一样了,不知不是我的操作有误,我的系数也是用tf2sos转出来的,不过我会再试一下的,谢谢你啦:)到时我把结果你
另外我试了移频的算法,对抑制啸叫的效果确实不明显,我试过6HZ,12hz和24hz,基本上都不能避免一个问题就是有声音的时候难免有一种波浪声,好象是被调制过一样
,.
- 评论人:红岩若愚 2006-04-26 14:19:32
我曾做过6713的C语言程序的优化,按照TMS320C6000 Optimizing Compiler User&s Guid 介绍的办法优化一下速度能快不少。

不知道你设置的编译优化级别多少。

另外我看了一下6713的DS 其中单精度二次IIR, DSPF_sp_biquad,计算一个取样数据只需要4个时钟,因此减少到80条指应该没有问题。

另外,利用matlab的tf2sos函数可以把6阶的IIR转换为3个2阶的IIR级联,这样就可以直接DSPlib的函数了。

- 评论人:Jimmeny 2006-04-26 13:36:43
刚才写错了,是15万条,而不是15条啊.
我想了一下;我是48K采样的,两通道,数据量1S就是96K,,问题是我现在处理1个6阶的IIR需要条指令,另外每一短还要乘因子和搬数据,就是附加大概36条指令,96000*(110+36)*10=140M,而220M的DSP就已经超过一半的了.我现在是想办法把146条指令那里减少到80条左右,这个可能到优化汇编和多级流水线,这个我就感觉比较棘手的了
.
- 评论人:红岩若愚 2006-04-26 12:26:08
可能是我理解有误,不过按照你的数据,10个6阶IIR处理一个取样数据需要150个指令周期,不取样频率是多少,如果是44100的话,那么一秒钟就是:44100*150 = 6.615M个指令,这好像在资源不够的问题啊。

我现在做的是10个6阶的IIR滤波器,左右声道同时处理,用的是1300MIPS的6713,我是这样算的,一个DMA中断可以处理1024点的32位数据,共可以执行230万条单周期指令,做一段的阶EQ一共耗费了我15条指令的资源(左右声道同时处理时),10段下来就接近160万了,加上的资源开支,我的程序就有点提襟见肘的感觉了,我的IIR是用C来写的,优化得不好,我一直在寻一个做多阶IIR的浮点处理的汇编程序,也看了一下54X和55X里面的LIB SRC文件,不适合用在6上,现在还在头痛着,我想减少阶数,用2阶来做,这样就可以调6000LIB库的IIR了,但2阶的不陡,做好的EQ很难,所以我现在还在犹豫中。

- 评论人:红岩若愚 2006-04-24 14:54:35
你的意思是说10个二次IIR滤波器级联所需要的MIPS么,不知道你的程序具体用了多少MIPS,在做的一个项目芯片是5509A,32位的IIR滤波器,一个(左有声道一共)大概是3.3MIPS左右序是在DSPLIB的源程序基础上修改的。

不太清楚“多级流水线“ 是什么意思。

- 评论人:Jimmeny 2006-04-24 10:37:04
我在SPtool里面做的IIR滤波器,再导出到工作区,然后用tf2sos转换得出系数,这样得出来的系数在联直接2型的每级之间不需要做scale,省了不少运算量. 我将它用在Graphic EQ上,做个10段的都觉资源不够,多级流水线还不大会做,只用了DSP自己的优化,若愚能给我提点建议吗?。

相关文档
最新文档