帮忙写一个c语言的一维带通滤波函数
时间: 2024-02-16 17:04:27 浏览: 62
数字滤波器的C语言实现.zip_c 数字滤波器_包括高通、低通、带通滤波器_数字滤波器 c_数字滤波器的C语言实现_通带滤波器
5星 · 资源好评率100%
好的,以下是一个简单的一维带通滤波函数的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 100 //定义输入信号的长度
#define M 9 //定义滤波器的长度
#define fs 1000 //定义采样频率
void bandpass_filter(double *input, double *output, int length, double fl, double fh)
{
int i, j, k;
double h[M]; //定义滤波器系数数组
double sum;
//计算滤波器系数
for (i = 0; i < M; i++) {
if (i == (M-1)/2) {
h[i] = 2 * (fh - fl) / fs;
} else {
h[i] = (sin(2 * M_PI * fh * (i - (M-1)/2) / fs) - sin(2 * M_PI * fl * (i - (M-1)/2) / fs)) / (M_PI * (i - (M-1)/2));
}
}
//进行带通滤波
for (i = 0; i < length; i++) {
sum = 0;
for (j = 0; j < M; j++) {
k = i - j + (M-1)/2;
if (k >= 0 && k < length) {
sum += input[k] * h[j];
}
}
output[i] = sum;
}
}
int main()
{
double input[N], output[N];
int i;
//生成测试输入信号
for (i = 0; i < N; i++) {
input[i] = 0.5 * sin(2 * M_PI * 50 * i / fs) + 0.5 * sin(2 * M_PI * 150 * i / fs);
}
//进行带通滤波
bandpass_filter(input, output, N, 80, 120);
//输出滤波后的信号
for (i = 0; i < N; i++) {
printf("%f\n", output[i]);
}
return 0;
}
```
该函数的输入参数包括一个指向输入信号数组的指针,一个指向输出信号数组的指针,输入信号的长度,带通滤波的下限频率和上限频率。函数首先计算带通滤波器的系数,然后将输入信号与滤波器卷积得到输出信号。在main函数中,我们生成了一个包含50Hz和150Hz正弦波的测试输入信号,并进行了带通滤波,最后输出了滤波后的信号。
阅读全文