我正在尝试实现Karplus-Strong弹拨字符串算法的this extenstion,但我不理解那里使用的符号。也许它需要多年的学习,但也许它不会 - 也许你可以告诉我。
我认为下面的等式是在频域或其他东西。刚开始使用第一个等式H p (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背景来实现这一点?我曾经是一名数学家......但这不是我的领域。
答案 0 :(得分:7)
所以z -1 只是意味着一个单位的延迟。
我们取H p =(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的方式 OR 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等)比实施它们更困难。