生成一个c程序,能够通过对同一信号进行FIR和IIR滤波,并且能够通过CCS编译仿真,在CCS中显示原始信号波形、原始信号频谱、FIR滤波后信号波形、FIR滤波后信号频谱、IIR滤波后信号波形、IIR滤波后信号波形显示出来
时间: 2023-08-18 12:09:55 浏览: 143
下面是一个基本的能够通过对同一信号进行FIR和IIR滤波的C程序,可以使用CCS编译仿真并显示相关波形和频谱。请注意,这只是一个简单的示例程序,需要根据您的具体要求进行修改和优化。
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 128 // 信号长度
#define M 10 // FIR滤波器阶数
#define L 4 // IIR滤波器阶数
#define PI 3.1415926535 // 圆周率
// 原始信号数组
float x[N];
// FIR滤波器系数数组
float h[M] = {0.1, 0.2, 0.3, 0.2, 0.1, -0.1, -0.2, -0.3, -0.2, -0.1};
// IIR滤波器系数数组
float a[L+1] = {1.0, 0.5, 0.2, 0.1, 0.05};
float b[L+1] = {0.2, 0.1, 0.05, 0.02, 0.01};
// FFT计算
void fft(float *x, float *y, int n)
{
int i, j, k, m;
float xr, xi, yr, yi, tr, ti, logn;
logn = log((float)n) / log(2.0);
for (i = 0; i < n; i++) {
j = 0;
for (k = 0; k < logn; k++)
j |= ((i >> k) & 1) << (logn - 1 - k);
if (j > i) {
tr = x[i];
ti = y[i];
x[i] = x[j];
y[i] = y[j];
x[j] = tr;
y[j] = ti;
}
}
for (m = 2; m <= n; m <<= 1) {
xr = cos(-2 * PI / m);
xi = sin(-2 * PI / m);
for (i = 0; i < n; i += m) {
yr = 1.0;
yi = 0.0;
for (j = i; j < i + m / 2; j++) {
tr = xr * x[j + m / 2] - xi * y[j + m / 2];
ti = xr * y[j + m / 2] + xi * x[j + m / 2];
x[j + m / 2] = x[j] - tr;
y[j + m / 2] = y[j] - ti;
x[j] += tr;
y[j] += ti;
}
}
}
}
// FIR滤波器
void fir(float *x, float *y, int n, float *h, int m)
{
int i, j;
float sum;
for (i = 0; i < n; i++) {
sum = 0.0;
for (j = 0; j < m; j++) {
if (i >= j)
sum += h[j] * x[i - j];
}
y[i] = sum;
}
}
// IIR滤波器
void iir(float *x, float *y, int n, float *a, float *b, int l)
{
int i, j;
float sum;
for (i = 0; i < n; i++) {
sum = b[0] * x[i];
for (j = 1; j <= l; j++) {
if (i >= j)
sum += b[j] * x[i - j] - a[j] * y[i - j];
}
y[i] = sum;
}
}
// 主函数
int main()
{
int i;
float xr[N], xi[N], yr[N], yi[N];
// 生成原始信号
for (i = 0; i < N; i++) {
x[i] = sin(2 * PI * i / N) + 0.5 * sin(4 * PI * i / N);
}
// FIR滤波器
fir(x, xr, N, h, M);
// FFT计算
for (i = 0; i < N; i++) {
xi[i] = 0.0;
}
fft(xr, xi, N);
// 输出原始信号波形和频谱
for (i = 0; i < N; i++) {
printf("%d,%f,%f\n", i, x[i], xi[i] * xi[i] + xi[i] * xi[i]);
}
// 输出FIR滤波后信号波形和频谱
for (i = 0; i < N; i++) {
printf("%d,%f,%f\n", i, xr[i], xi[i] * xi[i] + xi[i] * xi[i]);
}
// IIR滤波器
iir(x, yr, N, a, b, L);
// FFT计算
for (i = 0; i < N; i++) {
yi[i] = 0.0;
}
fft(yr, yi, N);
// 输出IIR滤波后信号波形和频谱
for (i = 0; i < N; i++) {
printf("%d,%f,%f\n", i, yr[i], yi[i] * yi[i] + yi[i] * yi[i]);
}
return 0;
}
```
请注意,此程序需要在CCS中进行编译和仿真。您需要在CCS中创建一个新的工程,将此代码添加到源文件中,并添加必要的头文件和库文件。然后,您可以通过CCS中的仿真工具查看原始信号波形、原始信号频谱、FIR滤波后信号波形、FIR滤波后信号频谱、IIR滤波后信号波形、IIR滤波后信号波形。
阅读全文