3

我正在尝试实现Karplus-Strong 弹拨字符串算法的这种扩展,但我不明白那里使用的符号。也许这需要多年的学习,但也许不会——也许你可以告诉我。

我认为下面的方程是在频域或什么的。从第一个方程 H p (z) 开始,拾取方向低通滤波器。对于一个方向,您使用 p = 0,对于另一个方向,可能是 0.9。在第一种情况下归结为 1,在第二种情况下归结为 0.1 / (1 - 0.9 z -1 )。

替代文字 http://www.dsprelated.com/josimages/pasp/img902.png

现在,我觉得这在编码方面可能意味着:

H_p(float* input, int time) {
  if (downpick) {
    return input[time];
  } else {
    return some_function_of(input[t], input[t-1]);
  }
}

有人可以给我一个提示吗?或者这是徒劳的,我真的需要所有的 DSP 背景来实现这个?我曾经是一名数学家……但这不是我的领域。

4

1 回答 1

7

所以 z -1仅仅意味着一个单位的延迟。

让我们取 H p = (1-p)/(1-pz -1 )。

如果我们遵循输入“x”和输出“y”的约定,则传递函数 H = y/x (=output/input)

所以我们得到 y/x = (1-p)/(1-pz -1 )

或 (1-p)x = (1-pz -1 )y

(1-p)x[n] = y[n] - py[n-1]

或:y[n] = py[n-1] + (1-p)x[n]

在 C 代码中可以实现

y += (1-p)*(x-y);

除了使用输出“y”作为状态变量本身之外,没有任何其他状态。或者您可以采用更直接的方法:

y_delayed_1 = y;
y = p*y_delayed_1 + (1-p)*x;

就其他方程而言,它们都是典型的方程,除了第二个方程,它看起来可能是选择 H Β = 1-z -1或 1-z -2的一种方式。(什么是 N?)

过滤器有点模糊,除非你能找到一些预先包装好的过滤器,否则它们会更难处理。一般来说,它们的形式是

H = H0*(1+az -1 +bz -2 +cz -3 ...)/(1+rz -1 +sz -2 +tz -3 ...)

你所做的就是写下 H = y/x,交叉乘以得到

H0 * (1+az -1 +bz -2 +cz -3 ...) * x = (1+rz -1 +sz -2 +tz -3 ...) * y

然后单独隔离“y”,使输出“y”成为其自身和输入的各种延迟的线性函数。

但在大多数情况下,设计过滤器(选择 a、b、c 等)比实现它们更难。

于 2009-12-17T00:48:41.180 回答