【20211228】【信号处理】从 Matlab 仿真角度理解频谱泄露

一、频谱泄露

1. 定义

        频谱泄露会导致主谱线旁边有很多旁瓣,这会造成谱线间的干扰,严重的可能是旁瓣能量强到分不清哪个是主瓣,这就是所谓的谱间干扰。

        (参考:FFT造成的频谱混叠,栅栏效应,频谱泄露,谱间干扰

2. 产生原因

        信号被非周期截断,导致延拓信号和原信号的相位不连续,那么做 FFT 变换,得到的频谱就会发生频谱泄露。所以发生频谱泄露的原因是:信号被非周期截断/加窗。

        如下图:图 1 的第 1 个子图是信号被周期截断,第 2 个子图是被非周期截断,它们的傅里叶变换见图 2。可以看到第 1 个子图的 FFT 能量集中在某个频率,而第 2 个子图在主频点附近的频点上,也有许多不可忽视的能量,即主频点能量泄漏到附近频点上。

        (参考:如何理解频谱泄露?

        (参考:傅里叶变换学习笔记(二)——栅栏效应、频谱泄漏与加窗

图1 

图2 

        (参考:频谱泄露和加窗

3. 解决办法

        时域中的突变点会对 FFT 之后的频谱有明显的影响,并且频谱泄露的程度取决于时域信号边界的不连续程度,解决办法是:周期截断信号。

        但很难做到周期截断,只能引入分窗算法,通过加窗的方式使截断加窗后的信号尽可能地接近周期信号(只不过一个窗信号就是一个周期)

        注:加窗只能减少频谱泄露,但不能解决频谱泄露!

        (参考:【信号处理】基础知识——加窗windowing

二、举个栗子

%% 频谱泄露
clear; clc; close all; warning off;

%% 参数设置
fs = 100;  % 采样频率(满足奈奎斯特采样定理:要大于信号最大频率的两倍!!!)
L = 5;  % 时间长度
t = 0 : 1/fs : L;  % 时间坐标
t(1) = [];

%% 生成信号
f = 6;  % 信号频率
s0 = sin(2 * pi * f * t);

% 加窗
winFunc = hamming(length(s0))';  % 汉明窗
s1 = s0 .* winFunc;  

%% FFT
numfft = 1024;  % FFT点数
f = (0 : numfft/2-1) / numfft * fs;  % 频率(只取正频部分)

s_fft = fft(s0, numfft);  
p = abs(s_fft(1:numfft/2)) / numfft;  % 功率(只取正频部分)

s1_fft = fft(s1, numfft);  
p1 = abs(s1_fft(1:numfft/2)) / numfft;  % 功率(只取正频部分)

%% 作图
figure(1);
subplot(2, 1, 1);
plot(s0, 'linewidth', 1.5); title('原始信号时域波形'); axis('tight'); ylim([-1.2, 1.2]); 
subplot(2, 1, 2);
plot(s1, 'linewidth', 1.5); title('加窗信号时域波形'); axis('tight'); ylim([-1.2, 1.2]); 

figure(2);
sp1 = subplot(2, 1, 1);
plot(f, p, 'linewidth', 1.5); axis('tight'); title(['原始信号s0的', num2str(numfft), '点傅里叶变换']);
sp2 = subplot(2, 1, 2);
plot(f, p1, 'linewidth', 1.5); axis('tight'); title(['加窗信号s1的', num2str(numfft), '点傅里叶变换']);
linkaxes([sp1, sp2], 'x');

局部放大之后: 

         从上图分析得到,原始信号是被非周期截断的,所以得到的 FFT 发生了频谱泄露现象,体现在主频附近一些频点有较高的能量。而经过加窗处理后的信号类似于周期信号,所以加窗信号的 FFT 的频谱泄露现象减少(但不是消除!)。

        原理见下图:

         (参考:频谱泄露和吉布斯现象

  • 9
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
MATLAB使用FFT做频谱分析时频率分辨率问题-频率分辨率.rar MATLAB使用FFT做频谱分析时频率分辨率问题 最近做FFT时,使用的采样频率和信号长度的取舍一直没有搞清楚,后来在论坛上发了一个贴子《总结一下使用FFT和维纳-辛钦定理求解PSD问题》(讨论见https://www.ilovematlab.cn/thread-27150-1-1.html,特别感谢会员songzy41,他的问题给了我很大启示),跟帖中给了我不少启示,并且让我对“频率分辨率”这个概念有了更深入的理解。再次一并感谢论坛的高手们。 频率分辨率,顾名思义,就是将信号中两个靠的很近的频谱分开的能力。 信号x长度为Ts,通过傅氏变换后得到X,其频率分辨率为Δf=1/T(Hz),若经过采样后,假设采样频率为fs=1/Ts,而进行频谱分析时要将这个无穷长的序列使用窗函数截断处理,假设使用矩形窗,我们知道,矩形窗的频谱为sinc函数,主瓣宽度可以定义为2*pi/M,M为窗宽,那么,时域相乘相当于频域卷积,频域内,这一窗函数能够分辨出的最近频率肯定不可能小于2*pi/M了,也就是如果数据长度不能满足2*pi/M<|w2-w1|(w2,w1为两个靠的很近的频率),那么在频谱分析时,频谱上将不能分辨出这两个谱,由于w2-w1=2*pi/fs=2*pi*Δf/fs也就是2*pi/M<2*piΔf/fs,得到Δf的限制为fs/M,这就是窗函数宽度的最小选择,就是说,根据Shannon采样定理确定了采样频率后,要根据靠的最近的谱峰来确定最小的采样长度,这样,所作出来的频谱才能分辨出那两个谱峰,也就是拥有了相应的频率分辨率。 几个例子: 考虑双正弦信号:x = sin sin;根据Shannon采样定理,采样频率要大于截止频率的两倍,这里选采样频率为80,那么,我们可以看到,Δf为0.2Hz,那么,最小的数据长度为0.2/80=400,但是对正弦信号的频谱分析经验告诉我们,在截断时截断时的数据要包含整周期,并且后面不宜补零以避免频谱泄露(这一点见胡广书《数字信号处理导论》,清华大学出版社),那么,我们要选择至少980个点,才能保含到一个整周期,另外,FFT的经验告诉我们作分析时最好选择2的整数次幂,我们选择靠的最近的1024点。分析结束。 [CODE] Fs = 80; n = 0:1/Fs:1023*1/Fs; x = sin sin; N = length; figure; X = fftshift); plot*Fs/N,abs*2/N); grid on; axis; 这是按照我们的分析进行的编程和图形 zheng.jpg 可以看出这两个谱峰很好的被分辨开来,9.8Hz不在谱线上,所以幅值不为1,以下是一些对比: [CODE] Fs = 80; n = 0:1/Fs:1023*1/Fs; x = sin sin; N = length; X = fftshift); figure; subplot plot*Fs/N,abs*2/N); grid on; axis; title; n = 0:1/Fs:979*1/Fs; x = sin sin; N = length; X = fftshift); subplot plot*Fs/N,abs*2/N); grid on; axis; title; n = 0:1/Fs:399*1/Fs; x = sin sin; N = length; X = fftshift); figure; subplot plot*Fs/N,abs*2/N); grid on; axis; title; Fs = 20; n = 0:1/Fs:1024*1/Fs; x = sin sin; N = length; X = fftshift); subplot plot*Fs/N,abs*2/N); grid on; axis; title; 结果如下: 1024.jpg 400.jpg 这是我在做FFT以及论坛中的问题时所得到的一点启发,不当之处还请大家指正。OO~ 频率分辨率.rar 为了方便大家,我将doc版报告和m文件一起上传,和帖子内容一样。OO~

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Satisfying

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值