|
发表于 2023-12-14 14:32:38
|
显示全部楼层
我用阿里的通义千问写了一个
我的提问是:“用C语言写一个IIR二阶低通滤波器,截止频率是采样频率的1/200,通带部分增益0dB。”
它的回答是:
这是一个二阶Butterworth低通滤波器的设计。以下是C语言的实现代码:
```c
#include <math.h>
#define PI 3.14159265
// 计算butterworth滤波器系数
void butterworthCoeffs(float sampleFreq, float cutoffFreq, float* b0, float* b1, float* b2, float* a1, float* a2) {
float wc = 2 * PI * cutoffFreq / sampleFreq;
float wa = tan(wc/2);
float g = 1 / sqrt(2);
*b0 = 1 / (1 + wa*wa);
*b1 = 2 * (*b0);
*b2 = *b0;
*a1 = -2 * cos(wc);
*a2 = 1 - (2 / (1 + wa*wa));
}
// 滤波器函数
float iirFilter(float input, float* output, float* b0, float* b1, float* b2, float* a1, float* a2) {
static float x1 = 0, x2 = 0, y1 = 0, y2 = 0;
// Direct Form II Transposed
float outputTemp = *b0 * input + *b1 * x1 + *b2 * x2 - *a1 * y1 - *a2 * y2;
x2 = x1;
x1 = input;
y2 = y1;
y1 = outputTemp;
return outputTemp;
}
int main() {
float sampleFreq = 8000; // 采样频率
float cutoffFreq = sampleFreq / 200; // 截止频率
float b0, b1, b2, a1, a2;
butterworthCoeffs(sampleFreq, cutoffFreq, &b0, &b1, &b2, &a1, &a2);
float input, output;
while(1) {
scanf("%f", &input);
output = iirFilter(input, &output, &b0, &b1, &b2, &a1, &a2);
printf("%f\n", output);
}
return 0;
}
```
在这个代码中,我们首先计算了Butterworth滤波器的系数,然后在主函数中使用这些系数对输入信号进行滤波。注意,这个滤波器是无限脉冲响应(IIR)滤波器,它会记住一些过去的输入和输出值以用于当前的计算。这就是为什么我们需要一些静态变量来存储这些值。
这个程序是一个无限循环,你可以在控制台上输入一个浮点数,它将被滤波并打印出来。你可以通过修改`sampleFreq`和`cutoffFreq`的值来改变采样频率和截止频率。 |
|