在CCS5402环境下用C语言设计一个人机交互的可以改变阶数和截止频率FIR高通滤波器
时间: 2024-02-23 15:02:26 浏览: 128
好的,我可以为你提供一种设计思路:
1. 首先定义一个结构体来存储FIR滤波器的参数,包括阶数、截止频率和滤波器系数。
```c
typedef struct {
int order; // 滤波器阶数
float cutoff_freq; // 截止频率
float *coeffs; // 滤波器系数指针
} fir_filter_t;
```
2. 接着,设计一个函数来生成FIR滤波器系数。可以使用经典的窗函数法,如Hamming窗、Hanning窗等。
```c
void generate_fir_coeffs(fir_filter_t *filter) {
// 计算窗函数
float window[filter->order];
for (int i = 0; i < filter->order; i++) {
window[i] = 0.54f - 0.46f * cosf(2.0f * M_PI * i / (filter->order - 1));
}
// 计算滤波器系数
filter->coeffs = (float*)malloc(filter->order * sizeof(float));
float sum = 0.0f;
for (int i = 0; i < filter->order; i++) {
float tmp = (i - (filter->order - 1) / 2) * filter->cutoff_freq;
if (tmp == 0.0f) {
filter->coeffs[i] = 2.0f * filter->cutoff_freq;
} else {
filter->coeffs[i] = sinf(2.0f * M_PI * filter->cutoff_freq * tmp) / tmp;
}
filter->coeffs[i] *= window[i];
sum += filter->coeffs[i];
}
// 归一化
for (int i = 0; i < filter->order; i++) {
filter->coeffs[i] /= sum;
}
}
```
3. 最后,设计一个主函数,通过人机交互来改变阶数和截止频率,并输出滤波后的结果。
```c
int main() {
fir_filter_t filter;
filter.order = 31;
filter.cutoff_freq = 0.1f;
generate_fir_coeffs(&filter);
float input_signal[] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
float output_signal[sizeof(input_signal) / sizeof(float)];
// FIR滤波
for (int i = 0; i < sizeof(input_signal) / sizeof(float); i++) {
float output = 0.0f;
for (int j = 0; j < filter.order; j++) {
if (i - j >= 0) {
output += filter.coeffs[j] * input_signal[i - j];
}
}
output_signal[i] = output;
}
// 输出结果
for (int i = 0; i < sizeof(output_signal) / sizeof(float); i++) {
printf("%f ", output_signal[i]);
}
printf("\n");
return 0;
}
```
在这个设计中,你可以通过人机交互来改变滤波器的阶数和截止频率,然后再重新计算滤波器系数,最后输出滤波后的结果。
阅读全文