Ste*_*314 12
设计FIR滤波器不是一个简单的主题,但实现一个已经设计的滤波器(假设你已经有FIR系数)并不是太糟糕.该算法称为卷积.这是一个天真的实现......
void convolve (double *p_coeffs, int p_coeffs_n,
               double *p_in, double *p_out, int n)
{
  int i, j, k;
  double tmp;
  for (k = 0; k < n; k++)  //  position in output
  {
    tmp = 0;
    for (i = 0; i < p_coeffs_n; i++)  //  position in coefficients array
    {
      j = k - i;  //  position in input
      if (j >= 0)  //  bounds check for input buffer
      {
        tmp += p_coeffs [k] * p_in [j];
      }
    }
    p_out [i] = tmp;
  }
}
Run Code Online (Sandbox Code Playgroud)
基本上,卷积执行输入信号的移动加权平均.权重是滤波器系数,假设总和为1.0.如果权重总和为1.0以外的值,则会得到一些放大/衰减以及滤波.
顺便说一句 - 这个函数有可能向下有系数数组 - 我没有仔细检查过,因为我考虑过这些事情已经有一段时间了.
对于如何计算特定滤波器的FIR系数,背后有相当数量的数学 - 你真的需要一本关于数字信号处理的好书.这个可以免费获得PDF,但我不确定它有多好.我有Rorabaugh和Orfandis,都出版于九十年代中期,但这些东西并没有真正过时.