借matlab仿真说明频谱泄露
1.频谱泄露的原因
简单来说是因为对信号的截断。
信号为无限长的序列,对其实施处理实际上是截取了一段信号。 对于非周期信号,无论怎么截取都会产生频谱泄露; 对于周期信号,当截取的部分不是其周期长度的整数倍时会产生频谱泄露。
2.频谱泄露的后果
频谱泄露导致的后果:主瓣展宽,主谱线旁边会出现旁瓣。其根本都是频谱的能量被泄露到其他频点上。
3.matlab仿真说明频谱泄露
对单频的正弦信号进行采样,观察采样频率的变化对频谱图有何影响。
clear all;
close all;
f=1e3;%信号频率
k=4;
fs=k*f;%采样频率
N=1000;%信号长度/采样点数
caiyangzhouqishu=N/k;%看拼音,采样周期数
n=[0:1:N-1];
x=n/fs;%时域横坐标
y=sin(2*pi*f*x);
figure
plot(x,y);
y_fft=fftshift(fft(y,N));
x_f=[-N/2:1:N/2-1];
x_f=x_f/N*fs;%频域横坐标
figure
plot(x_f,abs(y_fft));%双边频谱图
title("信号原频谱");
figure
stem(x_f,abs(y_fft));%双边频谱图
title("信号原频谱");
此时采样周期数是250,也就是说完整截取了250个周期,此时不会发生频谱泄露,所得到的频谱是干净的谱线:
若是将上述代码的 k=4 改成 k=6 ,此时采样周期数的值为166.667,为非整数,说明此时截取的信号并非整周期,就会发生频谱泄露。
分别用plot和stem作出频谱图:
频谱不再是单纯的一根谱线,主谱线的峰值也降低。
4.频谱泄露的解决办法——加窗
为什么对于周期信号,当截取的部分不是其周期长度的整数倍时会产生频谱泄露?
用一种通俗的说法,当截取信号的是整数个周期时,将信号进行延拓,得到的结果就是原始信号。当截取信号是非整数周期时,将信号进行延拓的结果与原始信号不同,引入了新的频率。
加窗的目的是使截取处突变的部分尽可能平滑,减少新引入的频率分量,以此抑制频谱泄露(只是抑制,不是避免)。
5.matlab仿真——加窗处理
clear all;
close all;
f=1e3;%信号频率
k=6;
fs=k*f;%采样频率
N=1000;%信号长度/采样点数
caiyangzhouqishu=N/k;%看拼音,采样周期数
n=[0:1:N-1];
x=n/fs;%时域横坐标
y=sin(2*pi*f*x);
figure
plot(x,y);
y_fft=fftshift(fft(y,N));
x_f=[-N/2:1:N/2-1];
x_f=x_f/N*fs;%频域横坐标
figure
plot(x_f,abs(y_fft));%双边频谱图
title("信号原频谱");
figure
stem(x_f,abs(y_fft));%双边频谱图
title("信号原频谱");
%% window
win = hanning(N)';%以信号点数生成汉宁窗(需转置再相乘
figure
plot(x,win);
title("窗函数");
y_win = y.*win;
figure
plot(x,y_win);
y_win_fft=fftshift(fft(y_win,N));
figure
plot(x_f,abs(y_win_fft));
title("信号加窗后频谱");
figure
plot(x_f,abs(y_fft));
hold on;
plot(x_f,abs(y_win_fft),"-r");
xlim([900,1100]);
legend("信号原频谱","信号加窗频谱");
title("信号原频谱和信号加窗频谱");
如图是汉宁窗的时域效果:
加窗的方法有时域相乘或频域卷积,代码所用的是时域相乘的方法(即加权)。
将加窗前后频谱对比图放大:
只做定性分析,可以明显看出主谱线以外的频谱得到抑制。
同样可以看出加窗的缺陷:主峰降低即信号能量也减小(因为是对整个信号进行加窗)。
总结
对信号非整周期截取会导致频谱泄露,引起主瓣展宽,出现旁瓣。解决方法是对截取的信号加窗处理。
于 2023-02-16 第一次整理编写
学习时整理,不当之处烦请指正
码字不易,留个赞再走吧