【问题标题】:FIR filter in C?C中的FIR滤波器?
【发布时间】:2013-09-30 11:40:14
【问题描述】:

我有一个用 C 语言实现 FIR 滤波器的作业,我想知道您是否认为我正确理解了这个任务。我写的我认为解决问题的程序是:

#include <stdio.h>
float FIRfloats[5];
void floatFIR(float newsample)
{
  int i;
  float sum=0;

  FIRfloats[0]=newsample*0.0299;
  FIRfloats[1]=FIRfloats[2]*0.4701;
  FIRfloats[2]=FIRfloats[3]*0.4701;
  FIRfloats[3]=FIRfloats[4]*0.0299;

  /* sum */
   for(i=0;i<5;i++)
  {
    sum=sum+FIRfloats[i];
  }
  printf("Sum: %f\n", sum);
}

int main ()
{

  float n=0.0f; 
  while (scanf("%f", &n) > 0)
  {
  floatFIR(n);
  }
  return 0;
}

规范是

在新样本 xk 到达之前,旧样本被转移到 右,然后每个样本在 结果yk,所有缩放样本的总和,被计算出来

系数应为 c0=0.0299、c1=0.4701、c2=0.4701、c3=0.0299。

你认为我正确地完成了作业吗?我认为这似乎太容易了,因此我想知道。

【问题讨论】:

  • 看不到任何移动。您似乎正在缩放单个值。当然你应该输入几个值,然后当你有足够的值时缩放?
  • 什么是 FIRfloats[2]、FIRfloats[3] 和 FIRfloats[4] 在初始条件下,是否为零?对吗?
  • 延迟应该仅用于输入,不与系数相乘。应该在求和循环中使用系数。见图表:en.wikipedia.org/wiki/Finite_impulse_response
  • @SHREYASJOSHI 如果没有给出特定的值初始化器,那些 always 不是初始化为 0.0f 吗?见:stackoverflow.com/questions/3803153/…

标签: c filtering


【解决方案1】:

恐怕问题中提供的实现不会提供正确的结果。

在具有 4 个系数的 FIR(有限脉冲响应)滤波器中,输入序列 (x) 的输出序列 (y) 为:

y[t] = c0*x[t] + c1*x[t-1] + c2*x[t-2] + c3*x[t-3]

因此实现应该类似于:

/* add includes (stdio.h and whatever else you'll need...) */

float floatFIR(float inVal, float* x, float* coef, int len)
{
    float y = 0.0;
    for (int i = (len-1) ; i > 0 ; i--)
    {
         x[i] = x[i-1];
         y = y + (coef[i] * x[i]);
    }
    x[0] = inVal;
    y = y + (coef[0] * x[0]);
    return y;
}

main(int argc, char** argv)
{
    float coef[4] = {0.0299, 0.4701, 0.4701, 0.0299};
    float x[4] = {0, 0, 0, 0}; /* or any other initial condition*/
    float y;
    float inVal;

    while (scanf("%f", &inVal) > 0)
    {
        y = floatFIR(inVal, x, coef, 4);
    }
    return 0;

}

这会在同一个循环中进行移位和乘法运算(这不会影响结果 - 只会更有效。) 如果您想完全遵循规范,可以像这样更改 floatFir:

float floatFIR(float inVal, float* x, float* coef, int len)
{
    float y = 0.0;
    for (int i = (len-1) ; i > 0 ; i--)
    {
         x[i] = x[i-1];
    }
    x[0] = inVal;

    for (int i = 0 ; i < len ; i++)
    {
        y = y + (coef[i] * x[i]);
    }
    return y;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多