高速FIRフィルタ関数

| ← back |
| home |

■通常の剰余演算を用いたFIRフィルタ関数

// conventional FIR filter function
float fast_fir(float in, float coef[], float buf[], unsigned *index, unsigned length) {
  float out;
  unsigned i;

  buf[*index]=in;
  *index=(*index+1)%length;
  out=0.0;
  for (i=0; i<length; i=i+1) out=out+coef[i]*buf[(*index+i)%length];
  return out;
}

■剰余演算を排除した高速FIRフィルタ関数(buf[ ]の長さはタップ長の倍=2*length)

// fast FIR filter function
float fast_fir(float in, float coef[], float buf[], unsigned *index, unsigned length) {
  float out;
  unsigned i;

  buf[*index]=in;
  buf[*index+length]=in;
  *index=*index+1;
  if (*index==length) *index=0;
  out=0.0;
  for (i=0; i<length; i=i+1) out=out+coef[i]*buf[*index+i];
  return out;
}

■通常の剰余演算を用いたプログラムの処理速度(テストプログラム test_fir.zip
 DSP内部のメモリ使用,1000 tap

optimize       | 1000 tap        |
level          | execution clock | clock/tap
---------------+-----------------+----------
none           |    74200        |  74
-o0 (register) |    41200        |  41

■剰余演算を排除した高速化プログラムの処理速度(テストプログラム test_fast_fir1.zip
 DSP内部のメモリ使用,1000 tap

optimize       | 1000 tap        |
level          | execution clock | clock/tap
---------------+-----------------+----------
none           |    46400        |  46
-o0 (register) |    22200        |  22
-o1 (local)    |    19200        |  19
-o2 (function) |     5300        |   5

■剰余演算を排除した高速化プログラムの処理速度(テストプログラム test_fast_fir2.zip
 外部メモリ使用(SDRAM),10000 tap

optimize       | 10000 tap       |
level          | execution clock | clock/tap
---------------+-----------------+----------
none           |   461500        |  46
-o0 (register) |   220200        |  22
-o1 (local)    |   190200        |  19
-o2 (function) |    51400        |   5
| ← back | ↑top |
| home |