C语言实现低通滤波器
时间: 2024-10-15 07:02:20 浏览: 29
在C语言中实现低通滤波器通常涉及到数字信号处理,可以使用离散傅立叶变换(DFT)和逆变换(IDFT)原理。一种常见的方法是巴特沃斯滤波器,它是一个线性相位滤波器,常用于音频处理等应用。下面是一个简单的模拟滤波器设计示例,通过IIR(无限 impulse response)结构:
```c
#include <stdio.h>
#include <math.h>
// 定义滤波器系数
#define FILTER_ORDER 4
#define CUT_OFF_FREQ 0.5 // 滤波截止频率
double b[FILTER_ORDER + 1] = {1}; // 直流分量
double a[FILTER_ORDER + 1];
void butterworth_lowpass(float *input, float *output, int sample_rate) {
double omega_c = M_PI * CUT_OFF_FREQ; // 角频率
for (int i = 1; i <= FILTER_ORDER; i++) {
double denominator = 1;
for (int j = 0; j < FILTER_ORDER + 1; j++) {
if (j != i)
denominator *= (omega_c * omega_c / ((float)i * (float)i - (float)j * (float)j));
}
b[i] /= denominator;
}
for (int i = 1; i <= FILTER_ORDER; i++)
a[i] = -b[i];
for (int n = 0; n < sample_rate; n++) {
float input_sample = *input++;
float output_sum = 0;
for (int k = 0; k <= FILTER_ORDER; k++) {
output_sum += b[k] * input_sample;
input_sample -= a[k] * output_sum;
}
*output++ = output_sum;
}
}
// 示例:输入和输出数组
float input_data[] = {/* your input data here */};
float output_data[/* size of input_data */];
// 调用滤波函数
butterworth_lowpass(input_data, output_data, sizeof(input_data)/sizeof(input_data[0]));
阅读全文