C语言切比雪夫I型低通滤波器
时间: 2023-06-21 20:10:51 浏览: 180
设计切比雪夫Ⅱ型低通滤波器
5星 · 资源好评率100%
切比雪夫I型低通滤波器是数字信号处理中常用的一种滤波器,它是一种有限长单位脉冲响应(FIR)滤波器,可以对数字信号进行低通滤波。C语言实现切比雪夫I型低通滤波器的步骤如下:
1. 定义滤波器参数:截止频率、通带最大衰减、阻带最小衰减等。
2. 计算滤波器系数:根据滤波器参数,利用公式计算出滤波器的系数。
3. 实现滤波器:利用滤波器系数和输入信号,进行卷积运算得到输出信号。
以下是一个示例代码:
```c
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
// 定义滤波器参数
#define Fs 8000.0 // 采样频率
#define Fc 1000.0 // 截止频率
#define Ap 1 // 通带最大衰减
#define As 50 // 阻带最小衰减
// 计算滤波器系数
void chebyshev_fir(double *h, int N)
{
double eps = sqrt(pow(10, As / 10.0) - 1);
double u = acosh(sqrt(pow(10, Ap / 10.0) - 1) / eps) / N;
double beta = sinh(u) * cosh(N * acosh(sqrt(pow(10, Ap / 10.0) - 1)));
double alpha = sin(PI * Fc / Fs) * sinh(u);
for (int n = 0; n < N; n++)
{
if (n == (N - 1) / 2)
{
h[n] = alpha / PI;
}
else
{
double wn = sin(PI * (n - (N - 1) / 2.0) / N);
double x = beta * sqrt(1 - pow(wn / sinh(u), 2));
double y = cosh(N * acosh(wn / sinh(u))) * cos(n * acos(alpha / x));
h[n] = y / PI;
}
}
}
// 实现滤波器
void filter(double *x, double *y, double *h, int N, int L)
{
for (int n = 0; n < L; n++)
{
y[n] = 0;
for (int k = 0; k < N; k++)
{
if (n - k >= 0)
{
y[n] += h[k] * x[n - k];
}
}
}
}
int main()
{
// 输入信号
double x[] = {1, 2, 3, 4, 5, 6, 7, 8};
// 计算滤波器系数
int N = 51; // 滤波器阶数
double h[N];
chebyshev_fir(h, N);
// 实现滤波器
int L = sizeof(x) / sizeof(x[0]);
double y[L];
filter(x, y, h, N, L);
// 输出结果
printf("Input signal: ");
for (int i = 0; i < L; i++)
{
printf("%.2f ", x[i]);
}
printf("\n");
printf("Output signal: ");
for (int i = 0; i < L; i++)
{
printf("%.2f ", y[i]);
}
printf("\n");
return 0;
}
```
这段代码实现了一个51阶的切比雪夫I型低通滤波器,对一个长度为8的输入信号进行滤波,并输出滤波后的结果。需要注意的是,在实际应用中,滤波器的阶数、截止频率等参数需要根据具体情况进行选择和调整。
阅读全文