• matlab自带VMD详解,VMD去噪,VMD分解


    为了更好的利用MATLAB自带的vmd函数,本期作者将详细讲解一下MATLAB自带的vmd函数如何使用,以及如何画漂亮的模态分解图。

    首先给出官方vmd函数的调用格式。

    [imf,residual,info] = vmd(x)

    函数的输入:

    这里的x是待分解的信号,一行或者一列都可以!

    函数的输出:

    第一个参数位置--imf:vmd分解得到的IMF分量。

    第二个参数位置--residual:残余分量,残差表示原始信号x中未被vmd分解的部分。

    第三个参数位置--info,是一个结构体,包含以下信息:

    ExitFlag——终止标志。值0表示算法在达到最大迭代次数时停止。值为1表示算法在满足绝对和相对公差时停止。

    CentralFrequencies——IMF的中心频率。

    NumIterations——迭代总数。

    AbsoluteImprovement——在最后两次迭代之间,IMF收敛的均方绝对改进。

    RelativeImprovement——在最后两次迭代之间,IMF收敛的平均相对改进。

    LagrangeMultiplier ——上一次迭代时的频域拉格朗日乘数。

    示例:

    以西储大学轴承故障的105.mat为例,进行vmd分解展示。代码如下:

    1. clc
    2. clear
    3. fs=12000;%采样频率
    4. Ts=1/fs;%采样周期
    5. L=2000;%采样点数
    6. t=(0:L-1)*Ts;%时间序列
    7. %----------------导入内圈故障的数据-----------------------------------------
    8. load 105.mat
    9. X = X105_DE_time(1:L); %这里可以选取DE(驱动端加速度)、FE(风扇端加速度)、BA(基座加速度),直接更改变量名,挑选一种即可。
    10. [imf,residual,info] = vmd(X);
    11. figure(1);
    12. [p,q] = ndgrid(t,1:size(imf,2));
    13. plot3(p,q,imf)
    14. grid on
    15. xlabel('Time Values')
    16. ylabel('Mode Number')
    17. zlabel('Mode Amplitude')

    选取105.mat的2000个采样点,进行分解,结果图如下所示:dcd68876b7b111ab47dc7793dd772ba2.png

    还可以指定vmd的模态分解数和惩罚因子:

    [imf,residual,info] = vmd(X,'NumIMF',6,'PenaltyFactor',2500,')

    d219af08f1be7e912cd114017d4e59d7.png

    可以看到,模态分解数变成了6个。

    当分解模态数较多的时候,还可以这样画图:

    1. clc
    2. clear
    3. fs=12000;%采样频率
    4. Ts=1/fs;%采样周期
    5. L=2000;%采样点数
    6. t=(0:L-1)*Ts;%时间序列
    7. %----------------导入内圈故障的数据-----------------------------------------
    8. load 105.mat
    9. X = X105_DE_time(1:L); %这里可以选取DE(驱动端加速度)、FE(风扇端加速度)、BA(基座加速度),直接更改变量名,挑选一种即可。
    10. [imf,residual] = vmd(X,'NumIMF',9);
    11. t1 = tiledlayout(3,3,TileSpacing="compact",Padding="compact");
    12. for n = 1:9
    13. ax(n) = nexttile(t1);
    14. plot(t,imf(:,n)')
    15. xlim([t(1) t(end)])
    16. txt = ["IMF",num2str(n)];
    17. title(txt)
    18. xlabel("Time (s)")
    19. end
    20. title(t1,"Variational Mode Decomposition")

    结果如下:

    4830fe30f773179524c3497d5b8c1ce0.png

    VMD去噪

    对分解的信号进行重构,即为去噪,代码如下:

    1. cleanX = sum(imf(:,2:8),2);
    2. figure
    3. plot(t,X,t,cleanX)
    4. legend("Original X","Clean X")
    5. xlabel("Time (s)")
    6. ylabel("Signal")

    这里选用IMF2-IMF8进行相加,丢弃了IMF1和IMF9。为什么要这么做呢,这是MATLAB官方文档给出的解释:

    第一种模式包含最多的噪声,第二种模式是以重要特征的频率振荡。通过对除第一个和最后一个VMD模式之外的所有模式求和来构建干净的X信号,从而丢弃低频基线振荡和大部分高频噪声。

    结果如下:

    d7b1bd249897d3785c9aa74dd573684d.png

    105.mat下载地址:https://engineering.case.edu/sites/default/files/105.mat

    感觉作者总结还不错的,留个小小的赞吧!

  • 相关阅读:
    vue3使用animate,wow(wow不能用于商业化)
    day10每日3题(1):逐步求和得到正数的最小值
    PHP两个三元运算符“??” 和“?:”的用法和区别
    AI技术在基于风险测试模式转型中的应用
    在 WPF 中集成 ASP.NET Core 和 WebView2 用于集成 SPA 应用
    【OpenCV-PyQt5-PyGame-imutils】探索Python中的图像和视频捕获:性能分析与选择指南
    Eclipse中常用的操作单词
    多线程与高并发——并发编程(6)
    k8s一些难懂的技术点(1)
    java学习笔记 day8.6
  • 原文地址:https://blog.csdn.net/woaipythonmeme/article/details/132820432