设计一段c程序,由同一个正弦信号进行FIR和IIR滤波,比较两种滤波器的性能
时间: 2024-01-05 22:04:26 浏览: 121
好的,我理解您的问题了。下面是一份基于C语言的代码,该代码使用同一正弦信号进行FIR和IIR滤波,并比较了两种滤波器的性能。在代码中,我们将使用一个长度为N的FIR滤波器和一个二阶IIR滤波器。
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 10 // FIR filter length
#define A1 1.8 // IIR filter coefficients
#define A2 -0.81
#define B0 0.35
#define B1 0.7
int main()
{
// Generate input signal (sinusoidal)
float x[N];
for(int i=0; i<N; i++)
{
x[i] = sin(2*M_PI*i/N);
}
// FIR filter
float h[N] = {0.1, 0.2, 0.3, 0.2, 0.1, -0.1, -0.2, -0.3, -0.2, -0.1};
float y_fir[N];
for(int i=0; i<N; i++)
{
y_fir[i] = 0;
for(int j=0; j<N; j++)
{
if(i-j >= 0)
{
y_fir[i] += h[j] * x[i-j];
}
}
}
// IIR filter
float y_iir[N];
y_iir[0] = B0*x[0];
y_iir[1] = B0*x[1] + B1*x[0] - A1*y_iir[0];
for(int i=2; i<N; i++)
{
y_iir[i] = B0*x[i] + B1*x[i-1] - A1*y_iir[i-1] - A2*y_iir[i-2];
}
// Print results
printf("Input signal:\n");
for(int i=0; i<N; i++)
{
printf("%f ", x[i]);
}
printf("\n");
printf("FIR filtered signal:\n");
for(int i=0; i<N; i++)
{
printf("%f ", y_fir[i]);
}
printf("\n");
printf("IIR filtered signal:\n");
for(int i=0; i<N; i++)
{
printf("%f ", y_iir[i]);
}
printf("\n");
return 0;
}
```
在上面的代码中,我们首先生成了一个长度为N的正弦信号,然后使用一个长度为N的FIR滤波器和一个二阶IIR滤波器对其进行滤波。在FIR滤波器中,我们使用了一个对称的10点滤波器。在IIR滤波器中,我们使用了差分方程y[n] = B0*x[n] + B1*x[n-1] - A1*y[n-1] - A2*y[n-2]。
最后,我们打印了原始信号、FIR滤波器输出和IIR滤波器输出。您可以通过比较这些信号的图形或计算它们的MSE等指标来比较两种滤波器的性能。
阅读全文