在ADC的硬件设计中,都需要在模拟输入端加一个低通滤波器,称为抗混叠滤波器,抗混叠滤波器用于限制最高输入频率,如果需要降低采样率,则需要在代码中实现抽取操作,在抽取前也需要抽取滤波器以限制最高频率分量,当原始信号中含有大于fs/(2D)的频率分量(采样率fs,抽取因子D),抽取后的信号会出现混叠,当使用带宽为pai/D的滤波器,可实现抗混叠。
matlab的dsp.FIRDecimator函数实现了2倍抽取 滤波(截止角频率为0.4*pai),假如fs=650Hz,则fmax=325Hz,截止频率=0.4*fmax=130Hz,以下验证抽取滤波的效果。
验证代码如下:
代码语言:javascript复制clear;
fs=650;
t=0:1/fs:95-1/fs;
x = cos(2*pi*25*t') sin(2*pi*50*t') sin(2*pi*100*t') sin(2*pi*150*t');
x0=fft(x);
n=length(x);
x1=fftshift(x0);
f0 = (-n/2:n/2-1)*(fs/n);
power0=abs(x1).^2/n;
subplot(211);
stem(f0,power0);
xlabel('Frequency(Hz)')
ylabel('Power')
title('原始信号频谱');
H = dsp.FIRDecimator;
y = step(H,x);
y1=fft(y);
y2=fftshift(y1);
n=length(y);
f1 = (-n/2:n/2-1)*(fs/n);
power1 = abs(y2).^2/n; % 0-centered power
subplot(212);
stem(f1,power1);
xlabel('Frequency(Hz)')
ylabel('Power')
title('2倍抽取滤波后的信号频谱');
上图可以看出,2倍抽取扩展了频谱,原25Hz移动到50Hz,原50Hz移动到100Hz,原100Hz移动到200Hz,但是原150Hz移动到300Hz的功率几乎变为0,这即是滤波的效果,因为150Hz>截止频率130Hz,被过滤掉了。