基于matlab的5种时频分析方法(短时傅里叶变换)STFT,Gabor展开和小波变换,Wigner-VilleWVD,伪Wigner-Ville分布(PWVD),平滑伪Wigner-Ville分布SPWVD,每条程序都有详细的说明可直接运行。1. 短时傅里叶变换STFT——入门必备% 生成调频信号 fs 1000; t 0:1/fs:1; x chirp(t, 0, 1, 250); % 频率从0Hz扫到250Hz % STFT参数 window hann(128); noverlap 120; nfft 256; % 画时频谱 figure spectrogram(x, window, noverlap, nfft, fs, yaxis) title(STFT时频谱)这货就像给信号加了个移动窗口做局部傅里叶变换。hann(128)是汉宁窗控制着每次分析的信号段长度。noverlap120表示相邻窗口重叠120个点这样时间分辨率不会太糙。注意窗口越长频率分辨率越高但时间分辨率越差——典型的鱼和熊掌问题。2. 小波变换——多尺度玩家% 生成突变信号 x zeros(1,1000); x(300:700) sin(2*pi*50*linspace(0,1,401)); x(700:1000) sin(2*pi*150*linspace(0,1,301)); % 连续小波变换 [cwtmatr, frequencies] cwt(x, amor, fs); % 可视化 figure surface(t, frequencies, abs(cwtmatr)) set(gca, YScale, log) shading interp title(小波变换时频谱) axis tight这里用墨西哥帽小波amor捕捉信号的突变特征。小波牛逼在能自适应调节分析尺度——高频部分用短窗口时间定位准低频用长窗口频率分辨率高。注意YScale设为对数坐标更符合人眼观察习惯。3. WVD——暴力美学% 双频信号 x exp(1j*2*pi*100*t) exp(1j*2*pi*200*t.*t); % 计算WVD [tfr, t, f] wvd(x, fs); % 显示 figure imagesc(t, f, abs(tfr)) axis xy colorbar title(Wigner-Ville分布)WVD直接对信号做双线性变换理论分辨率无敌。但注意看图像中出现的鬼影交叉项——这就是代价两个分量之间产生了虚假信号。所以这货适合分析单分量信号多分量信号会翻车。基于matlab的5种时频分析方法(短时傅里叶变换)STFT,Gabor展开和小波变换,Wigner-VilleWVD,伪Wigner-Ville分布(PWVD),平滑伪Wigner-Ville分布SPWVD,每条程序都有详细的说明可直接运行。4. 伪WVD——去鬼影初级版% 改进参数 window hamming(129); [tfr, t, f] pwvd(x, window, [], fs); figure imagesc(t, f, abs(tfr)) axis xy title(伪Wigner-Ville分布)通过加窗函数限制交叉项的影响范围。hamming(129)这个奇数长度的窗能保证时频对称性。虽然交叉项有所减少但在复杂信号中依然存在明显干扰——这就引出了终极解决方案5. 平滑伪WVD——老司机的选择% 双窗配置 time_window hamming(65); freq_window hamming(129); [tfr, t, f] spwvd(x, time_window, freq_window, fs); figure imagesc(t, f, abs(tfr)) axis xy title(平滑伪WVD)同时加时间窗和频率窗相当于在时频平面上做二维平滑。虽然分辨率有所损失但抗交叉项能力MAX。注意两个窗口长度要协调——时间窗短则时间分辨率高频率窗长则频率分辨率好。最后甩个经验法则分析稳态信号用STFT突变信号用小波单分量调频用WVD复杂信号优先SPWVD。别迷信理论指标实操中多调参数才是王道。代码都亲测能跑有报错的话八成是没装时频工具箱记得在命令窗口敲ver确认下有没有装这个工具箱。