iir matlab c代码,[数字信号处理]IIR滤波器的直接设计(C代码)
时间: 2023-12-29 11:03:24 浏览: 152
以下是一个使用直接IIR滤波器设计算法的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.14159265358979323846
// 定义IIR滤波器结构体
typedef struct {
int order; // 滤波器阶数
double a[10]; // 反馈系数
double b[10]; // 前馈系数
double x[10]; // 输入历史
double y[10]; // 输出历史
} iir_filter_t;
// 初始化IIR滤波器结构体
void iir_filter_init(iir_filter_t *filter, int order) {
filter->order = order;
for (int i = 0; i <= order; i++) {
filter->a[i] = 0.0;
filter->b[i] = 0.0;
filter->x[i] = 0.0;
filter->y[i] = 0.0;
}
filter->b[0] = 1.0;
}
// 计算IIR滤波器系数
void iir_filter_calculate_coefficients(iir_filter_t *filter, double fc, double fs) {
double wc = 2 * PI * fc / fs;
double alpha = sin(wc) / (2 * filter->order);
double beta = 0.5 * ((1 - cos(wc)) / (1 + cos(wc)));
filter->a[0] = 1.0;
filter->b[0] = beta;
for (int i = 1; i <= filter->order; i++) {
filter->a[i] = alpha;
filter->b[i] = beta;
}
}
// IIR滤波器处理输入信号
double iir_filter_process_sample(iir_filter_t *filter, double x) {
double y = 0.0;
for (int i = filter->order; i >= 1; i--) {
filter->x[i] = filter->x[i - 1];
filter->y[i] = filter->y[i - 1];
}
filter->x[0] = x;
for (int i = 0; i <= filter->order; i++) {
y += filter->b[i] * filter->x[i];
if (i > 0) {
y -= filter->a[i] * filter->y[i - 1];
}
}
filter->y[0] = y;
return y;
}
int main() {
// 创建一个IIR滤波器结构体
iir_filter_t filter;
iir_filter_init(&filter, 2); // 二阶IIR滤波器
// 计算IIR滤波器系数
double fc = 1000.0; // 截止频率为1kHz
double fs = 8000.0; // 采样率为8kHz
iir_filter_calculate_coefficients(&filter, fc, fs);
// 处理输入信号
double x[10] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
for (int i = 0; i < 10; i++) {
double y = iir_filter_process_sample(&filter, x[i]);
printf("%f\n", y);
}
return 0;
}
```
这个代码实现了一个二阶IIR滤波器,可以通过修改`order`的值来实现其他阶数的IIR滤波器。`iir_filter_init`函数用于初始化IIR滤波器结构体,`iir_filter_calculate_coefficients`函数用于计算IIR滤波器系数,`iir_filter_process_sample`函数用于处理输入信号。在这个示例中,我们将一个长度为10的输入信号`x`输入到IIR滤波器中,并输出每个样本的输出信号`y`。
阅读全文