数字信号处理系列文章,理论+实践,持续更新,欢迎关注@平凡的兵 一起共成长。
混叠现象
混叠:时域采样频率不足,导致高频信号混叠;两个要点,① 采样会将模拟频率转换为数字频率,② 时域采样对应频域周期化。
(对模拟频率和数字频率有困惑的请见上篇文章“一文搞懂模拟频率、数字频率、模拟角频率、采样频率”[微笑])
信号系统在ADC之前的PrF就是预处理滤波器,就是抗混叠滤波器,滤除高频信号,采样频率满足奈奎斯特定理(采样频率大于等于信号最高频率的两倍),使得后续处理的都是正常频率范围的信号,不会出现混叠现象。
泄露现象
两种情况会产生频谱泄露:① 频谱分辨率不足, ② 加窗截断。
频率分辨率不足,若目标信号频率不是频率分辨率的整数倍,能量会被分配到相近的频率。例如,若频率分辨率为10Hz,结果目标频率为105Hz,那么其能量只能显示在100Hz和110Hz上。
数据加窗截断处理,也会导致频谱泄露,窗函数和信号相乘,频域上相当于卷积,窗函数的频谱一般是由主瓣和副瓣组成,信号会泄露到副瓣。
这里通过一个例子来说明频率分辨率导致的泄露现象。
x(t) = cos(2π*100t) + cos(2π*105t), 信号频率为100Hz和105Hz,采样频率fs为10000Hz。
波形频率分辨率(The waveform frequency resolution)定义为:
FFT频率分辨率(The FFT resolution)定义为:
情况1:如果采样1000个点,时域信号的时长为0.1s。
这里波形频率分辨率为1/0.1=10Hz, FFT频率分辨率为10000/1000=10Hz。这样105Hz的信号就无法显示,会泄露到周边频率100Hz和110Hz。
%% x(t) = cos(2pi*100t) + cos(2pi*105t)
Fs = 10000;
T = 1/Fs;
L0 = 1000; % 信号长度
L = 1000; % 数据长度
t0 = linspace(0,L0-1, L0)*T;
x = cos(2*pi*100*t0) + cos(2*pi*105*t0);
t = linspace(0,L-1, L)*T;
figure(1);
plot(t*1e2, x);
xlabel('t');
ylabel('x[t]');
Y = fft(x);
P2 = abs(Y/L0);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(L/2))/L;
figure(2);
plot(f, P1,'Marker','.' , 'markersize', 10);
xlabel('f(Hz)');
ylabel('y(f)');
axis([0.5e2 1.5e2 0 1.5])
情况2:如果采样1000个点,时域信号的时长为0.1s,但是补零,补7000个零。频谱平滑了很多,但是依然有泄露,这是因为补零类似进行了插值操作,曲线更平滑。
情况3:如果采样8000个点,时域信号的时长为0.1s,波形频率分辨率为1.25Hz,这次就可以表征105Hz信号。
%% x(t) = cos(2pi*100t) + cos(2pi*105t)
Fs = 10000;
T = 1/Fs;
L0 = 8000; % 信号长度
L = 8000; % 数据长度
t0 = linspace(0,L0-1, L0)*T;
x = cos(2*pi*100*t0) + cos(2*pi*105*t0);
t = linspace(0,L-1, L)*T;
figure(1);
plot(t*1e2, x);
xlabel('t');
ylabel('x[t]');
Y = fft(x);
P2 = abs(Y/L0);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(L/2))/L;
figure(2);
plot(f, P1,'Marker','.' , 'markersize', 10);
axis([0.5e2 1.5e2 0 1.5])
xlabel('f(Hz)');
ylabel('y(f)');
栅栏现象
频率分辨率足够,但是由于FFT的点数不足,导致很多频率没有显示,如果进行补零操作,会显示更多频谱线。
如下图,4点和8点的FFT,4点FFT丢失了π/4、3π/4、5π/4、7π/4的频谱信息,就像栅栏一样屏蔽了这些信息。补零到8点,就恢复出来。
参考资料
[1] https://www.bitweenie.com/listings/fft-zero-padding/
[2] 深入浅出数字信号处理