ディレイライン、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日)