基于DSP的C语言23阶高通滤波器的完整代码
时间: 2023-12-22 11:03:24 浏览: 38
下面是一个基于DSP的C语言23阶高通滤波器的完整代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.14159265358979323846
// 高通滤波器参数
#define FILTER_ORDER 23 // 滤波器阶数
#define CUTOFF_FREQ 1000 // 截止频率
// 数字滤波器结构体
typedef struct {
double *b; // 分子系数数组
double *a; // 分母系数数组
double *x; // 输入数据缓冲区
double *y; // 输出数据缓冲区
int order; // 滤波器阶数
} digital_filter_t;
// 创建数字滤波器
digital_filter_t *create_filter(int order) {
digital_filter_t *filter = (digital_filter_t *) malloc(sizeof(digital_filter_t));
filter->b = (double *) malloc(sizeof(double) * (order + 1));
filter->a = (double *) malloc(sizeof(double) * (order + 1));
filter->x = (double *) calloc(order + 1, sizeof(double));
filter->y = (double *) calloc(order + 1, sizeof(double));
filter->order = order;
return filter;
}
// 销毁数字滤波器
void destroy_filter(digital_filter_t *filter) {
free(filter->b);
free(filter->a);
free(filter->x);
free(filter->y);
free(filter);
}
// 计算数字滤波器系数
void calc_filter_coeffs(digital_filter_t *filter, double cutoff_freq, double sample_rate) {
double omega = 2 * PI * cutoff_freq / sample_rate;
double alpha = sin(omega) / (2 * filter->order);
double a0 = 1 + 2 * alpha;
double a1 = -2 * cos(omega);
double a2 = 1 - 2 * alpha;
double b0 = (1 + cos(omega)) / 2;
double b1 = -1 - cos(omega);
double b2 = (1 + cos(omega)) / 2;
filter->b[0] = b0 / a0;
filter->b[1] = b1 / a0;
filter->b[2] = b2 / a0;
filter->a[0] = 1;
filter->a[1] = a1 / a0;
filter->a[2] = a2 / a0;
}
// 应用数字滤波器
double apply_filter(digital_filter_t *filter, double x) {
double y = filter->b[0] * x + filter->b[1] * filter->x[1] + filter->b[2] * filter->x[2]
- filter->a[1] * filter->y[1] - filter->a[2] * filter->y[2];
filter->x[2] = filter->x[1];
filter->x[1] = x;
filter->y[2] = filter->y[1];
filter->y[1] = y;
return y;
}
int main() {
double sample_rate = 48000; // 采样率
double cutoff_freq = CUTOFF_FREQ; // 截止频率
digital_filter_t *filter = create_filter(FILTER_ORDER); // 创建数字滤波器
calc_filter_coeffs(filter, cutoff_freq, sample_rate); // 计算数字滤波器系数
// 产生测试数据
int data_len = 1000;
double data[data_len];
for (int i = 0; i < data_len; i++) {
double t = (double) i / sample_rate;
data[i] = sin(2 * PI * 1000 * t) + 0.1 * sin(2 * PI * 100 * t) + 0.01 * sin(2 * PI * 2000 * t);
}
// 应用数字滤波器
for (int i = 0; i < data_len; i++) {
data[i] = apply_filter(filter, data[i]);
}
// 输出结果
for (int i = 0; i < data_len; i++) {
printf("%f\n", data[i]);
}
destroy_filter(filter); // 销毁数字滤波器
return 0;
}
```
这是一个简单的示例,仅供参考。实际使用时,需要根据自己的需求进行修改和优化。