1. 小波分析介绍

和傅里叶变换比,小波变换和短时傅里叶变换都有着相同的优点,就是可以同时在时域和频域观察信号。所以小波变换在非定常信号的分析中有很大的作用。

和短时傅里叶变换相比,小波变换有着窗口自适应的特点,即高频信号分辨率高(但是频率分辨率差),低频信号频率分辨率高(但是时间分辨率差),而在工程中常常比较关心低频的频率和高频出现的时间,所以近些年用途比较广泛。

在数学上,小波还有正交化等优点,应用领域广泛。
本文只讨论如何利用matlab实现cwt的时频分析

2. 小波分析基本原理

小波的含义,即为时间上衰减快,和傅里叶的正弦波相比要短。
一个典型的morlet小波如下图:

matlab有很多自带的小波函数,利用wavemngr(‘read’,1)可以进行小波的查看,利用waveinfo可以查看小波的相关信息。

在时域上,可以通过小波在时间上的移动,逐一比较不同位置的窗口信号,得到小波系数。小波系数越大,则小波与该段信号的拟合程度越好。计算时用小波函数与该窗口的信号卷积,作为该窗口下的小波系数。窗口的长度和小波的长度是相同的。

在频率域上,通过拉伸或压缩小波的长度,来改变小波的长短和频率,实现不同频率下的小波系数。相应的,窗口长度也会随着小波长度变化。由于高频处小波被压缩,时间窗变窄,使得时间分辨率更高。

将不同频率下的小波系数组合起来,便得到了时频变换的小波系数图。

从图上可以看到,低频处频率分辨率要好于高频处的。小波时频图的特点为整体呈现高频处高而瘦,低频处矮而宽。

小波中,一般用尺度scale来衡量小波的频率f,
两者之间的转换关系为:

        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,f,abs(wt));shading interp

旧版本的小波函数用法如下:
这里用到了cmor小波,以及频率转尺度的方法。

% 定义信号信息
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);
%旧版本
wavename='cmor1-3'; %可变参数,分别为cmor的
%举一个频率转尺度的例子
fmin=2;
fmax=20;
df=0.1;f=fmin:df:fmax-df;%预期的频率
wcf=centfrq(wavename); %小波的中心频率
scal=fs*wcf./f;%利用频率转换尺度
coefs = cwt(z,scal,wavename);
figure(2)
pcolor(t,f,abs(coefs));shading interp


对于cmor小波Fc和Fb的选取,可以认为最终结果只与Fc*√Fb的乘积大小有关就行。实际应用中具体值需要根据最终效果选择。

cmor小波最终得到的coefs小波系数,是一个复数矩阵,绝对值abs()代表信号的幅值,角度angle()代表信号的相位。一般用小波系数的实部real()来同时表示信号正负变化。

其实cwt的原理很简单,就是用不同尺度的小波逐个窗口去卷积,得到小波系数矩阵。所以根据原理,可以自己编程实现小波变换。

自己编程的cwt函数如下,这里主要算法参考了matlab官方的文档。这里依然用的是cmor小波作为例子,morlet函数公式可以查询到,也可以用cmorwavf()函数调用:

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);%定义计算范围和精度
fmin=2;
fmax=20;
df=0.1;
totalscal=(fmax-fmin)/df;
f=fmin:df:fmax-df;%预期的频率%自己实现的小波函数
coefs2=cwt_cmor(z,1,3,f,fs);
figure(3)
pcolor(t,f,abs(coefs2));shading interp%后面是函数
function coefs=cwt_cmor(z,Fb,Fc,f,fs)
%1 小波的归一信号准备
z=z(:)';%强行变成y向量,避免前面出错
L=length(z);
%2 计算尺度
scal=fs*Fc./f;%3计算小波
shuaijian=0.001;%取小波衰减长度为1%
tlow2low=sqrt(Fb*log(1/shuaijian));%单边cmor衰减至1%时的时间长度,惨叫cmor的表达式%3小波的积分函数
iter=10;%小波函数的区间划分精度
xWAV=linspace(-tlow2low,tlow2low,2^iter);
stepWAV = xWAV(2)-xWAV(1);
val_WAV=cumsum(cmorwavf(-tlow2low,tlow2low,2^iter,Fb,Fc))*stepWAV;
%卷积前准备
xWAV = xWAV-xWAV(1);
xMaxWAV = xWAV(end);
coefs     = zeros(length(scal),L);%预初设coefs%4小波与信号的卷积
for k = 1:length(scal)    %一个scal一行a_SIG = scal(k); %a是这一行的尺度函数j = 1+floor((0:a_SIG*xMaxWAV)/(a_SIG*stepWAV));%j的最大值为是确定的,尺度越大,划分的越密。相当于把一个小波拉伸的越长。if length(j)==1 , j = [1 1]; endwaveinscal = fliplr(val_WAV(j));%把积分值扩展到j区间,然后左右颠倒。f为当下尺度的积分小波函数%5 最重要的一步 wkeep1取diff(wconv1(ySIG,f))里长度为lenSIG的中间一段%conv(ySIG,f)卷积。coefs(k,:) = -sqrt(a_SIG)*wkeep1(diff(conv2(z,waveinscal, 'full')),L);%
end
end

