【STM32H7的DSP教程】第41章 FIR滤波器的群延迟(重要)

完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547

第41章       FIR滤波器的群延迟(重要)

本章节为大家介绍FIR滤波器的群延迟问题。

41.1 FIR滤波器介绍

41.2 总结

 

41.1 FIR滤波后的群延迟

波形经过FIR滤波器后,输出的波形会有一定的延迟。对于线性相位的FIR,这个群延迟就是一个常数。但是实际应用中这个群延迟是多少呢? 关于群延迟的数值,filterDesigner工具箱会根据用户的配置计算好。

比如前面章节设计的28阶FIR高通,低通,带通和带阻滤波器的群延迟就是14,反映在实际的采样值上就是滤波后输出数据的第15个才是实际滤波后的波形数据起始点。

下面是群延迟采样点的位置:

 

细心的读者可能发现全面做低通,高通,带通和带阻滤波后,输出的波形前面几个点感觉有问题,其实就是群延迟造成的。

为了更好的说明这个问题,下面再使用Matlab举一个低通和一个高通滤波的例子:信号由50Hz正弦波和200Hz正弦波组成,采样率1Kbps,截止频率125Hz,采样320个数据,采用函数fir1进行设计,滤波器阶数设置为28。下面是低通滤波器的Matlab代码,将原始信号从第一个点开始显示,而滤波后的信号从群延迟后的第15个点开始显示:

fs=1000;                  %设置采样频率 1K
N=320;                    %采样点数      
n=0:N-1;
t=n/fs;                    %时间序列
f=n*fs/N;                  %频率序列

x1=sin(2*pi*50*t);
x2=sin(2*pi*200*t);
x=sin(2*pi*50*t)+sin(2*pi*200*t);  %50Hz和200Hz正弦波混合               

plot(n, x1, 'b');   %绘制信号x的波形  
xlabel('时间');
ylabel('幅值');
title('原始信号和滤波后信号');
hold on;
  
b=fir1(28, 125/500);     %获得滤波器系数,截止频率125Hz.
y=filter(b, 1, x);
plot(n(1:305), y(15:319), 'r');
legend('原始信号','滤波后信号');
grid on;

Matlab的运行结果如下:

 

可以看出,显示波形基本重合,这个说明14个采样点的群延迟是正确的。下面同样使用上面的那个例子实现一个高通滤波器,截止频率是125Hz,阶数同样设置为28,将原始信号从第一个点开始显示,而滤波后的信号从群延迟后的第15个点开始显示,Matlab运行代码如下:

fs=1000;                  %设置采样频率 1K
N=320;                   %采样点数      
n=0:N-1;
t=n/fs;                    %时间序列
f=n*fs/N;                  %频率序列

x1=sin(2*pi*50*t);
x2=sin(2*pi*200*t);
x=sin(2*pi*50*t)+sin(2*pi*200*t);  %50Hz和200Hz正弦波混合               

plot(n, x2, 'b');   %绘制信号x的波形  
xlabel('时间');
ylabel('幅值');
title('原始信号和滤波后信号');
hold on;
  
b=fir1(28, 125/500, 'high');     %获得滤波器系数,截止频率125Hz.
y=filter(b, 1, x);
plot(n(1:305), y(15:319), 'r');
legend('原始信号','滤波后信号');
grid on;

Matlab运行结果如下:

 

可以看出,显示波形基本重合,这个说明14个采样点的群延迟也是是正确的。大家在使用FIR滤波器的时候一定要注意这个问题。

41.2 总结

本章节介绍的知识点比较重要,首次使用FIR容易在这个地方不理解。

posted @ 2021-08-06 17:25  硬汉嵌入式  阅读(393)  评论(0编辑  收藏  举报