如发现有乱码,
请直接从这里浏览原文
正文摘录:刘峰:I。R滤波器直接Ⅱ型塑垦逼童选出基婴嗽)一器式中D(z)是式(2)传输函数的分母多项式,因此,y(驯可以写为:y(z)一型掣一N(z)x(z)一U(z)(6。+b12。+b:z。+…+bNz“)(3)X(2)可以写成:X(z)一U(z)D(z)一U(z)(1+口12一。+n2z-2+…+口Ng“)(4)对式(4)做z的逆变换,可得:z(心)一“(”)+。l“(行一1)+n2“(行一2)+…+口NU(1“l—N)(5)又可得:“(刀)一Lr(”)一n1“(行一1)一n2M(卵一2)一…一nNM(”一N)(6)对式(3)做z的逆变换,可得:v(”)__b。H(”)+b1“(”一1)+b2M(”一2)+…+bNU(72一N)(7)其实现结构如图1所示,u(n一1),u(n一2),…的初始值设为0。利用式(6),式(7)就可以实现对数据的滤波计算,而且只需要一组数据缓冲区,计算非常便利。一图1I。R数字滤波器的直接1I型实现3基于循环缓冲区的优化方法通过分析式(6),式(7)的具体实现过程可以发现,其计算量主要分为两部分,卷积运算和移位,即在一个数据点计算完成后,新的数据点到来,就需要将缓冲区的数据进行移位,以进行新的计算,文献[1,2]即是采用这种移位的方法。在实际计算中,对数据缓冲区进行移位需要耗费相当多的CPU时间,基于此,本文提出使用循环缓冲区来减少移位操作,如图2所示,设置一个一维数组作为数据缓冲区,在计算完一个数据点后,只需要向前移动一个位置便可以继续下一个数据点的计算,已经过时的数据点被自动废弃,这样可以减少移动数据所需的CPU时间。基于可移植性的考虑,本文采用C语言来实现。根据《数据结构》,循环缓冲区可用带指针的结构体来实现,但应用在此处计算量与存储空间要求较高。本文给出一种10更简洁的方法:由于这里使用的缓冲区是固定大小的一维数组,因此对循环缓冲区的寻址可以转化为对数组求模(余数)运算。设作为缓冲区的一维数组为xEN],进行循环移位后用于卷积计算的数组为z’[N],那么问题的要点是怎样将两者对应起来。设置一个整数值flag来表示循环移位的标志,则移位后,缓冲数组的起始点为T’[0]一z[flag],则对应的丁’[走]一z[(flag+”)%N],其中,n为计算卷积的循环变量,如图3所示,这样就将z[N]和z’IN]对应起来。图2使用循环缓冲区可以减少数据的移位操作J[kl=x[(flag+月)%~1————+虹0】缸1】▲。I‘’J爿Ⅳflagl图3利用余数在数组上实现循环缓冲区寻址图3可以看出,以循环移位标志flag为起点,数组下标的增长方向与原数组方向一致,这是为了避免对负数求余,但与卷积运算相冲突,因此,在具体实现时,循环移位标志flag应当是递减的。下面给出实现对数据块进行滤波的I。R滤波器直接Ⅱ型C语言源代码:typedeffloatmytype;/*使用自定义类型可以适合浮点和定点数据类型*//*滤波器系数*/mytypebEM]一{由matlab计算得到的系数b};rflytypeaEM]一(由matlab计算得到的系数a,aEO]一1);/*缓冲区,初始化为0*/mytypeu[M];voidI。R(s,length,b,a,u,N)mytypes口;intlength;mytypebE],al-],u口;intN;{inti,n,flag=0;/*flag用于循环缓冲区标志*/mytypeyn;/*用于存储临时计算结果*/for(i一0;i<length;i++){yn=sEi];for(n一1;n<N;n++){yn--一a[n]*u[(flag+n)%N];(下转第13页)
阅读此文(图):
在线翻阅