C语言写一个高通滤波器
时间: 2023-12-29 18:45:15 浏览: 102
数字滤波器的C语言实现.zip_c 数字滤波器_包括高通、低通、带通滤波器_数字滤波器 c_数字滤波器的C语言实现_通带滤波器
5星 · 资源好评率100%
实现一个基于C语言的高通滤波器,您可以按照以下步骤进行:
1. 定义滤波器的参数:阶数、截止频率、采样频率等。
2. 计算滤波器系数,可以使用直接法或者间接法,其中直接法包括窗函数法、Butterworth法、Chebyshev法等,间接法包括双线性变换法、频率抽样法等。
3. 对输入信号进行滤波:读取输入信号,将其与滤波器系数进行卷积得到输出信号。
4. 输出滤波后的信号。
以下是一个示例程序,其中使用Butterworth法实现了一个4阶高通滤波器:
```
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
/* 定义滤波器参数 */
#define FILTER_ORDER 4
#define SAMPLE_RATE 44100.0
#define CUTOFF_FREQ 1000.0
int main()
{
/* 计算滤波器系数 */
double f0 = tan(CUTOFF_FREQ * PI / SAMPLE_RATE);
double r = 1.0 / (sqrt(2.0) * FILTER_ORDER);
double a[3][2] = {{1.0, 2.0 * cos(PI / 4.0) * f0}, {1.0, 2.0 * cos(3.0 * PI / 4.0) * f0}, {1.0, 2.0 * cos(5.0 * PI / 4.0) * f0}, {1.0, 2.0 * cos(7.0 * PI / 4.0) * f0}};
double b[3][2] = {{1.0, 0.0}, {-1.0, 0.0}, {1.0, 0.0}, {-1.0, 0.0}};
double c[3] = {r, r, r};
double d[3] = {1.0 - r * f0, 1.0 + r * f0, 1.0 + r * f0, 1.0 - r * f0};
double coef[FILTER_ORDER + 1][3] = {0};
int i, j;
for(i = 0; i <= FILTER_ORDER; i++)
{
for(j = 0; j < 3; j++)
{
coef[i][j] = c[j] * d[i] * a[i][j] + b[i][j];
}
}
/* 读取输入信号并进行滤波 */
FILE *fp_in = fopen("input.pcm", "rb");
FILE *fp_out = fopen("output.pcm", "wb");
short int input_buf[1024] = {0};
short int output_buf[1024] = {0};
double y[FILTER_ORDER + 1] = {0};
double x[FILTER_ORDER + 1] = {0};
int sample_size = sizeof(short int);
int sample_rate = SAMPLE_RATE;
int cutoff_freq = CUTOFF_FREQ;
int filter_order = FILTER_ORDER;
while(fread(input_buf, sample_size, 1024, fp_in))
{
for(i = 0; i < 1024; i++)
{
x[0] = input_buf[i] / 32768.0;
y[0] = coef[0][0] * x[0];
for(j = 1; j <= FILTER_ORDER; j++)
{
y[j] = coef[j][0] * x[j] + coef[j][1] * x[j-1] - coef[j][2] * y[j-1];
x[j] = x[j-1];
}
output_buf[i] = (short int)(y[FILTER_ORDER] * 32768.0);
}
fwrite(output_buf, sample_size, 1024, fp_out);
}
fclose(fp_in);
fclose(fp_out);
return 0;
}
```
注:以上是使用C语言实现高通滤波器的一种示例,实际实现方式可能因具体需要而有所不同。
阅读全文