nwx8899 发表于 2016-4-19 10:17

问下这段FIR滤波程序

#define      N               10         // number of FIR coefficients.
#define      BLKSIZE      20      // block size of samples filtered each time.
#define      M               (N + BLKSIZE - 1)

float workbuf = {0};      // history + current input block, initialize to 0.

// float h: array of fir filter coefficients.
// float x: array of input samples block
// float y: array of samples block after filtering
void fir(float h, float x, float y)
{

      int i, j;
      float *p;
      
      // copy current input block to work buffer
      // workbuf = x, workbuf = x,
      // workbuf = x, ..., workbuf = x;
      for (i=0; i<BLKSIZE; i++)
      {
                workbuf = x;
      }
      
      // FIR filter loop
      for (i=0; i<BLKSIZE; i++)
      {
                p = &workbuf;// each y needs right starting x.
                for (j=0; j<N; j++)
                {
                        y += (h * (*p--));
                }
      }

      // copy last N-1 samples of x to workbuf
      // as history for next block      
      p = &x;      // p points the last element;
      for (i=0; i<N-1; i++)
      {
                workbuf = *p--;
      }

}

/////////////////////////////////////////////////
代码源自本论坛
没看明白,滤波的结果大了将近一倍的样子。


疑问是:如果一个周期的采样数BLKSIZE远远小于滤波器系数的个数N。
那后面
s the last element;
      for (i=0; i<N-1; i++)
                workbuf = *p--;
这句话怎么理解。


页: [1]
查看完整版本: 问下这段FIR滤波程序