利用DSP实现IIR滤波器的精度扩展
STL A,*AR3+
STM #2,AR0 ;初始化Arn是地址偏移量为常数
INLOOP:
STM #d+5,AR3 ;AR3:d(n),d(n-1),d(n-2)
STM #table,AR4 ;AR4:IIR的系数A2,A1,B2,B1,B0
PORTR 100H,*AR1 ;从端口读入数据
LD *AR1,7,A
STM #N-1,BRC ;计算IIR的节数N
RPT ELOOP
LOOP:
********反馈通道**************
MAC *AR4+,*AR3-,A ;input+d(n-2)*A2
MAC *AR4,*AR3,A-;input+d(n-2)*A2+d(n-1)*A1
MAC *AR4+,*AR3-,A
STH A,*AR3+0;d(n)=input+d(n-2)*A2+d
(n-1)*A1
********前向通道*************
MPY *AR4+,*AR3-,A ;d(n-2)*B2
MAC *AR4+,*AR3,A;d(n-2)*B2+d(n-1)*B1
DELAY *AR3- ;d(n-2)=d(n-1)
MAC *AR4+,*AR3,A;d(n-2)*B2+d(n-1)*B1+d(n)*B0
DELAY *AR3-;d(n-1)=d(n)
ELOOP:
STH A,*AR2;output=d(n-2)*B2+d(n-1)*B1+d(n)*B0
PORTW *AR2,200h ;将结果写入文件中
BINLOOP ;计算下一个输出
3 均衡器用扩展精度IIR滤波器的编程实现
IIR滤波器的一个典型应用,就是用作均衡器。在级联型的结构中,可以用极点和零点配对的方法,把共轭的零、极点或相近的零、极点组合在一个二阶滤波器中,这对于降低有限字长系数的敏感程度十分有效。另外,交换级联次序也是减少有限字长效应的一个行之有效的方法。本文给出用二阶级联扩展精度IIR滤波器实现时域均衡器的程序。
本程序中使用了一个循环缓冲区用来存放数据,要求计算出的系数均循在-12~12dB。为了防止溢出,使最大增益为4,通常要结果右移2bit(相当于结果除4)。这样就范围变成了-24~0dB(因为20log(1/4)=-12dB)。每个滤波器的通带频率集中在某个比较感兴趣的频率段。滤波器系数的绝对值可能比1大。当用Q15格式表示时,必须除2的整次幂来满足限定的范围[-1,1~2 -15]。所以系数在存入存储器之前要右移,那么与此对应的在存入每个滤波器输出系数时要左移。32×32bit直接II型的级联结构运算量如下:周期数为29,RAM为16字。寄存器数为6。
系数缓冲区和数据缓冲区的长度不同,且仅数据缓冲
《利用DSP实现IIR滤波器的精度扩展(第3页)》