【问题标题】:biquad filter output getting amplified in C implementation双二阶滤波器输出在 C 实现中被放大
【发布时间】:2018-10-02 03:34:18
【问题描述】:

我试图根据等式在 C 中实现双二阶低通滤波器

y[n] = a0*x[n] + a1*x[n-1] + a2*x[n-2] – b1*y[n-1] – b2*y[n-2]

我给出了幅度为 0.8 的正弦扫描输入,输出经过滤波。但正弦的幅度正在增加并被削波。这是因为C代码有错误吗?

代码是

    #include <stdio.h>
//#include 

float in_state[40];
float out_state[40];
#define blocksize  32

float coeff[5] = {
    0.6589417254311722,
    1.3178834508623445,
    0.6589417254311722,
    -1.1314481923390387,
    -0.5043187093856503,
};
void biquad(float* x, float * y)
{
    in_state[0] = in_state[blocksize];
    in_state[1] = in_state[blocksize+1];

    out_state[0] = out_state[blocksize];
    out_state[1] = out_state[blocksize+1];
#if 1
    for(int i=0;i<blocksize;i++)
    {
        in_state[i+2]=x[i];
    }
#endif
    for(int i = 0; i<blocksize;i++)
    {
        float temp = coeff[0]*in_state[i+2]+    // a0 * x[n]
            coeff[1]*in_state[i+1]+             // a1 * x[n-1]
            coeff[2]*in_state[i]+               // a2 * x[n-2]
            coeff[3]*out_state[i+1]+            // -b1 * y[n-1]
            coeff[4]*out_state[i];              // -b2 * y[n-2]

        out_state[i+2] = temp;

        y[i]=temp;
    }
}


int main()
{
    FILE *infile = fopen("sweep.dat","rb");
    FILE *outfile = fopen("filter.dat","wb");

    float inbuf[32],outbuf[32];

    while(fread(inbuf,sizeof(float),blocksize,infile) == blocksize)
    {
        biquad(inbuf,outbuf);

        fwrite(outbuf,sizeof(float),blocksize,outfile);
    }
    fclose(infile);
    fclose(outfile);
}

我从这个网站Biquad calculator获取的滤波器系数

【问题讨论】:

  • 等式的最后一部分不应该是- coeff[3] * out_state[i+1] - coeff[4] * out_state[i](符号需要修正)吗?我无法真正验证您的系数,因为在您的问题陈述中没有足够的信息来驱动双二阶页面。
  • 是的,但为了补偿我颠倒了系数 coeff[3] 和 coeff[4] 的符号
  • 这就是我很好奇的地方,但由于没有足够的信息,我无法验证您是否确实这样做了。感谢您的澄清。

标签: c filtering signal-processing


【解决方案1】:

您为滤波器系数引入了增益。确保你有均匀的增益。您必须在网站上选择 0 dB 增益 :)

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 2016-03-22
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    相关资源
    最近更新 更多