如前面论述的一样,所有的矩阵x中的元素值在每一个点乘运算后右移。这是一个关于DSK板的计算资源的非常低效率的使用。需要进行移位是基于假设物理存储器是线性的。假如是线性存储器,每一个存储器地址有固有的静态标记,值的移位是绝对需要的。
图3.16所示为滤波器输入的一个线性存储器模型。与期望的一样,在矩阵“x”中存储了“N+1”个元素,存储器的标号为“x[0]、x[-1]、…、x[-N]”,而且还有一个“x[-(N+1)]”。然而,这个地址没有被声明,它是物理存在的。声明以后,任何试图进入矩阵x越界将会导致一些声明被收回并且在随后的计算中使用。
图3.16 具有静态存储器位置标号的线性存储器概念
这样的索引错误也许是灾难性的(比如,一个运行时间的错误),或者是难以分析的(如程序运行但给出了错误的结果)。无论如何,这类索引错误必须花很大代价来避免。
一个另类的线性存储器是环形存储器。如图3.17所示,这个环形存储器的概念覆盖在“x[-N]”的“后面的”位置返回到存储器位置“x[0]”。因为这个环形存储器的目的是存储或者缓存矩阵x。这个常规的概念是指环形缓存。
如果要取代使用静态存储器位置标号,一个指针能被用于指向和插入刚刚到达的最新的采样,“x[0]”进入到包含不再需要的最早的采样值“x[-N]”,这样一个循环缓存就生成了。不需要移位矩阵x的值,因为指针总是指向最新的采样值。如前面所指,缓存中最旧的采样值被最新的采样值取代。这个过程可以无限期继续。插入下一个采样值到缓存中的结果如图3.18所示。
图3.17 具有静态存储器位置标号的环形缓存概念(www.daowen.com)
图3.18 具有动态存储器位置标号的环形缓存概念,图3.17后的采样时刻
为了使用这个环形缓存,一个对于矩阵xLeft的指针必须建立起来。生成这个指针需要的代码如下。
环形缓存FIR滤波器的代码如下,从代码可以了解其算法。
程序清单3.6:使用环形缓存的FIR滤波器
运行这个应用程序所需的文件在本书CD中第3章的ccs\FIRrevD目录中[13]。继续复制全部文件到一个独立的目录中。在CCS中打开这个工程并且“编译连接”。一旦编译完成,“加载”程序到DSK板并且单击“运行”按钮。你的FIR滤波器就运行在DSK板上。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。