SHARC DSPによるFIRフィルタ


注意

 アセンブラでプログラムを開発する人向けの情報です。 C言語で開発する場合には、 飛ばしてBlackfin DSPに進みましょう。


FIRフィルタのプログラム

 FIRフィルタの演算
convolution
のプログラムを作成してみましょう。 C言語では、

  for(i = 0, y = 0; i < N; i++)
    y += h[i] * x[i];
となります。 アセンブラでは、
  1. h[i]をメモリから読み出し、 レジスタF3-0に格納
  2. x[i]をメモリから読み出し、 レジスタF7-4に格納
  3. F3-0F7-4を乗じ、 結果をF15-12に格納
  4. F11-8F15-12を加える
を繰り返します。

 この処理を一回分書いてみると、以下のようになります。

  B0 = ディレイの先頭;
  L0 = タップ数;
  I8 = フィルタ係数の先頭;
  M1 = 1;
  M9 = 1;
  F8 = 0;

  F0 = DM(I0,M1), F4 = PM(I8,M9);
  F12 = F0 * F4;
  F8 = F8 + F12;
x[i]h[i]の読み出しは同時に行っています。 これを繰り返すことになります。 乗算、加算、データ読み出し×2個を同時に実行できることに注意しながら 3タップ分の処理を並べると、次のようになります。
  B0 = ディレイの先頭;
  L0 = タップ数;
  I8 = フィルタ係数の先頭;
  M1 = 1;
  M9 = 1;
  F8 = 0;

                                F0 = DM(I0,M1), F4 = PM(I8,M9);
                 F12 = F0 * F4, F0 = DM(I0,M1), F4 = PM(I8,M9);
  F8 = F8 + F12, F12 = F0 * F4, F0 = DM(I0,M1), F4 = PM(I8,M9);
  F8 = F8 + F12, F12 = F0 * F4;
  F8 = F8 + F12;
ここでは、 1タップ目2タップ目3タップ目で色分けしてあります。

 SHARC DSPは繰り返しループ用の命令を持っています。 指定回数の反復は、


  R1 = 反復回数
  LCNTR=R1, DO 反復終わりのラベル UNTIL LCE;
    繰り返し処理;
  反復終わりのラベル: 繰り返し処理の最後の命令
のように書きます。 FIRフィルタプログラムでループ用命令を用いるとどうなるのかは、 宿題とします。

 実際にFIRフィルタを動かすには、他にも追加すべき処理があります。 例えば、

などです。


[上へ] [戻る SHARCの命令セット] [目次] [次へ Blackfin DSP]