利用C语言设计一个低通FIR滤波器,其中使用阶数为10的汉明窗,输入信号为x(n)=sin(2*pi*f1*n/fs) + sin(2*pi*f2/fs),其中f1=100Hz,f2=300,fs=800,汉明窗参数B = [166,0,-1374,0,9453,16279,9453,0,-1374,0,166]
时间: 2024-02-26 22:57:35 浏览: 25
好的,我来为您详细讲解一下。
首先,汉明窗(Hamming Window)是一种常用的窗函数,它可以用来设计数字信号处理中的滤波器和谱估计。对于一个给定的时域信号,通过对其加窗,可以在频域上进行截止频率的限制和波形的平滑。
其次,低通FIR滤波器是指只允许低于一定频率的信号通过的一种滤波器。FIR(Finite Impulse Response)滤波器是一种线性时不变系统,其系统函数只有有限个非零的系数,因此也称为有限长冲激响应滤波器。
下面是使用汉明窗设计低通FIR滤波器的C语言代码:
```c
#include <stdio.h>
#include <math.h>
#define PI 3.1415926
#define N 11 // FIR滤波器阶数
#define fs 800 // 采样频率
#define f1 100 // 信号频率1
#define f2 300 // 信号频率2
#define B { 166, 0, -1374, 0, 9453, 16279, 9453, 0, -1374, 0, 166 } // 汉明窗参数
int main()
{
double x, y, h[N], w[N], sum = 0, yout;
// 计算汉明窗系数
for (int i = 0; i < N; i++) {
w[i] = B[i] / 32768.0;
}
// 计算FIR滤波器系数
for (int i = 0; i < N; i++) {
if (i == (N-1)/2) {
h[i] = 2*f2/fs;
} else {
h[i] = sin(2*PI*f2*(i-(N-1)/2)/fs) / (PI*(i-(N-1)/2));
}
h[i] *= w[i];
sum += h[i];
}
// 归一化滤波器系数
for (int i = 0; i < N; i++) {
h[i] /= sum;
}
// 输出滤波器系数
printf("FIR滤波器系数:\n");
for (int i = 0; i < N; i++) {
printf("%.6f ", h[i]);
}
// 输入信号
printf("\n请输入信号x(n):\n");
for (int n = 0; n < 10; n++) {
x = sin(2*PI*f1*n/fs) + sin(2*PI*f2*n/fs);
// FIR滤波器处理
y = 0;
for (int i = 0; i < N; i++) {
if (n-i >= 0) {
y += h[i] * sin(2*PI*f1*(n-i)/fs);
}
}
// 输出滤波器输出
printf("x(%d)=%.6f, y(%d)=%.6f\n", n, x, n, y);
}
return 0;
}
```
在这段代码中,我们首先定义了PI、N、fs、f1、f2和B六个常量,分别表示圆周率、滤波器的阶数、采样频率、信号频率1、信号频率2和汉明窗参数。然后计算汉明窗系数和滤波器系数,最后进行系数归一化并输出结果。
接着,我们输入了一个由两个正弦波叠加而成的信号,然后使用FIR滤波器对其进行处理,并输出输入信号和输出信号的值。
需要注意的是,由于在计算滤波器系数时使用了除法运算,可能会出现分母为0的情况。此时我们需要特殊处理,即当i=(N-1)/2时,令h[i]=2*f2/fs,即可避免除数为0的情况。
希望这段代码能够对您有所帮助。