使用低通滤波器扩展Karplus-Strong

时间:2009-12-12 20:11:20

标签: c# filter frequency

我已经实现了一个基本的Karplus-Strong算法 填充白噪声的Ringbuffer从前面输出样本并将前两个元素的平均值附加到末尾并删除第一个元素。最后重复步骤。

为了获得更好的结果并控制它们,我试图实现算法的扩展版本 因此,我需要一个像低通滤波器一样的频率滤波器来代替平均滤波器 我的平均滤波器有两个输入和一个输出:avg(a,b)=(a + b)/ 2

维基百科页面上的示例代码提供了与输入一样多的输出 http://en.wikipedia.org/wiki/Low-pass_filter

我找到了其他(数学)版本,如:
http://cnx.org/content/m15490/latest/
H(z)=(1+(1 / z))/ 2
我猜z是一个复数。

两个版本都有两个输入,但也有两个输出 如何从中获得一个有意义的值?
或者我是否必须重写算法的更大部分?
如果是这样的情况我可以找到一个很好的解释吗?

2 个答案:

答案 0 :(得分:2)

您的滤镜是有限脉冲响应滤镜的专业化。你使用moving average method来选择系数,使用N = 1.它已经是一个低通滤波器。

计算滤波器将其调谐到特定频率响应的系数和顺序涉及棘手的数学运算。如果移动平均线不适合您的账单,最好的办法是使用软件包计算系数。 Matlab是常用的选择,GNU Octave是一个开源选项。

答案 1 :(得分:0)

过滤器可以通过多种方式表达:

  1. 在复杂的平原上,你的例子H(z)=(1 +(1 / z))/ 2
  2. 作为过滤器,y[i] = h[0]*x[i] + h[1]*x[i-1] + h[2]*x[i-2] + ...
  3. 在频域中,Y [f] = H [f] * X [f]
  4. 其中第二个实际上是h和x数组的卷积。这也是最容易理解的。

    前面的答案解释了从何处开始构建过滤器。假设你有你的滤波器系数h',那么它只是对非负数滤波器进行求和。

    我相信我明白你在问什么。虽然您不需要多个输出。从维基百科页面看,Karplus-Strong字符串合成算法需要一个长度为L的缓冲区。如果我们有M个滤波器系数(h),它给出了表格的输出,

    y[i] = x[i] + h[0]*y[i-L] + h[1]*y[i-(L+1)] + h[2]*y[i-(L+2)] + ...

    来自here的Karplus-Strong合成使用环形缓冲区来保存最后的L个输出y[i-1],...,y[i-L]。这被初始化为x[i]的{​​{1}}噪音值;但是,i<=L i>L。由于您只存储L值,因此该算法将具有空间效率。 x[i]=0的信号x[i]刚刚添加到环形缓冲区中。

    最后,作为警告提示,如果您不小心系数i>L和输出h可能没有所需行为的值。