matlab时频分析之连续小波变换cwt

matlab时频分析之连续小波变换cwtmatlab 时频分析之连续小波变换 cwt1 小波分析简介 2 小波分析基本原理 3cwt 的 matlab 实现 1 小波分析简介和傅里叶变换比 小波变换和短时傅里叶变换都有着相同的优点 就是可以同时在时域和频域观察信号 所以小波变换非定常信号的分析中有很大的作用 有关短时傅里叶变换的文章 可以参见我之前写的 matlab 时频分析之短时傅里叶变换 spectrogramh blog c

(2020年7月更新,第3节绘制了一个实部、虚部的关系图)

1 小波分析简介

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

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

2 小波分析基本原理

3 cwt的matlab实现

由于名称一样,在使用中,要想调用不同的版本,只能用输入输出格式来区分。

旧版本cwt用法为:

coefs = cwt(x,scales,'wname') 

新版本cwt用法为:

[wt,f] = cwt(x,wname,fs) 

最明显的区别在于,新版本取消了自定义尺度函数scales的功能。同时新版本还更新替换了一部分小波函数。旧版本支持 ‘haar’,‘db’,‘sym’,‘cmor’,‘mexh’,‘gaus’,‘bior’等小波,新版本支持’morse’, ‘amor’和 ‘bump’小波。

新版本的小波函数用法如下:

% 定义信号信息 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 
% 定义信号信息 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的乘积大小有关就行。实际应用中具体值需要根据最终效果选择。

其实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;%预期的频率 wcf=centfrq(wavename); %小波的中心频率 scal=fs*wcf./f; %自己实现的小波函数 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;%取小波衰减长度为0.1% tlow2low=sqrt(Fb*log(1/shuaijian));%单边cmor衰减至0.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]; end waveinscal = 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 

4 cwt的边缘效应与影响锥

利用自带的cwt函数,可以很方便的绘制出影响锥。

cwt(z) 

在这里插入图片描述
由于小波计算中,小波系数是利用窗口函数和小波卷积而来的,当窗口在信号的边缘时,窗口内会存在一部分没有信号。这时,matlab就把窗口内这部分不完整的信号补零处理,凑够长度。

此时由于信号在边缘被强制补零,导致信号会失真,具体在时频图中表示为频率变宽,信号强度降低。严重的时候,甚至整个低频部分都会出现失真。这就是cwt的边缘效应。

代码如下,依然以cmor小波为例,为了反应相位的影响,这里用的是real():

%小波变换展示 clear fs=2^6; %采样频率 dt=1/fs; %时间精度 timestart=-8; timeend=8; t=(0:(timeend-timestart)/dt-1)*dt+timestart; L=length(t); z=sin(2*pi*5.*t)+sin(2*pi*9.*t)+sin(2*pi*15.*t); %定义范围 wavename='cmor1-3'; %可变参数 fmin=2; fmax=20; df=0.1; totalscal=(fmax-fmin)/df; f=fmin:df:fmax-df;%预期的频率 wcf=centfrq(wavename); %小波的中心频率 scal=fs*wcf./f; %旧版本 coefs = cwt(z,scal,wavename); figure(2) pcolor(t,f,real(coefs));shading interp tlow2low=sqrt(1*log(1/0.001));%单边cmor衰减至0.1%时的时间长度 tcoi41=tlow2low*scal;%小波一半长度 bur=(tcoi41 
   

在这里插入图片描述

5 cwt的重构——icwt

如果用的是matlab新版的默认小波,那么可以直接把cwt之后小波系数icwt即可。

load mtlb; wt = cwt(mtlb); xrec = icwt(wt); 

对于morlet小波,可以直接 sum(real(coefs),1) 来实现重构。但是,这里尺度最好用默认尺度,否则会出现重复叠加导致幅值出现问题。

具体用法可以参见帮助文档。

6 增加cwt的分辨率的wsst

利用wsst可以显著的提高cwt的频率分辨率。具体用法如下:

clear 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); [sst,f] = wsst(z,fs); figure(4) pcolor(t,f,abs(sst));shading interp 

如果想要提高wsst的精度,可以在matlab里选中wsst,然后Ctrl+D进入wsst的代码界面,把里面的na参数,强行改的大一点。

具体方法为在下面代码后,加上一个na=512(这里不一定是512,具体根据na实际值进行适当放大,在我这里的例子中,na=288。如果怕出错,建议备份)。

na = noct*params.nv; na=512 

这样做的优点是,在不影响iwsst的运行结果的基础上,显著的提高分解的精度。

在这里插入图片描述


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198229.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午3:31
下一篇 2026年3月26日 下午3:32


相关推荐

  • 锂电池升压芯片[通俗易懂]

    锂电池升压芯片[通俗易懂]型号电池 数量工作 模式工作 电压最大 充电 电流工作 电流恒流 恒压 精度输出 电压开关 频率封装说明HM40331-5 节 可设PFM 升压型 开关式 外置MOS4.0V -28V扩流 最大 25W1.7mA1%可调1MHzSOT-26HM40312节5V升压型 开关式 外置MOS最大 5.5V1.0A 以上 可调5mA1%8.4V200KHzSOP-8自适应适配器的

    2022年10月7日
    4
  • 50道 CSS 经典面试题(包含答案)

    50道 CSS 经典面试题(包含答案)1介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的?标准盒子模型:宽度=内容的宽度(content)+border+padding+margin低版本IE盒子模型:宽度=内容宽度(content+border+padding)+margin2box-sizing属性?用来控制元素的盒子模型的解析模式,默认为content-boxcontext-box:W3C的标准…

    2022年5月30日
    28
  • phpmyadmin安装教程及配置设置

    phpmyadmin安装教程及配置设置.一般网上下载到的phpmyadmin是一个压缩包,我们将其释放到htdocs目录中,例如htdocs\phpmyadmin。  2.打开phpmyadmin目录,在此目录下是否有config.sample.inc.php文件,如果存在,那么将其改名为config.inc.php。(根据版本不同,有可能直接就有config.inc.php文件,那就无需改名,也有可能根本就没有config.

    2022年6月1日
    29
  • 大数据篇:三大指标

    大数据篇:三大指标大数据篇:三大指标上一篇文章中文章讲了如何用服务等级协议(SLA)来评估我们的系统,并讲解了几个常用的SLA指标今天我们来讲分布式系统中另外几个基本概念可扩展性(Scalability)先从我们为什么需要分布式系统说起。原因是我们系统的数据量越来越大,从原来的GB到TB到现在的PB级,单机已经无法胜任这样的工作了。工作中也常有这样的场景,随着业务变得原来越复杂,之前设计的系统无法处理日渐…

    2022年5月10日
    52
  • Springboot的Mybatis拦截器实现[通俗易懂]

    Springboot的Mybatis拦截器实现[通俗易懂]MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,其实就是拦截器功能MyBatis允许拦截的接口MyBatis允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使用插件来拦截的方法调用包括:Executor(update,query,fl…

    2025年10月11日
    4
  • pycharm 2021..2.3激活_在线激活「建议收藏」

    (pycharm 2021..2.3激活)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月30日
    114

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号