请编写一个基于C语言的带通滤波器,中心频率为1000Hz,放大倍数为26倍
时间: 2024-03-23 14:39:23 浏览: 114
好的,以下是一个基于C语言的带通滤波器,中心频率为1000Hz,放大倍数为26倍的代码示例:
```
#include <stdio.h>
#include <math.h>
#define SAMPLE_RATE 44100.0 // 采样率
#define GAIN 26.0 // 放大倍数
#define CENTER_FREQ 1000.0 // 中心频率
#define BANDWIDTH 200.0 // 带宽
#define PI 3.141592653589793
// 计算滤波器系数
void calc_filter_coeffs(double *b0, double *b1, double *b2, double *a1, double *a2)
{
double w0 = 2.0 * PI * CENTER_FREQ / SAMPLE_RATE;
double bw = BANDWIDTH / CENTER_FREQ;
double alpha = sin(w0) * sinh(log(2.0) / 2.0 * bw * w0 / sin(w0));
double cosw0 = cos(w0);
double a = pow(10, GAIN / 40.0);
double beta = sqrt(a) / alpha;
*b0 = alpha * a;
*b1 = 0.0;
*b2 = -alpha * a;
*a1 = -2.0 * cosw0;
*a2 = 1.0 - beta * alpha;
}
// 初始化滤波器状态变量
void init_filter_state(double *x1, double *x2, double *y1, double *y2)
{
*x1 = 0.0;
*x2 = 0.0;
*y1 = 0.0;
*y2 = 0.0;
}
// 实现带通滤波器
double bandpass_filter(double input, double b0, double b1, double b2, double a1, double a2, double *x1, double *x2, double *y1, double *y2)
{
double output = b0 / a2 * input + b1 / a2 * (*x1) + b2 / a2 * (*x2) - a1 / a2 * (*y1) - a2 / a2 * (*y2);
*x2 = *x1;
*x1 = input;
*y2 = *y1;
*y1 = output;
return output;
}
int main()
{
double b0, b1, b2, a1, a2;
double x1, x2, y1, y2;
double input_signal = 0.0; // 输入信号
double output_signal = 0.0; // 输出信号
// 计算滤波器系数
calc_filter_coeffs(&b0, &b1, &b2, &a1, &a2);
// 初始化滤波器状态变量
init_filter_state(&x1, &x2, &y1, &y2);
// 模拟输入信号,这里使用简单的正弦波
for (int i = 0; i < 44100; i++)
{
input_signal = sin(2.0 * PI * 1000.0 * i / SAMPLE_RATE);
output_signal = bandpass_filter(input_signal, b0, b1, b2, a1, a2, &x1, &x2, &y1, &y2);
printf("%.12f\n", output_signal);
}
return 0;
}
```
在这个示例中,我们使用了一个双二阶IIR滤波器来实现带通滤波器。通过调用`calc_filter_coeffs`函数来计算滤波器系数,然后使用`init_filter_state`函数来初始化滤波器状态变量。在每次输入一个新的信号值时,调用`bandpass_filter`函数来处理信号,得到输出信号值。最后,我们使用一个简单的正弦波来模拟输入信号,并将输出信号输出到控制台上。您可以根据您的实际需求进行修改。
阅读全文