Filter 如何在C语言中实现FIR滤波器以一次处理一个样本

Filter 如何在C语言中实现FIR滤波器以一次处理一个样本,filter,signal-processing,avr,Filter,Signal Processing,Avr,以下代码是一个实时FIR滤波器的实现代码,取自DSP教科书。但是,我希望一次处理一个样本,生成相应的输出,然后实时处理下一个样本。我应该将每个新样本附加到输入数组中,还是有其他方法 /*==================================================== Dig_FIR_Filt_RT() - filters input array using FIR coefs (uses real-time code)

以下代码是一个实时FIR滤波器的实现代码,取自DSP教科书。但是,我希望一次处理一个样本,生成相应的输出,然后实时处理下一个样本。我应该将每个新样本附加到输入数组中,还是有其他方法

        /*====================================================
      Dig_FIR_Filt_RT() - filters input array using FIR
      coefs (uses real-time code)
      Prototype: void Dig_FIR_Filt_RT(int *X,int *Y,
      double *M,double *C,int numb_coefs,int N);
      Return: error value.
      Arguments: X - ptr to input array
      Y - ptr to output array
      M - ptr to memory array
      C - ptr to coefs array
      numb_coefs - number of coefficients
      N - number of values in array
      ====================================================*/
      void Dig_FIR_Filt_RT(int *X,int *Y,double *M,double *C
      ,int numb_coefs,int N)
      { int *x,*y, /* ptrs to in/out arrays */
          i,j; /* loop counters */
          double *c,*m1,*m2, /* ptrs to coef/memory array */
          o; /* output value */
          /* Make copies of input and output pointers */
          x = X;
          y = Y;
          /* Start loop for number of data values */
          for(i = 0; i < N ;i++)
          { /* Make copy of pointers and start loop */
          M[numb_coefs-1] = *x++;
          c = C;
          m1 = m2 = M;
          o = *m1++ * *c++;
          /* Use convolution method for computation */
          for(j = 1; j < numb_coefs ;j++)
          { *m2++ = *m1;
          o += *m1++ * *c++;
          }
          /* Multiply by gain, convert to int and store */
          o *= *c;
          *y++ = (int)ceil(o-0.5);
          }
      }
/*====================================================
Dig_FIR_Filt_RT()-使用FIR对输入阵列进行滤波
coefs(使用实时代码)
原型:void Dig_FIR_Filt_RT(int*X,int*Y,
双*M,双*C,int numb_coefs,int N);
返回:错误值。
参数:X-ptr到输入数组
Y-ptr到输出阵列
M-ptr到内存阵列
C-ptr到coefs阵列
numb_coefs-系数的数量
N-数组中的值数
====================================================*/
无效数字滤波(int*X,int*Y,double*M,double*C
,int numb_coefs,int N)
{int*x,*y,/*ptr到输入/输出阵列*/
i、 j;/*循环计数器*/
双*c、*m1、*m2、/*PTR到coef/内存阵列*/
o、 /*产值*/
/*复制输入和输出指针*/
x=x;
y=y;
/*数据值数量的开始循环*/
对于(i=0;i
通常,让算法独立于缓冲区大小(=每次读取的新样本数)是一种很好的做法。您的算法应该注意保留它可能需要的过去的样本,并且能够处理任意数量的输入样本。在FIR滤波器的情况下,这意味着对于顺序为
N
的滤波器,必须先累积
N
样本,然后才能输出第一个滤波样本。如果您在编写过滤器时考虑到了这一点,那么您可以使用单个输入样本或大小为1的缓冲区调用它。在伪代码中:

  • 从音频设备/模拟输入等获取
    m
    新样本
  • 将所有新样本复制到算法保存的数组中
  • 将FIR滤波器应用于从上次新样本到最新样本的所有样本
  • 更新
    last new sample
    以指向筛选的最新样本

  • 如果您知道一次只需要一个样本,可以使缓冲区循环。这不仅易于实现,而且比使用每个新样本上移缓冲区更有效。感谢Itamar的回复。我在高层次上也这么认为,但技术实现是有问题的。我卷积每个样本并返回结果,以便通过pwm输出,但结果只是噪声。@MalcolmMcLean我应该如何修改代码以实现这一点?在输出中产生噪声可能有很多原因。您需要调试代码和硬件(输入、微控制器、输出)。理想情况下,为输入提供已知信号(零、直流、正弦波等),并在PWM之前记录输出,确保其有意义。使用示波器查看输出电压。这是一个起点。如果您提供更多关于您尝试过的内容和失败的内容的信息/代码,将更容易帮助您。正如我在对我的答案的评论中所写,噪音可能是许多事情的结果。但首先,使用
    k
    作为索引,而不初始化它。这是您需要修复的第一个bug。除了,请参阅我的其他评论。我今天将尝试此操作。如果之前的方法@ItamarKatz不成功,您能看看更新的代码吗?