アセンブラでプログラムを開発する人向けの情報です。 C言語で開発する場合には、 飛ばしてBlackfin DSPに進みましょう。
FIRフィルタの演算
のプログラムを作成してみましょう。
C言語では、
for(i = 0, y = 0; i < N; i++)
y += h[i] * x[i];
となります。
アセンブラでは、
h[i]
をメモリから読み出し、
レジスタF3-0
に格納
x[i]
をメモリから読み出し、
レジスタF7-4
に格納
F3-0
とF7-4
を乗じ、
結果をF15-12
に格納
F11-8
にF15-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フィルタを動かすには、他にも追加すべき処理があります。 例えば、