数字滤波器的MATLAB设计与DSP上的实现
因为在用定点DSP实现时,所有的数据都是定长的,运算也都是定点运算,因而会产生有限字长效应。所产生的误差主要包括:数模转换引起的量化误差、系数量化引起的误差以及运算过程中的舍入误差。在用定点DSP时,产生误差是不能避免的,但是可以通过一些方法减小误差。如,可以用两个存储单元来表示一个数,运算时使用双字运算;可以根据需要要将滤波器系数都用双字表示,也可以只将一半的系数用双字表示,视需要而定。另外,FIR数字滤波器和IIR数字滤波器所引入的量化误差是不一样的。FIR数字滤波器主要采用非递归结构,因而在有限精度的运算中都是稳定的;而IIR数字滤波器是递归结构,极点必须在z平面单位圆内才能稳定,这种结构运算中的四舍五入处理有时会引起寄生振荡。除了有限字长效应以外,不同结构引入的误差也有所不同。在实际设计中,要注意实现中的误差问题。在选择不同的结构时,应考虑它们所引入的误差,并用高级语言进行定点仿真,以比较不同结构下误差的大小,从而作出合理选择。
3.3 循环寻址
循环寻址(circular addressing)是DSP中经常用到的一种寻址方式。该寻址方法可以对一块特定存储区实现循环的操作。可以把循环寻址理解为实现一个滑动窗,新数据引入后将覆盖老的数据,便得该窗中包含了需处理的最新数据。在数字信号处理中的FIR、卷积等运算中,循环寻址具有极其重要的意义。
在TI的DSP中,循环寻址通过如下方法实现。
①设定BK(寄存器块大小)值,以确定循环寻址缓冲区的大小,也可将它看作是循环的周期。
②设定缓冲区的底部地址。必须注意:其低N位为零,其中N为满足式(1)的最小N值。
2 N>BK (1)
③用辅助寄存器间接寻址循环缓冲区。
图2 输入数据频谱图 图3 输出数据频谱图
3.4 实现举例
根据上述设计出来的FIR滤波器,考虑工程实际的需要(精度的要求)和采用定点DSP芯片的方便实现,选择Q15定标。为此,必须对输入数据和滤波器的系数进行归一化处理。输入数据的归一化处理可通过设置A/D转换的参考电平来实现。滤波器的系数归一化只要求取系数中的最大值,再用这个最大值去系数便可。
由于一个N(设N为偶数)阶的FIR滤波器具有系数对称特性,其输出方程可以写为:
y(n)=ao[x(n)+x(n-N+1)]+a1[x(n-1)+x(n-N+2)]+…+aN/2-1[X(n-N/2+1)+x(n-N/2)] (2)
根据式(2)可建立如下实现算法:
①在数据存储中开辟两个循环缓冲区,New循环缓冲区存放新数据,O1d循环缓冲区中存放老数据。循环缓冲区的长度为N/2。
②设置循环缓冲区指针,AR2指向New缓冲区中最新的数据,AR3指向O1d缓冲区中最老的数据。
③在程序存储器中设置系数表。
④(AR2)+(AR3)→AH(累加器A的高位);(AR2)-1→AR2;(AR3)-1→AR3。
⑤将累加器B清零,重复执行下列操作N/2次:(AH)*系数ai+(B)→B,系数指针(PAR)加1,(AR2)+(AR3)→AH,AR2和AR3减1。
⑥保存和输出结果(结果在BH中)。
⑦修正数据指针,让AR2和AR3分别指向New缓冲区最新数据和O1d缓冲区中最老的数据。
⑧用New缓冲区中最老的数据替代O1d缓冲区中最老的数据。O1d缓冲区指针减1。
⑨输入一个新数据替代New缓冲区中最老的数据。
重复执行第④~⑨步。
根据上述算法编制程序[4、5],在CCS5000上进行仿真调试
《数字滤波器的MATLAB设计与DSP上的实现(第3页)》