3

Karplus-Strong の撥弦アルゴリズムの拡張を実装しようとしていますが、使用されている表記法がわかりません。何年もの研究が必要かもしれませんが、そうではないかもしれません。

以下の方程式は周波数領域か何かにあると思います。最初の式、H p (z)、ピック方向ローパス フィルターから始めます。一方の方向では p = 0 を使用し、もう一方の方向ではおそらく 0.9 を使用します。これは、最初のケースでは 1 に、2 番目のケースでは 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は 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のいずれかを選択する方法のように見える 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 に答える