ディレイライン、FIRフィルタ、LMSアルゴリズムによる適応FIRフィルタです。
関数の宣言はdsplib.h
に書いてあります。
ディレイライン用の配列は
タップ数+1であることに注意してください。
また、フィルタ係数はPMに置きます。
initdelay()
はディレイラインを初期化します。
storedelay()
はディレイラインdelay[]
に
入力信号in
を格納します。
戻り値はディレイラインから追い出された最も古い信号です。
ディレイラインの実装には
リングバッファを用いています。
配列の先頭要素delay[0]
を
リングバッファの先頭を示すポインタに使っているので、
これを勝手に書き換えると確実に誤動作します。
このため、ディレイライン用の配列のサイズは
タップ数+1になります。
また、配列delay[]
の先頭から順番にアクセスしても、
ディレイラインの先頭からアクセスしていることにはなりません。
/* Initialize delay line */ void initdelay(float dm delay[], int tap); /* Store input samples into delay line */ float storedelay(float in, float dm delay[], int tap);
畳み込み演算です。
フィルタ係数coef[]
はPMに置いてください。
ディレイラインdelay[]
は
storedelay()
やstorefir()
で処理したものを
使ってください。
/* FIR filtering */ float firfilter(float pm coef[], float dm delay[], int tap);
storedelay()
とfirfilter()
をあわせたものです。
/* Store input adn FIR filtering */ float storefir(float in, float pm coef[], float dm delay[], int tap);
LMSアルゴリズムを用いた適応FIRフィルタです。
畳み込みと係数更新を同時に行います。
(タップ数×2+α)クロックで処理できる最適化されたプログラムですが、
最適化のためにいくつかの制約があります。
sample
はディレイラインから追い出された信号で、
storedelay()
の戻り値を使います。
delta
は係数修正量です。
LMSアルゴリズムでは誤差信号とステップサイズの積、
正規化LMSアルゴリズムではそれをパワーで正規化したものになります。
coef[]
はPMに置きます。
delay[]
はstoredelay()
で処理したものを
使ってください。
タップ数tap
は4以上の偶数にしてください。
/* FIR filtering and coefficient adaptation */ float firlms(float sample, float delta, float pm coef[], float dm delay[], int tap);
firlms()
の使用例を示します。
まず、初期化の際にdelta
を0.0にしておきます。
delta
を代入するより前に
firlms()
で使用しているように見えますが、
これは最後に計算したdelta
を次回に使うからです。
/* Store input */ old = storedelay(in, delay, TAPNUM); /* Adaptive Filter */ adf_out = firlms(old, delta, coef, delay, TAPNUM); error = desired - adf_out; delta = step_size * error;
(作成: 2000年6月13日, 最終更新: 2000年7月13日)