2009-12-12 161 views
0

我实现了一个基本的Karplus-Strong算法。
充满白噪声的铃缓冲器从前面输出一个采样,并将前两个元素的平均值添加到末尾并删除第一个元素。重复上一步到步骤。用低通滤波器扩展Karplus-Strong

为了获得更好的结果并对它们进行控制,我尝试实现该算法的扩展版本。
因此,我不需要平均滤波器,而需要像低通滤波器那样的频率滤波器。
我的平均滤波器有两个输入和一个输出: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

您的过滤器是有限冲击响应过滤器的一个特殊功能。您正在使用moving average method来选择系数,使用N = 1。它已经是一个低通滤波器。

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

+0

感谢您的回复。 我不知道我已经在使用低通滤波器。 然后我需要一个更高级的参数。 感谢提示,以计算系数和顺序。 我会在将来使用它。 但目前的问题是执行这样一个过滤器。 – 2009-12-12 21:13:52

+0

这个实现非常简单:y = c0 * x [0] + c1 * x [1] ...为c设置好值是最难的部分。 – 2009-12-12 22:31:42

+0

是的,这很简单。也解释了为什么平均值是低通滤波器。 (a + b)/ 2 => 0.5 * a + 0.5 * b。问题回答并被接受。我想高和乐队低音是相当简单的?如果是的话,你也可以写这些算法? – 2009-12-12 23:00:19

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]

的这些第二实际上是H而X阵列的卷积。这也是最容易理解的。

上一个答案解释了从哪里开始构建过滤器。假设你的滤波器系数是h,那么它只是对非负数进行求和。

我相信我明白你在问什么。尽管你不需要超过一个输出。从维基百科页面的Karplus组-斯特朗串合成算法需要长度L的缓冲如果我们具有M个滤波器系数(h)给出形式的输出,

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

的Karplus组-斯特朗合成从here使用环形缓冲区来保存最后的L个输出,y[i-1],...,y[i-L]。这初始化为i<=Lx[i]噪声值;然而,对于i>Lx[i]=0。由于您只存储L值,因此算法将具有空间效率。 i>L的信号x[i]仅添加到环形缓冲区。

最后,作为警告的提示,如果您对系数h的数量和值y的输出值可能不具有所需的行为都不小心。

+0

我对这个东西几乎一无所知,所以也许我错误地实现了它。我使用了下面的解释:http://www.cs.princeton.edu/courses/archive/fall07/cos126/assignments/guitar.html(不是我的作业),并且根据这个说明,缓冲器被用作延迟和反馈。此外,更新步骤只需要两个输入。 生成的音频听起来像一把吉他。如果您仍然认为应该使用缓冲区中的所有值,那么您能否进一步解释? – 2009-12-13 00:17:33

+0

我正在浏览[Wikipedia page] [1]的论文。它具有'y [n] = x [n] + 0.5 *(y [nN] + y [n-(N + 1)])'而不是y [n] = x [n] + 0.5 *(y [n-1] + y [n-2])'这就是我所设想的。所以你对缓冲区的构建方式看起来是正确的。普林斯顿页面也增加了缓冲区中的平均值0.996的衰减。我没有看到任何理由,你不能只有两个元素一起过滤。但是你的里程会有所不同,所以你必须试验一下,听起来最好。 [1] http://www.jstor.org/pss/3680063 – 2009-12-13 21:08:06

+0

我编辑了我的答案,以纠正我的误解。 – 2009-12-13 21:35:04