输出的结果如下,可以看到和matlab自带的函数得到的结果基本相同。

Matlab时频分析之连续小波变换CWT相关推荐

  1. matlab 小波变换_matlab小波工具箱实例(二):时频分析和连续小波变换

    本文讲解matlab小波工具箱实例(二):时频分析和连续小波变换.目录如下: 链接:https://www.mathworks.com/help/wavelet/ug/time-frequency-a ...

  2. matlab时频分析工具箱安装_EEG时频分析介绍与实现(基于EEGLAB、NetStation与Analyzer2软件)...

    本文首发在个人博客上(7988888.xyz),此文章中所有链接均通过博客进行访问. 我在很早之前有翻译过一篇通过小波变换来进行时频分析的文章,可参考<小波教程>.最近,我在油管上看到了E ...

  3. matlab时频分析代码

    当进行时频分析时,MATLAB提供了多种函数和工具箱,下面是一个简单的MATLAB时频分析代码示例: 假设我们有一个信号x和一个采样频率fs.以下是使用MATLAB信号处理工具箱的代码: ```mat ...

  4. matlab时频分析之短时傅里叶变换 spectrogram

    matlab时频分析之短时傅里叶变换 spectrogram 短时傅里叶变换常用于缓慢时变信号的频谱分析,可以观察沿时间变化的频谱信号. 其优点如下图所示,弥补了频谱分析中不能观察时间的缺点,也弥补了 ...

  5. matlab 时频分析(短时傅里叶变换、STFT)

    短时傅里叶变换,short-time fourier transformation,有时也叫加窗傅里叶变换,时间窗口使得信号只在某一小区间内有效,这就避免了传统的傅里叶变换在时频局部表达能力上的不足, ...

  6. matlab时频分析工具箱安装_科研小班 | 加州大学伯克利分校 | 物理、电子工程:MATLAB信号和数据处理课题...

    科研小班 | 加州大学伯克利分校 | 物理.电子工程:MATLAB信号和数据处理课题(2021.1月开课)​mp.weixin.qq.com 工程研究领域中,实验.模拟往往都会产生海量的数据.对这些数 ...

  7. matlab求时频分布图,Matlab时频分析TFD程序集(时频分布、chirplet分解、变形分数傅立叶变换)源代码...

    码农 &nbsp2020年08月10日 学习一下 ikkki &nbsp2018年06月14日 希望有用 ahha &nbsp2018年06月13日 谢谢分享 YXJ1280  ...

  8. 雷达原理---时频分析--3.小波变换-3.1基础知识

    文章目录 一.短时傅里叶变换的缺陷 二.小波变换的优点 三.小波变换和傅里叶变换的比较 四.小波变换的基础知识(Wavelet Transform,WT) 1. 连续小波变换(Continuous W ...

  9. 时频分析方法总结:傅里叶级数及傅里叶变换、STFT 、小波变换、Wigner-Ville 分布

    前言: 一.傅里叶变换的机理 一个能量无限的正弦信号和源信号乘积并求和得到某个频率下的系数,随着频率的增加,正弦信号改变,再次求得系数,依次构成了频谱图 傅里叶级数及傅里叶变换 https://blo ...

最新文章

  1. (0003) iOS 开发之App 适配iOS 10
  2. Docker Machine-Windows
  3. m5310模组数据上传至onenet_5G通信模组799元限量发售,中国移动意欲何为?
  4. Orbeon form PE 版本 dmv-14 点击 save 按钮之后的执行逻辑
  5. 4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例
  6. 封装一个信号量集操作函数的工具
  7. Effective Modern C++ 第二章 auto的使用
  8. 不同网段的局域网怎么互通_智能化工程中,局域网IP地址不够用怎么解决?
  9. pythonATM,购物车项目实战_补充5-interface接口
  10. python+selenium环境配置(windows7环境)
  11. instagram图片下载_如何使用Python下载Instagram个人资料图片
  12. 代价敏感错误率与代价曲线
  13. 微信公众号禁止分享功能
  14. 退出痛区-使用NDepend进行静态分析
  15. 硬件设计-DIY功放
  16. AUTOSAR MCAL解析:MCU
  17. matlab模糊工具箱使用,MATLAB中模糊神经网络工具箱的使用 - 全文
  18. /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21‘ not found的解决办法及注意事项
  19. [译]使用MVI打造响应式APP(八):导航
  20. 真·人机合一!MIT推出人形机器人“爱马仕”,远程遥控操作救援

热门文章

  1. 小红书2023全球秋季校园招聘
  2. 深入理解 JavaScript 函数的特性与最佳实践
  3. 美丽播直播系统源码提供
  4. 我也算用过游戏引擎了~
  5. 数字化转型成功的四个支柱
  6. linux磁盘故障dracut,Dracut 错误地放置了内核模块
  7. 计算机基础二,四,八,十,32,64进制 转换规律
  8. Vue/Vuex入门、Vuex 介绍 Vuex是什么 Vuex说明总结、Vuex主要五个内容
  9. 【AI with ML】第 10 章 :创建 ML 模型以预测序列
  10. eclipse生成javadoc是报很多 不可用的GBK编码