基于DSP的C语言实现FIR滤波器输入的信号是x(n)=sin(2*pi*f1*n/fs) + sin(2*pi*f2/fs) 其中,f1=100Hz,f2=300,fs=800; 所设计的滤波器是一个低通FIR滤波器,使用的是hamming窗,阶数为10
时间: 2024-02-26 15:56:23 浏览: 103
好的,下面是一个基于DSP的C语言实现上述要求的FIR滤波器的代码示例:
```c
#define N 10 // FIR滤波器的阶数
float b[N+1] = {0.057, 0.076, 0.105, 0.142, 0.184, 0.227, 0.266, 0.295, 0.309, 0.303, 0.275}; // FIR滤波器的系数
float x[N+1]; // 输入信号的缓存,长度为N+1
int ptr = 0; // 输入信号的指针
float hamming_window(int i, int n)
{
return 0.54 - 0.46 * cos(2 * PI * i / (n - 1));
}
float fir_filter(float x)
{
static float shift_reg[N+1]; // 移位寄存器
float y = 0.0;
int i;
// 将新的输入值加入移位寄存器的最前面
for (i = N; i > 0; i--) {
shift_reg[i] = shift_reg[i-1];
}
shift_reg[0] = x;
// 计算滤波器的输出
for (i = 0; i <= N; i++) {
y += b[i] * shift_reg[i] * hamming_window(i, N+1);
}
return y;
}
float sin_wave(float f, float fs, int n)
{
return sin(2 * PI * f * n / fs);
}
int main()
{
const float f1 = 100.0; // 输入信号的频率1
const float f2 = 300.0; // 输入信号的频率2
const float fs = 800.0; // 采样率
int i;
float y;
// 生成输入信号
for (i = 0; i <= N; i++) {
x[i] = sin_wave(f1, fs, i) + sin_wave(f2, fs, i);
}
// 对输入信号进行滤波
for (i = 0; i <= N; i++) {
y = fir_filter(x[ptr]);
ptr = (ptr + 1) % (N + 1);
printf("%f\n", y);
}
return 0;
}
```
这个代码实现了一个10阶的低通FIR滤波器,使用的是hamming窗。输入信号的频率1是100Hz,频率2是300Hz,采样率是800Hz。在`main`函数中,首先生成长度为N+1的输入信号,然后对输入信号进行滤波并输出结果。注意,这里使用了一个输入信号的缓存`x`,长度为N+1。每次滤波时,将最新的输入值加入缓存的最前面,然后调用`fir_filter`函数计算滤波器的输出。最后将指针`ptr`向前移动一个位置,以准备接收下一个输入值。
阅读全文