int型FIRディジタルフィルタプログラム
Copyright (C) 17Feb2004 coskx
【1】int型FIRディジタルフィルタプログラム
SH2はint型積和演算する命令と専用レジスタを持っている。ここではSH2のint型積和演算する命令と専用レジスタを用いたint型FIRディジタルフィルタプログラムについて解説する。(SH2DSPはFIRディジタルフィルタ演算専用の命令ももっているようである。)FIRディジタルフィルタに関してはここでは解説しない。
ファイルのダウンロード
DownLoad |
【2】int型FIRディジタルフィルタのCプログラム(PC上などで動作)
ポインタとリングバッファを使用したint型FIRディジタルフィルタは,Cでは次の例のように作成できる。テスト用メインではインパルスレスポンスを計算している。(係数列がそのまま出力される。)
Cプログラミング(tap長5のFIRディジタルフィルタ) |
#include <stdio.h> short int coef[SIZE]; /*フィルタ演算*/ /*係数列のセット*/ /*バッファの初期化*/ int main(void) |
実行結果 |
0 0 1 10 2 20 3 30 4 40 5 0 6 10 7 20 8 30 9 40 |
【3】int型FIRディジタルフィルタのCプログラム(SH2などで動作)
Cプログラミング(tap長5のFIRディジタルフィルタ) |
#include "7040S.H" #define SIZE 5 short int coef[SIZE]; short int digitalfilter(short int
data) void setCoeff(short int c[],int
number) void clearbuff(int
number) int main(void) |
実行結果 |
0 0 1 10 2 20 3 30 4 40 5 0 6 10 7 20 8 30 9 40 |
【4】int型FIRディジタルフィルタのアセンブリプログラム(SH2などで動作 ディジタルフィルタ演算部をセンブリ言語で記述)
ここではint型FIRディジタルフィルタ演算に積和機能を利用した。
「mac.w @r3+,
@r7+」はr3とr7の内容をアドレスとするwordの積を作り,macに加え,r3とr7を1word分(=2)増加させる。
Cプログラミング(tap長5のFIRディジタルフィルタ) |
#include "7040S.H" #define SIZE 5 short int coef[SIZE]; short int digitalfilter(short int
data); void clearbuff(int
number) int main(void) |
アセンブリフィルタリング関数 |
.global
_rngbuff /*
y=0;
*/ /* prngbuff=rngbuff;
*/ /* while (prngbuff!=pcurrent)
{
*/ L9: /* if (pcurrent!=rngbuff)
pcurrent--; */ |
実行結果 |
0 0 1 10 2 20 3 30 4 40 5 0 6 10 7 20 8 30 9 40 |
【5】性能測定
「【3】,【4】」のプログラムを一部変更して,演算時間の測定を行なった。
変更箇所 | |
1 | #define SIZE 256 |
2 | int main(void) { short int cc[SIZE]; short int x,y; long int i; initSCI1(); for (i=0; i<SIZE; i++) cc[i]=i; setCoeff(cc,SIZE); clearbuff(SIZE); for (i=0; i<1000000; i++) { if ((i&0xff)==0) { y=digitalfilter(1); SCI1_printf("%d %d\n",i,y); } else { y=digitalfilter(0); } /*SCI1_printf("%d %d\n",i,y);*/ } } |
測定結果 | |
プログラム |
演算性能 |
【3】Cで記述したフィルタ | 10秒間に256tapのFIRディジタルフィルタリングを75000回程度実行 |
【4】積和機能を利用したアセンブリ言語記述のフィルタ | 10秒間に256tapのFIRディジタルフィルタリングを107000回程度実行 |
【6】int型FIRディジタルフィルタのアセンブリプログラム(SH2などで動作 ディジタルフィルタ演算部をセンブリ言語でループなし記述)
ここではint型FIRディジタルフィルタ演算に積和機能を利用し,ループを用いずに直接tapの数だけ演算命令を羅列。
そのため,tap係数長を変更するには直接アセンブリプログラムを変更しなければばらない。
Cプログラミング(tap長256のFIRディジタルフィルタ) |
#include "7040S.H" #define SIZE 256 short int coef[SIZE]; short int digitalfilter(short int data); void setCoeff(short int c[],int
number) void clearbuff(int
number) int main(void) |
アセンブリフィルタリング関数 |
.global
_rngbuff
clrmac
/*MACレジスタの初期化*/ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ mac.w @r3+,
@r6+ sts macl, r0 /*結果をR0 に得る*/
mov.l @r5,r1 |
測定結果 | |
プログラム |
演算性能 |
【3】Cで記述したフィルタ | 10秒間に256tapのFIRディジタルフィルタリングを75000回程度実行 |
【4】積和機能を利用したアセンブリ言語記述のフィルタ | 10秒間に256tapのFIRディジタルフィルタリングを107000回程度実行 |
【6】積和機能を直列利用したアセンブリ言語記述のフィルタ | 10秒間に256tapのFIRディジタルフィルタリングを187000回程度実行 |