IIR数字低通滤波器C语言程序代码
时间: 2024-12-26 19:11:48 浏览: 1
IIR (无限 impulse response) 数字低通滤波器通常使用巴特沃斯滤波器或切比雪夫滤波器设计,它们涉及递归算法。以下是基于巴特沃斯滤波器的一个简单C语言代码示例,使用直接形式II(Direct Form II)实现:
```c
#include <stdio.h>
#include <math.h>
// 巴特沃斯滤波器系数计算函数
void butterworth_coefficients(float fs, float cutoff_freq, int order, float *b, float *a) {
double numerator[order + 1];
double denominator[order + 2];
double w0 = M_PI * cutoff_freq / fs;
// 计算巴特沃斯滤波器系数
for (int i = 0; i <= order; ++i) {
numerator[i] = pow(-w0, 2 * i);
denominator[i] = 1;
if (i != 0)
denominator[i] *= i;
}
// 构造极点和零点
for (int i = 1; i <= order; ++i) {
a[i] = -numerator[i] / denominator[i];
b[i] = numerator[i - 1] / denominator[i];
}
}
// 滤波器核心部分
void iir_filter(float input[], float output[], float b[], float a[], int size) {
float y = 0.0; // 输出样本
for (int i = 0; i < size; ++i) {
y += a[1] * input[i]; // 积分部分
for (int j = 1; j < a[0]; ++j)
y -= a[j] * output[i - j]; // 稳定化延迟
output[i] = b[0] * input[i] + y; // 直接部分
if (a[0] > 1)
y += a[a[0]] * output[i]; // 零阶保持
}
}
int main() {
float fs = 44100.0; // 样本率,单位 Hz
float cutoff_freq = 4000.0; // 截止频率,单位 Hz
int order = 2; // 过滤阶数
float b[order + 1], a[order + 2];
butterworth_coefficients(fs, cutoff_freq, order, b, a);
// 示例输入数据
float input[] = { /* ... */ };
float output[size];
iir_filter(input, output, b, a, size);
// 输出结果
for (int i = 0; i < size; ++i)
printf("Output sample %d: %.4f\n", i, output[i]);
return 0;
}
```
注意,这只是一个基本的框架,实际应用中可能需要处理更多细节,如滤波器初始化、反馈环稳定性和溢出检查等。此外,这个例子假设了一个线性序列的输入,对于实时应用,你可能还需要使用FIR滤波器或者优化的结构。
阅读全文