【STM32F407的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容易在这个地方不理解。