之前写过有关matlab时频分析的博客(时频特性分析http://blog.sina.com.cn/s/blog_6163bdeb0102dvwr.html,时频工具箱函数http://blog.sina.com.cn/s/blog_6163bdeb0102dvzd.html ),用工具箱里函数帮助里的代码测试使用,发现挺简单,就没有继续深究,最近又需要用了,才发现有些问题,自己的信号时频分析有误。找了找原因,原来是这个工具箱的函数是对解析信号处理的,而解析信号可以通过hilbert函数构造,如下面的例子
% 时频分析工具箱测试使用
clc
clear
close all
% 构造一个简单信号
fs = 1000;
ts = 1/fs;
t = 0:ts:127*ts;
yt = exp(-10*t).*sin(2*pi*100*t);
yt = yt - mean(yt);
figure
plot(t, yt)
title('原始信号')
% Hilbert变换得到解析信号,对于Wigner-Ville时频分布,这是必须的
yh = hilbert(yt);
% 短时傅里叶变换
tfr = tfrstft(yh(:), 1:length(yh), 1024); % 1024为频率分辨率,就是想把频率轴分多细
figure
imagesc(t, [0 fs], abs(tfr));
title('短时傅里叶时频图')
figure
tfrstft(yh(:)); % 利用交互界面绘制时频图
运行得到的结果如下
仿真指数衰减的正弦信号
短时傅里叶时频图
短时傅里叶时频图-交互式截面
可以改变现实的效果,添加现实原始信号、频谱、Hilbert包络等,如下图
同理,其他时频函数类似使用,如伪Wigner-Ville时频分布图
% 伪Wigner-Ville时频分布图
figure
tfrpwv(yh(:)); % Wigner-Ville时频分布同理tfrwv
另外,还有两个常用的求瞬时频率的函数tfrrsp和instfreq,别忘了先做一下Hilbert变换。