下面是镶边的Matlab代码,这段代码实现如图10.11所示的滤波器。输入变量为x(输入矢量),t(最大延迟,单位为s),α(前馈系数),f0(变化频率延迟时间)和FS(采样频率)。除时间延迟是正弦变化的以外,这个程序与程序清单10.2很类似。
程序清单10.7:一个Matlab镶边的例子
(www.xing528.com)
注意,第7~10行产生β[n],这是一个按正弦改变的整数阵列,范围为0~R,用作延迟值。可以用很多方法利用β[n]使循环缓冲器的索引指向正确延迟量的值。上面程序中,我们使用的技术很简单,由此可见滤波器操作和程序清单10.2的梳状滤波器不同。第18行确定需要调整循环缓冲器索引的多少个位置(与表10.2的梳状滤波器相比)才能表示变量延迟。例如,对于特定n,如果β[n]=R,那么第18行计算的偏移为R-R=0,第22行计算的索引值就与程序清单10.2中所用的索引值相同,这样得到的延迟为R。在另一端,如果β[n]=0,那么第18行计算的偏移为R-0=R,第22行计算的索引值就是把循环滤波器“绕回”当前采样,这样得到的延迟为0。因而,滤波器使用按正弦变化的延迟,这是镶边所需要的。
上面的程序清单10.7中,β[n]的长度和输入矢量一样,这样比较简单。转变到实时C语言代码时,这样做是不切实际的。这是因为我们并不能预测要处理多少个输入采样,而且不希望使用那么长的阵列。如何克服这个问题呢?可以用一个单独的循环缓冲器实现β[n](具有自己的索引变量),缓冲器的值为按正弦变化的0~R中的值。这个缓冲器有多长呢?β[n]中需要存储的值不需要大于一个正弦周期。稍微一想就明白了,因为一个正弦周期有FS/f0个元素。例如,如果采样频率是48kHz,延迟变化的频率是0.5Hz(记住f0通常是很低频率的),那么β[n]就有96000个元素。可以利用技术将这个值减小到FS/f0的1/2或1/4,读者自己可以研究一下。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。