基于DSP的C语言实现FIR滤波器输入的信号是x(n)=sin(2pif1n/fs) + sin(2pi*f2/fs) 其中,f1=100Hz,f2=300,fs=800; 所设计的滤波器是一个低通FIR滤波器,使用的是hamming窗,阶数为10 其中B = [166,0,-1374,0,9453,16279,9453,0,-1374,0,166](滤波器的系数可以自行设计) a、完成滤波器设计的C语言程序; b、通过Tools->Graph->FFT Magnitude观察输入输出信号频谱的变化。
时间: 2024-02-26 20:56:26 浏览: 124
以下是基于DSP的C语言实现FIR滤波器的程序:
```c
#include <stdio.h>
#include <math.h>
#define PI 3.1415926
void hamming(int N, float w[]);
void conv(int N, float x[], int L, float h[], int M, float y[]);
int main()
{
int N = 11; // 滤波器长度
float w[N]; // 窗函数
float h[N] = {166, 0, -1374, 0, 9453, 16279, 9453, 0, -1374, 0, 166}; // 滤波器系数
int L = 2000; // 信号长度
float x[L]; // 输入信号
float y[L]; // 输出信号
int i;
// 生成输入信号
float f1 = 100; // f1 = 100Hz
float f2 = 300; // f2 = 300Hz
float fs = 800; // fs = 800Hz
for (i = 0; i < L; i++) {
x[i] = sin(2 * PI * f1 * i / fs) + sin(2 * PI * f2 * i / fs);
}
// 生成窗函数
hamming(N, w);
// 窗函数归一化
float sum_w = 0;
for (i = 0; i < N; i++) {
sum_w += w[i];
}
for (i = 0; i < N; i++) {
w[i] /= sum_w;
}
// 窗函数与滤波器系数相乘
for (i = 0; i < N; i++) {
h[i] *= w[i];
}
// 进行卷积
conv(N, x, L, h, N, y);
// 输出结果
for (i = 0; i < L; i++) {
printf("%f\n", y[i]);
}
return 0;
}
void hamming(int N, float w[])
{
int i;
for (i = 0; i < N; i++) {
w[i] = 0.54 - 0.46 * cos(2 * PI * i / (N - 1));
}
}
void conv(int N, float x[], int L, float h[], int M, float y[])
{
int n, m;
for (n = 0; n < L; n++) {
y[n] = 0;
for (m = 0; m < N; m++) {
if (n - m >= 0 && n - m < L) {
y[n] += x[n - m] * h[m];
}
}
}
}
```
运行程序后,可以得到输出信号 `y`,然后在软件中使用 FFT 分析工具观察输入输出信号频谱的变化。
需要注意的是,这里使用的是 C 语言实现的 FIR 滤波器,如果使用 Simulink 等工具,可以更方便地进行信号处理和频谱分析。
阅读全文