信号処理ライブラリ


概要

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

FIRフィルタ

 畳み込み演算です。 フィルタ係数coef[]はPMに置いてください。 ディレイラインdelay[]storedelay()storefir()で処理したものを 使ってください。

/* FIR filtering */
float firfilter(float pm coef[], float dm delay[], int tap);

ディレイラインとFIRフィルタ

 storedelay()firfilter()をあわせたものです。

/* Store input adn FIR filtering */
float storefir(float in, float pm coef[], float dm delay[], int tap);

LMS適応FIRフィルタ

 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;

[戻る 5.4 最も簡単なプログラム] [Top] [次へ 5.6 PC用DSP制御ライブラリ]

(作成: 2000年6月13日, 最終更新: 2000年7月13日)