第1步我们将检查FIR滤波器应用代码,这个代码使用了C语言的平滑方法,和最后的Matlab例子相类似。第一个应用的目的是易懂,这是以损失效率为代价的。
这个实际应用在本书第3章的ccs\FIRrevA目录下。最有兴趣的主要文件是ISRs.c,它包含中断服务程序。这个文件包含了必要的变量声明和实际的FIR滤波运算。考虑到立体声编解码的使用(比如基本的C6713编解码,基于C6711的PCM3006子卡编解码等),这个程序使用了独立的左右声道滤波器。然而,为清楚起见,在下面只讨论左声道。在这个代码例子中,“N”是滤波器的阶数,“B”保存了滤波器的系数矩阵,这个“xLeft”矩阵包含了当前的输入值“x[0]”和过去的输入值(“x[-1]”、“x[-2”]和“x[-3]”)。这个可变的“yLeft”是滤波器当前的输出值“y[0]”。在这个循环中这个整数“i”用作一个索引计数器。
程序清单3.3:平滑FIR滤波器声明
下面所示的代码执行了实际的滤波器运算。在输入中断服务程序中程序指令从ADC的寄存器转移采样值到CodecDateIn.Channel[LEFT]中,这里没有显示在输出中断服务程序中从CodecDateOut.Channel[LEFT]转移数据到DAC寄存器中。在滤波器运算中涉及的5个主要步骤将在下面的代码清单中讨论。
程序清单3.4:实时的FIR平滑滤波
在FIR平滑滤波运算中涉及的5个实时步骤
程序清单3.4的解释如下。
(1)(第2行):来自于编解码器的ADC端的多数的当前采样值被分配到当前的输入矩阵元素“xLeft[0]”中。(www.xing528.com)
(2)(第3行):滤波器的当前的输出值名为“yLeft”。因为这个相同的变量将被用于计算滤波器的每一个输出值中,它必须在每一个点乘执行之前被重新设置为0值。
(3)(第5~7行):这3行代码执行“x”和“B”的点乘。等效运算是yLeft=xLeft[0]B[0]+xLeft[-1]B[1]+xLeft[-2]B[2]+xLeft[-3]B[3]
(4)(第9~11行):这3行代码把矩阵“x”中的所有元素值右移一次。等效运算是
右移完成以后,下一个要到达的采样值,“x(0)”能被无信息损失地写入到“xLeft[0]”存储器位置中。注意,尽管“xLeft[3]”被“xLeft[2]”重写。可以预料运算“xLeft[3]”→“xLeft[4]”等应该被执行,但是这里没有“xLeft[4]”或者更高的元素,因为“xLeft”只包含了4个元素。总之,这个“旧的”“xLeft[3]”不再需要并且因而被重写。
(5)(第13行):这行代码完成了滤波运算通过转移点乘的结果“yLeft”到CodecDateOut.Channel[LEFT]变量,通过发送中断服务程序转移CodecDate-Out.Channel[LEFT]到编解码器的DAC端。
现在你理解了这段代码,让我们继续,将所有文件复制到一个独立的文件夹。在CCS中打开这个工程,重新编译所有的文件。一旦编译完成,将程序加载到DSK中,单击运行。你的FIR LP滤波器现在正在DSK上运行。记住这个程序一般用于音频滤波,所以观察滤波效果的好方式是听一下滤波前和滤波后的音乐[11]。图3.15所示为一种同时接听原始的(未进行滤波处理)音乐和滤波处理后音乐的方法。这一方法需要第二套扬声器,但它比只使用一套扬声器更为方便。记住,这个DSK板或者增强的编解码器对DSK板是可用的,但不包含用于驱动连接负载的功率放大器。最好的结果是,在你的DSK板上使用带有功放的扬声器(比如用于PC的功率扬声器)。
图3.15 接听滤波前和滤波后音频信号的一种方法
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。