【问题标题】:Extending Karplus-Strong with low pass filter用低通滤波器扩展 Karplus-Strong
【发布时间】:2009-12-12 20:11:19
【问题描述】:

我已经实现了一个基本的 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是一个复数。

两个版本都有两个输入和两个输出。
我如何从中获得一个有意义的价值?
还是我必须重写算法的更大部分?
如果是这样,我在哪里可以找到一个很好的解释?

【问题讨论】:

    标签: c# filter frequency


    【解决方案1】:

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

    计算滤波器的系数和阶数以将其调整到特定的频率响应涉及到棘手的数学问题。如果移动平均线不符合您的要求,最好的办法是使用软件包来计算系数。 Matlab 是通常的选择,GNU Octave 是一个开源选项。

    【讨论】:

    • 感谢您的回复。我不知道我已经在使用低通滤波器。然后我需要一个更高级的参数。感谢您提供计算系数和顺序的提示。我将来可能会使用它。但目前的问题是这样一个过滤器的实现。
    • 实现非常非常简单:y = c0*x[0] + c1*x[1]... 为 c 设置好的值是困难的部分。
    • 是的,这很简单。还解释了为什么平均值是低通滤波器。 (a+b)/2 => 0.5*a+0.5*b。问题已回答并接受。我猜高和带低音同样简单?如果可以,你也可以编写这些算法吗?
    【解决方案2】:

    过滤器可以用多种方式表示:

    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-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]。这被初始化为i<=Lx[i] 噪声值;但是,对于 i>L x[i]=0。该算法将节省空间,因为您只存储 L 值。 i>L 的信号 x[i] 刚刚添加到环形缓冲区。

    最后,作为警告说明,如果您不注意h 的系数数量和输出y 的值,则可能没有所需的行为。

    【讨论】:

    • 我对这些东西几乎一无所知,所以也许我实施错了。我使用了来自cs.princeton.edu/courses/archive/fall07/cos126/assignments/… 的解释(不是我的作业),据此,环形缓冲区用作延迟和反馈。更新步骤也只需要两个输入。生成的音频听起来像吉他。如果您仍然认为应该使用缓冲区中的所有值,您能否进一步解释一下?
    • 我从 [Wikipedia page][1] 上的论文一目了然。它有y[n] = x[n] + 0.5*(y[n-N] + y[n-(N+1)]) 而不是y[n] = x[n] + 0.5*(y[n-1] + y[n-2]),这是我假设的。因此,您似乎对缓冲区的构造方式是正确的。普林斯顿页面还为缓冲区的平均值添加了 0.996 的衰减。我看不出有什么理由不能将两个以上的元素过滤在一起。但是你的里程会有所不同,所以你必须试验一下,什么听起来最好。 [1]jstor.org/pss/3680063
    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 2016-02-29
    • 2011-05-29
    • 2019-04-29
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多