gpt4 book ai didi

c - 双二阶滤波器输出在 C 实现中被放大

转载 作者:行者123 更新时间:2023-11-30 14:49:06 24 4
gpt4 key购买 nike

我试图根据方程用 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

最佳答案

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

关于c - 双二阶滤波器输出在 C 实现中被放大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49958206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com