0

基本的な Karplus-Strong アルゴリズムを実装しました。
ホワイト ノイズで満たされた Ringbuffer は、先頭からサンプルを出力し、最初の 2 つの要素の平均を最後に追加し、最初の要素を削除します。最後のステップまで繰り返します。

より良い結果とそれらを制御するために、アルゴリズムの拡張バージョンを実装しようとしました。
したがって、平均化フィルターの代わりに、ローパスフィルターのような周波数フィルターが必要です。
私の平均化フィルターには 2 つの入力と 1 つの出力があります: avg(a,b) = (a+b)/2

wikipedia ページのサンプル コードは、入力と同じ数の出力を提供します。
http://en.wikipedia.org/wiki/Low-pass_filter


http://cnx.org/content/m15490/latest/
H(z) = (1+(1/z))/2のような他の (数学的な) バージョンを見つけました。z
は複素数だと思います。

どちらのバージョンも 2 つの入力と 2 つの出力を備えています。
これから意味のある値を取得するにはどうすればよいですか?
それとも、アルゴリズムのより大きな部分を書き直す必要がありますか?
その場合、どこでそれについての適切な説明を見つけることができますか?

4

2 に答える 2

2

このフィルターは、有限インパルス応答フィルターを特殊化したものです。N = 1 を使用して、移動平均法を使用して係数を選択しています。これは既にローパス フィルターです。

フィルターを特定の周波数応答に調整するための係数と次数を計算するには、難しい数学が必要です。最善の方法は、移動平均が予算に合わない場合、ソフトウェア パッケージを使用して係数を計算することです。Matlab が通常の選択であり、GNU Octave はオープン ソース オプションです。

于 2009-12-12T21:06:19.693 に答える
0

フィルタは、さまざまな方法で表現できます。

  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]

これらの2つ目は、実際にはh配列とx配列の畳み込みです。これも最も理解しやすい方法です。

前の回答は、フィルターの作成をどこから始めればよいかを説明しました。フィルタ係数h'sがあるとすると、負でない係数を単純に合計します。

私はあなたが何を求めているのかわかると思います。複数の出力は必要ありませんが。ウィキペディアのページから、Karplus-Strong文字列合成アルゴリズムには長さLのバッファーが必要です。hフォームの出力を提供するM個のフィルター係数()がある場合、

y[i] = x[i] + h[0]*y[i-L] + h[1]*y[i-(L+1)] + h[2]*y[i-(L+2)] + ...

ここからのKarplus-Strong合成では、リングバッファを使用して最後のL出力を保持しますy[i-1],...,y[i-L]。これは、 ;のx[i]ノイズ値として初期化されます。i<=Lただし、i>L x[i]=0。L値のみを保存するため、アルゴリズムはスペース効率が高くなります。の信号x[i]i>Lリングバッファに追加されます。

最後に、警告の注記として、係数の数と値の両方に注意しないhと、出力yが目的の動作をしない可能性があります。

于 2009-12-12T23:31:49.260 に答える