C语言IIR切比雪夫I型低通滤波器
时间: 2023-06-21 19:10:52 浏览: 446
IIR滤波器是一种数字滤波器,它可以用于对数字信号进行滤波处理。切比雪夫I型低通滤波器是一种常见的IIR滤波器,它的特点是在通带内具有最小的幅度波动,但在截止频率附近存在较大的幅度波动。
下面是C语言实现切比雪夫I型低通滤波器的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 4 // 滤波器阶数
#define PI 3.1415926
// 计算切比雪夫I型低通滤波器的系数
void chebyshev1_lowpass(float fc, float epsilon, float *a, float *b)
{
int i, j;
float theta, sn, cs, omega, beta, gamma, den;
float *c, *d;
c = (float *)malloc((N+1)*sizeof(float));
d = (float *)malloc((N+1)*sizeof(float));
// 计算极点
for (i = 1; i <= N; i++)
{
theta = PI*(2*i-1)/(2*N);
sn = sin(theta);
cs = cos(theta);
omega = sin(PI*fc)*sin(theta);
beta = 1/(1-epsilon*epsilon*omega*omega);
gamma = 2*epsilon*omega;
a[i] = -beta*(gamma + cs);
b[i] = beta*sn;
}
// 计算常数项
c[0] = 1;
c[1] = -a[1];
for (i = 2; i <= N; i++)
{
c[i] = 0;
for (j = 1; j <= i; j++)
{
c[i] += a[j]*c[i-j] - b[j]*d[i-j];
}
c[i] /= 1 - b[i]*b[i];
d[i] = c[i] - b[i]*d[i-1];
}
// 归一化
den = c[N];
for (i = 0; i <= N; i++)
{
a[i] /= den;
b[i] /= den;
}
free(c);
free(d);
}
// 切比雪夫I型低通滤波器滤波
void chebyshev1_filter(float *x, float *y, int len, float *a, float *b)
{
int i, j;
float *u, *v;
u = (float *)malloc((N+1)*sizeof(float));
v = (float *)malloc((N+1)*sizeof(float));
// 初始化
for (i = 0; i <= N; i++)
{
u[i] = v[i] = 0;
}
// 滤波
for (i = 0; i < len; i++)
{
y[i] = 0;
for (j = 0; j <= N; j++)
{
if (i-j >= 0)
{
y[i] += a[j]*u[j] - b[j]*v[j];
}
}
for (j = N; j >= 1; j--)
{
u[j] = u[j-1];
v[j] = v[j-1];
}
u[0] = x[i];
v[0] = y[i];
}
free(u);
free(v);
}
int main()
{
float fc = 1000; // 截止频率
float epsilon = 0.5; // 通带最大衰减量
float *a, *b, *x, *y;
int len = 1000; // 信号长度
int i;
a = (float *)malloc((N+1)*sizeof(float));
b = (float *)malloc((N+1)*sizeof(float));
x = (float *)malloc(len*sizeof(float));
y = (float *)malloc(len*sizeof(float));
// 生成测试信号
for (i = 0; i < len; i++)
{
x[i] = sin(2*PI*100*i/len) + sin(2*PI*500*i/len) + sin(2*PI*1000*i/len);
}
// 计算滤波器系数
chebyshev1_lowpass(fc/(len/2), epsilon, a, b);
// 滤波信号
chebyshev1_filter(x, y, len, a, b);
// 输出结果
for (i = 0; i < len; i++)
{
printf("%f,%f\n", x[i], y[i]);
}
free(a);
free(b);
free(x);
free(y);
return 0;
}
```
在这个例子中,我们生成了一个包含三个正弦信号的测试信号,并使用切比雪夫I型低通滤波器将其滤波。在输出结果中,我们可以看到滤波后的信号已经去除了截止频率以上的高频成分。
阅读全文