我正在尝试实现Karplus-Strong弹拨字符串算法的this extenstion,但是我不明白那里使用的表示法。也许这将需要数年的研究,但也许不会,也许您可​​以告诉我。

我认为下面的等式在频域之内。仅从第一个方程Hp(z)开始,即拾取方向低通滤波器。对于一个方向,您使用p = 0,对于另一个方向,则可能使用0.9。在第一种情况下,该值降为1;在第二种情况下,其降为0.1 /(1- 0.9 z-1)。

alt text 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的背景知识来实现​​这一点吗?我曾经是数学家...但这不是我的专长。

最佳答案

因此z-1只是意味着一个单位的延迟。

让我们假设Hp =(1-p)/(1-pz-1)。

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

所以我们得到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”成为其自身和输入的各种延迟的线性函数。

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

07-26 09:38