c - FIR滤波器在C编程中的实现

标签 c signal-processing

谁能告诉我如何使用 c 编程语言实现 FIR 滤波器。

最佳答案

设计 FIR 滤波器不是一个简单的主题,但是实现一个已经设计好的滤波器(假设您已经有了 FIR 系数)也不是太糟糕。该算法称为 convolution .这是一个天真的实现...

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 [i] * p_in [j];
      }
    }

    p_out [k] = tmp;
  }
}

基本上,卷积对输入信号进行移动加权平均。权重是滤波器系数,假定总和为 1.0。如果权重之和不是 1.0,您会得到一些放大/衰减以及过滤。

顺便说一句 - 这个函数的系数数组可能是倒过来的 - 我没有仔细检查过,我已经有一段时间没有考虑这些事情了。

关于如何计算特定滤波器的 FIR 系数,背后有相当多的数学知识——您确实需要一本关于数字信号处理的好书。 This one可以免费获得 PDF,但我不确定它有多好。我有 RorabaughOrfandis ,都发表于九十年代中期,但这些东西并没有真正过时。

关于c - FIR滤波器在C编程中的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14997850/

相关文章:

android - 在android中创建数字过滤器

c - C : Reading integers and finding characters 中的 I/O

c - C语言如何输入字母退出程序

c - 如何在循环中使用 sscanf?

c++ - 空间如何分配 char* 数组?

c++ - 检测是否同时按下 2 个键

c - 用于峰值 EQ 的 IIR 系数,如何将它们传递给 vDSP_deq22?

ios - iPhone音频相移

c# - C# 中的快速傅立叶变换

matlab - 为什么傅立叶域中的零填充会导致复杂的逆变换?