matlab时频分析之连续小波变换cwt
(2020年7月更新,第3节绘制了一个实部、虚部的关系图)
1 小波分析简介
和傅里叶变换比,小波变换和短时傅里叶变换都有着相同的优点,就是可以同时在时域和频域观察信号。所以小波变换非定常信号的分析中有很大的作用。
有关短时傅里叶变换的文章,可以参见我之前写的:
matlab时频分析之短时傅里叶变换 spectrogram
https://blog.csdn.net/weixin_42943114/article/details/88735799
和短时傅里叶变换相比,小波变换有着窗口自适应的特点,即高频信号分辨率高(但是频率分辨率差),低频信号频率分辨率高(但是时间分辨率差),而在工程中常常比较关心低频的频率,关心高频出现的时间,所以近些年用途比较广泛。
在数学上,小波还有正交化等优点,应用领域广泛。
但是,本文只讨论如何利用matlab实现cwt的时频分析
2 小波分析基本原理
小波的含义,即为时间上衰减快,和傅里叶的正弦波相比要短。
一个典型的morlet小波如下图:
matlab有很多自带的小波函数,利用wavemngr(‘read’,1)可以进行小波的查看,利用waveinfo可以查看小波的相关信息。
在时间域上,可以通过小波在时间上的移动,逐一比较不同位置的窗口信号,得到小波系数,小波系数越大,则证明小波与该段信号的拟合程度越好。计算中用小波函数与该窗口信号的卷积,作为该窗口下的小波系数。窗口的长度和小波的长度是相同的。
在频率域上,通过拉伸或压缩小波的长度,来改变小波的长短和频率,实现不同频率下的小波系数。相应的,窗口长度也会随着小波长度变化。由于高频处小波被压缩,时间窗变窄,使得时间分辨率更高。
将不同频率下的小波系数组合起来,便得到了时频变换的小波系数图。
从图上可以看到,低频处频率分辨率要好于高频处的。小波时频图的特点为整体呈现高频处高而瘦,低频处矮而宽。
小波中,一般用尺度scale来衡量小波的频率f,两者之间的转换关系为:
s c a l e ∗ f = F s ∗ w c f scale * f=Fs * wcf scale∗f=Fs∗wcf
公式中,Fs代表信号的采样频率,wcf为小波的中心频率(wave central freq),在matlab里可以用 centfrq(wavename) 来查询。
3 cwt的matlab实现
matlab自带的有两种实现方式,一种是2006年版本推出的函数cwt,一种是2016年版本推出的函数cwt。两个函数名称相同,用法不同。
(我也不知道为什么会这样。。。-_-||)
由于名称一样,在使用中,要想调用不同的版本,只能用输入输出格式来区分。
旧版本cwt用法为:
coefs = cwt(x,scales,'wname')
新版本cwt用法为:
[wt,f] = cwt(x,wname,fs)
最明显的区别在于,新版本取消了自定义尺度函数scales的功能。同时新版本还更新替换了一部分小波函数。旧版本支持 ‘haar’,‘db’,‘sym’,‘cmor’,‘mexh’,‘gaus’,‘bior’等小波,新版本支持’morse’, 'amor’和 'bump’小波。
新版小波的介绍可以参见:
https://ww2.mathworks.cn/help/wavelet/gs/choose-a-wavelet.html
新版本的小波函数用法如下:
% 定义信号信息
fs=2^6; %采样频率
dt=1/fs; %时间精度
timestart=-8;
timeend=8;
t=(0:(timeend-timestart)/dt-1)*dt+timestart;
L=length(t);
z=4*sin(2*pi*linspace(6,12,L).*t);
%matlab自带的小波变换
%新版本
figure(1)
[wt,f,coi] = cwt(z,'amor',fs);
pcolor(t