作为一个说明性的例子,我们将给你展示一个执行简单的低通FIR滤波器的程序,FIR滤波器提供一个与本书第3章中已经讨论过的滤波器相类似的输出结果。然而,这种方法将使用基于帧的处理来获得我们的输出。显然,以这样的一种方式我们就会避免上面讨论的“边沿”问题。在读下面的程序清单之前,你可以回过头来看一下图7.1。
这个执行基于帧的C语言程序代码在本书CD中第7章的ccs\FiltFrame子目录下。仔细检查此目录中的全部程序代码清单,确保理解这个程序的全部工作[28]。这里我们仅仅指出一些关键部分。下面的讨论假定你已经读了并且熟悉本书第6章中给出的基于帧处理的这些说明。
实际上,你将使用Matlab或者一些其他的滤波器设计程序来确定你的滤波器系数。为了容易使用,FIR滤波器的系数通过Matlab中的滤波器设计工具产生,你能用这个名为fir_dump2c.m的文件。这个文件位于本书CD中附录E(另一个IIR滤波器使用的脚本文件也在这个目录中)中的MatlabExports目录下。如本书第3章中讨论的那样,这个脚本文件需要通过你的C程序生成两个文件,典型的命名为coeff.h和coeff.c。这些文件定义了“N”,代表滤波器的阶数,“B[N+1]”代表滤波器系数矩阵。
我们提供的程序利用DSK板的EDMA功能。这个C语言的程序代码和本书第6章中描述的基于帧的C语言程序代码几乎是一样的。惟一的不同是在你的工程中必须包含coeff.h和coeff.c文件,并且这个变化用下面的ISRs.c文件中的Process-Buffer()程序说明了。coeff.h和coeff.c文件的内容在本书第3章中已经讨论过了。ProcessBuffer()程序的源程序代码如下。
程序清单7.1:使用基于帧的FIR滤波器程序ProcessBuffer()
(www.daowen.com)
区别于本书第6章中的EDMA代码的主要部分:
●第6、7行:声明这个矩阵包含“BUFFER_COUNT+N个元素”,为需要保留的边沿值留有足够的空间;
●第13、14行:扩展指针便于增加数据,避免与上一帧的边沿数据发生覆盖;
●第33~36行:应用不同的矩阵索引值,直到使用合适的卷积穿过这个帧;
●第45~48行:复制当前帧的边沿值到缓存的起始处,当下一帧数据来的时候,这些数据将是可用的。
现在你理解了这段代码,回到前面并且复制所有的文件到一个单独的目录。如果你希望使用Matlab设计你自己的滤波器而不是使用提供的滤波器(一个简单的低通滤波器),使用脚本文件fir_dump2c.m。这个文件在本书CD中附录E的mat-labexports目录下,并且在本书第3章中首次进行了讨论。处理之前,复制一个新的coeff.h和coeff.c文件放到你的工程目录中。准备好以后,在CCS中打开这个工程,并且运行重构(“Rebuild All”)。一旦构建完成,加载(“Load Program”)程序到DSK板并且单击运行(“run”)。你的基于帧的FIR滤波器就会在DSK上运行。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。