【发布时间】: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