精华内容
下载资源
问答
  • VMD分解原理不同于EMD,它是将原始信号引入到变分模型中,利用寻找约束变分模型最优解的过程来获取分量。VMD极大地克服了EMD的模态混叠现象,具有较好的噪声鲁棒性,已被广泛应用到多个领域中。
  • matlab变分模态分解VMD

    2018-04-11 10:39:34
    很好用的变分模态分解VMD程序,我在matlab里面已经运行过了,想画图的话可以自己加一部分画图程序。
  • 变分模态分解算法虽然克服了传统经验模态分解及其改进方法的缺点,但分解前需要设定分解层数K和惩罚因子α ,参数的选择对分解结果的影响很大。本程序利用K-L散度(相对熵)对VMD的参数进行寻优,确定VMD分解信号的K...
  • VMD变分模态分解算法

    2020-09-02 08:47:32
    根据单个或多个宽频偶数长度电磁信号,根据VMD计算分量数据,展示含噪曲线、去噪曲线、分量时域、分量频谱、多测道曲线的图形绘制和数据生成。实现单条信号的独立运算,多条信号可选参数的独立运算并实现合并。 源码...
  • 该技术具有可以确定模态分解个数的优点,其自适应性表现在根据实际情况确定所给序列的模态分解个数,随后的搜索和求解过程中可以自适应地匹配每种模态的最佳中心频率和有限带宽,并且可以实现固有模态分量(IMF)的...
  • 变分模态分解算法是2014年新提出的,广泛应用于信号处理领域
  • vmd分解matlab实现,变分模态分解,信号分解,可应用于各种信号的分解,以及入门学习的辅助材料,这是vmd方法提出者的原版代码
  • 变分模态分解VMD

    2017-12-01 16:50:37
    变分模态分解(Variational mode decomposition,简称VMD)方法[18],VMD方法将信号分解转化为约束变分问题,自适应地将信号分解为若干个IMF分量之和。
  • 变分模态分解的matlab代码,根据原论文中的公式做出了相应修改。
  • vmd变分模态分解

    2017-12-26 11:30:41
    此文件 能够VMD 法避免了发生混叠 现象,且运算效率更高,在低信噪比的情况下噪声 处理效果更好,有利于故障信号的特征提取
  • 变分模态分解VMD(Variational mode decomposition)是一种新型的基于频域的完全非递归信号分解估计方法,它结合了经典的维纳滤波,Hilbert变换与频率混合。
  • 2 变分模态分解VMD原理 3 main.m主程序 4 运行结果 1 简介 针对从滚动轴承振动信号中所提取的故障信息精度低的问题,利用遗传算法对变分模态分解模态个数K和惩罚参数α 寻优,目标函数为多尺度排列熵参数,...

    目录

    1 简介

    2 变分模态分解VMD原理

    3 GA优化VMD效果

    3.1 遗传算法优化VMD各分量信号图像

    3.2 全部图像

    4 主要代码

    main.m


    1 简介

    针对从滚动轴承振动信号中所提取的故障信息精度低的问题,利用遗传算法对变分模态分解模态个数K和惩罚参数α 寻优,目标函数为多尺度排列熵参数,再根据VMD处理信号得到若干模态分量,筛选后进一步提取能量熵作为特征向量。使用特征提取向量,可进行后续轴承故障诊断等工作。

    2 变分模态分解VMD原理

    VMD能够自适应匹配每种模态的最佳中心频率和有限带宽,实现固有模态分量(IMF)有效分离,
    其核心思想是构建和求解变分问题。

    VMD实现步骤为:

    由VMD分解步骤可知,分解信号前需要设置合适的模态个数K和惩罚参数α,K取值过大会导致过分解,反之,则会欠分解,α 取值过大,会造成频带信息丢失,反之,会信息冗余,所以需要确定最佳参数组合[K,α]。目前多用中心频率观察法,通过观察不同K值下的中心频率确定K值,但该法具有偶然性,且只能确定模态个数K,无法确定惩罚参数α。

    使用遗传算法(GA)对VMD变分模态分解的惩罚参数alpha与分解模态层数K进行寻优,以局部包络熵极小值作为适应度函数。[alpha, K] 为进化个体的位置,局部包络熵极小值为个体的适应度值。

    3 GA优化VMD效果

    3.1 遗传算法优化VMD各分量信号图像

    1.时域图像

    2.频谱图像

    3.2 全部图像

    4 主要代码

    main.m

    %% 基于遗传算法(genetic algorithm, GA))优化变分模态分解(variational mode decomposition,VMD)参数
    
    clc
    clear
    close all
    % 读取数据
    [file,path,indx]  = uigetfile({'*.xlsx';'*.xls';'*.txt';'*.*'},'File Selector');
    if indx == 1||indx==2
        data=xlsread(strcat(path, file));
    elseif indx == 3
        data=load(strcat(path, file));
    else
        warning('请选择数据集进行实验');
        return;
    end
    
    %采样频率
    fs=12800;
    % 读取前1000长度的信号
    len=1000;
    s=data(1:len);
    % 采样时间
    t = (0:len-1)/fs;
    
    %% 设定遗传算法参数
    popsize =6;   % 种群大小
    iter =30;   % 最大迭代次数
    dim = 2;   % 变量个数
    lb = [100 3];   % alpha范围 K范围   下限
    ub = [2000 7];  % 上限
    pc=0.8;                       %交叉概率,0和1之间
    pm=0.2;                    %变异概率,0和1之间
    
    %% 遗传算法GA优化VMD参数
    
    tic ,  % 开始计时
    
    GA_VMD(popsize,iter,dim,lb,ub,pc,pm,0);  % 0表示不保存IMF,1,导出IMF并保存
    
    toc,  % 结束计时
    

    展开全文
  • VMD分解变分模态分解

    2017-11-30 22:05:20
    matlab实现vmd分解,变分模态分解。可应用于信号分解
  • 变分模态分解

    2018-03-14 10:13:11
    变分模态分解是一种自适应、准正交、完全非递归的分解方法,可将由多成分组成的信号分解成数个有限带宽的固有模态,并且这些模态绝大部分紧紧围绕在其对应的中心频率周围。
  • 变分模态分解的源代码,亲测可以在MATLAB中直接使用。
  • 变分模态分解VMD

    万次阅读 多人点赞 2019-12-11 19:24:41
    变分模态分解VMDVMD是一种自适应、完全非递归的模态变分和信号处理的方法。其核心思想是构建和求解变分问题:在搜索时确定每个模态的中心频率和有限带宽,并且可以自适应地实现固有模态函数(IMF)的有效分离、...

    变分模态分解(VMD)

    VMD(Variational mode decomposition)是一种自适应、完全非递归的模态变分和信号处理的方法。该技术具有可以确定模态分解个数的优点,其自适应性表现在根据实际情况确定所给序列的模态分解个数,随后的搜索和求解过程中可以自适应地匹配每种模态的最佳中心频率和有限带宽,并且可以实现固有模态分量(IMF)的有效分离、信号的频域划分、进而得到给定信号的有效分解成分,最终获得变分问题的最优解。它克服了EMD方法存在端点效应和模态分量混叠的问题,并且具有更坚实的数学理论基础,可以降低复杂度高和非线性强的时间序列非平稳性,分解获得包含多个不同频率尺度且相对平稳的子序列,适用于非平稳性的序列,VMD的核心思想是构建和求解变分问题。
    首先构造变分问题,假设原始信号f被分解为k个分量,保证分解序列为具有中心频率的有限带宽的模态分量,同时各模态的估计带宽之和最小,约束条件为所有模态之和与原始信号 相等,则相应约束变分表达式为
    在这里插入图片描述 (1)
    式中: 为需要分解的模态个数(正整数), 、 分别对应分解后第 个模态分量和中心频率, 为狄拉克函数, 为卷积运算符。
    然后求解式(1),引入Lagrange乘法算子λ,将约束变分问题转变为非约束变分问题,得到增广Lagrange表达式为
    在这里插入图片描述 (2)

    在这里插入图片描述文献【1】在这里插入图片描述
    式中: 为噪声容忍度,满足信号分解的保真度要求, 、 、 和 分别对应 、 、 和 的傅里叶变换。
    VMD主要迭代求解过程,展示如下第一步:初始化 、 、 和最大迭代次数 , ;第二步:利用公式(3)和(4)更新 和 ;第三步:利用公式(5)更新 ;第四步:精度收敛判据 ,若不满足 且 ,则返回第二步,否则完成迭代,输出最终的 和 。

    分解的例子:K=10(自己做的)文献【2】在这里插入图片描述
    在这里插入图片描述
    【1】[1]. Dragomiretskiy, K.; Zosso, D. Variational mode decomposition. IEEE Trans. Signal Process. 2014, 62, 531–544.
    【2】李文武, 石强, 王凯, 等. 基于变分模态分解和深度门控网络的径流预测[J]. 水力发电学报, 2020, 39(3): 34-44.

    展开全文
  • 实现变分模态分解,采用包络熵作为各模态分量的能量计算值
  • 变分模态分解源代码,可以直接使用,根据需要调整参数啊
  • VMD变分模态分解MATLAB程序包,将压缩包中的VMD.m添加在MATLAB的子路径之下(在MATLAB面板上方点击Set path→添加子路径),或者直接放在当前运行的文件夹中也能使用。
  • 变分模态分解算法,可分解非平稳多分量信号至多个单分量。
  • VMD的目标是将实值输入信号fff分解为离散数量的子信号(模态) uku_kuk​ 。我们先假设每个模态在一个中心频率ωk\omega_kωk​周围是紧密的,也就是说这个模态包含的频率分量都在ωk\omega_kωk​附近,而ωk\omega_k...

    1. 简述

    VMD的目标是将实值输入信号 f f f分解为离散数量的子信号(模态) u k u_k uk 。我们先假设每个模态在一个中心频率 ω k \omega_k ωk周围是紧密的,也就是说这个模态包含的频率分量都在 ω k \omega_k ωk附近,而 ω k \omega_k ωk是随着分解来确定。

    为了评估一个模态的带宽,提出以下方案:1)对于每个模态,通过希尔伯特变换计算相关的分析信号,以便获得单向频谱。2)对于每种模态,通过与调谐到相应估计中心频率的指数混频,将模态的频谱移至“基带”。3)现在通过解调信号的高斯平滑度,即梯度的平方范数来估计带宽。

    得到的约束变分问题如下:

    在这里插入图片描述
    在这里插入图片描述
    求解上述方程,得到模态 u k u_k uk的求解公式为:
    在这里插入图片描述
    中心频率 ω k \omega_k ωk的求解公式为:
    在这里插入图片描述

    2. 运算步骤

    在这里插入图片描述

    3.VMD分解之后的模态和原信号的关系

    经过VMD分解之后的k个模态直接相加可以得到一个原信号的近似信号,两信号相减会有一个残差,这是因为对于一个实际信号不管分解多少次都不可能完全用分解出来的模态完全代表原信号。
    所以在对分解出来的模态操作时不能忘记残差。

    4. 源码解读

    # -*- coding: utf-8 -*-
    """
    Created on Wed Feb 20 19:24:58 2019
    
    @author: Vinícius Rezende Carvalho
    """
    import numpy as np
    
    def  VMD(f, alpha, tau, K, DC, init, tol):
        """
        u,u_hat,omega = VMD(f, alpha, tau, K, DC, init, tol)
        Variational mode decomposition
        Python implementation by Vinícius Rezende Carvalho - vrcarva@gmail.com
        code based on Dominique Zosso's MATLAB code, available at:
        https://www.mathworks.com/matlabcentral/fileexchange/44765-variational-mode-decomposition
        Original paper:
        Dragomiretskiy, K. and Zosso, D. (2014) ‘Variational Mode Decomposition’, 
        IEEE Transactions on Signal Processing, 62(3), pp. 531–544. doi: 10.1109/TSP.2013.2288675.
        
        
        Input and Parameters:
        ---------------------
        f       - 即将被分解的一维时域信号
        alpha   - 数据保真度约束的平衡参数
        tau     - 双重上升的时间步长(为零噪声选择0)
        K       - 要被恢复的模态数量
        DC      - 如果将第一种模态置于并保持为直流(0频率),则为true
        init    - 0 = all omegas start at 0
                           1 = all omegas start uniformly distributed
                          2 = all omegas initialized randomly
        tol     - tolerance of convergence criterion; typically around 1e-6
        		  收敛准则的容忍度; 通常在1e-6左右
    
        Output:
        -------
        u       - the collection of decomposed modes
        		  分解模态的集合
        u_hat   - spectra of the modes
        		  模态的频谱
    
        omega   - estimated mode center-frequencies
        		  被估计的模态中心频率
        		  omega 是一个矩阵,他储存了Niter-1组中心频率值,
        		  形状为(Niter-1, K),Niter在vmdpy.py中定义,K为分解数量
        		  omega矩阵储存了中心频率收敛过程中的数据,
        		  所以一般取最后一行来用,这是最终的中心频率
        """
        
        # 
        if len(f)%2:
           f = f[:-1]
    
        # 输入信号的周期和采样频率
        fs = 1./len(f)
        
        ltemp = len(f)//2 
        # 将f的前半截沿着axis = 0反转,再将f append到反转后的数组中
        # 例如f = np.array([1,2,3,4,5,6,7,8]),处理后变成了
        #  array([4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8])
        fMirr =  np.append(np.flip(f[:ltemp],axis = 0),f)  
        # 接着上面的例子,处理之后变成了array([4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8,8,7,6,5])
        fMirr = np.append(fMirr,np.flip(f[-ltemp:],axis = 0))
    
    	"""
        # Time Domain 0 to T (of mirrored signal)
        # 时域0到T(镜像信号的)
        # 再接上面的例子,T=16
        
        t =
        
        array([0.0625, 0.125 , 0.1875, 0.25  , 0.3125, 0.375 , 0.4375, 0.5   ,
           0.5625, 0.625 , 0.6875, 0.75  , 0.8125, 0.875 , 0.9375, 1.    ])
        """
        
        T = len(fMirr)
        t = np.arange(1,T+1)/T  
        
        # Spectral Domain discretization  谱域离散化
        """
        freqs =
        
        array([-0.5   , -0.4375, -0.375 , -0.3125, -0.25  , -0.1875, -0.125 ,
           -0.0625,  0.    ,  0.0625,  0.125 ,  0.1875,  0.25  ,  0.3125,
            0.375 ,  0.4375])
        """
        freqs = t-0.5-(1/T)
    
        # Maximum number of iterations (if not converged yet, then it won't anyway)
        # 最大迭代次数(如果尚未收敛,则无论如何都不会收敛了)
        Niter = 500
        
        # For future generalizations: individual alpha for each mode
        # 为了将来的概括:每种模态都有单独的Alpha
        Alpha = alpha*np.ones(K)
        
    
    	"""
        # Construct and center f_hat  构建并居中f_hat
        # np.fft.fft(fMirr)表示对fMirr进行快速傅立叶变换
        # numpy.fft模块中的fftshift函数可以将FFT输出中的直流分量移动到频谱的中央。
        # ifftshift函数则是其逆操作。 
        # 所以这一句的意思是先对fMirr进行快速傅立叶变换,然后将变换后的直流分量移到频谱中央
        """
        f_hat = np.fft.fftshift((np.fft.fft(fMirr)))
        f_hat_plus = np.copy(f_hat) #copy f_hat
        # 把数组前半截元素都置为0
        f_hat_plus[:T//2] = 0
    
        # Initialization of omega_k
        omega_plus = np.zeros([Niter, K])
    
    
        if init == 1:  # 1 = all omegas start uniformly distributed
            for i in range(K):
                omega_plus[0,i] = (0.5/K)*(i)
        elif init == 2: # 2 = all omegas initialized randomly
            omega_plus[0,:] = np.sort(np.exp(np.log(fs) + (np.log(0.5)-np.log(fs))*np.random.rand(1,K)))
        else: #  all omegas start at 0
            omega_plus[0,:] = 0
                
        # if DC mode imposed, set its omega to 0
        if DC:
            omega_plus[0,0] = 0
        
        # start with empty dual variables  从空对偶变量开始
        lambda_hat = np.zeros([Niter, len(freqs)], dtype = complex)
        
        # other inits
        uDiff = tol+np.spacing(1) # update step  更新步长?
        n = 0 # loop counter  循环计数器
        sum_uk = 0 # accumulator  累加器
        # matrix keeping track of every iterant // could be discarded for mem
        # 跟踪每个巡回剂的矩阵//可被mem丢弃
        u_hat_plus = np.zeros([Niter, len(freqs), K],dtype=complex)    
    
        #*** Main loop for iterative updates***  迭代更新的主循环
    
        while ( uDiff > tol and  n < Niter-1 ): # not converged and below iterations limit 未收敛且低于迭代限制
            # update first mode accumulator  更新第一模态累加器
            k = 0
            sum_uk = u_hat_plus[n,:,K-1] + sum_uk - u_hat_plus[n,:,0]
            
            # update spectrum of first mode through Wiener filter of residuals
            # 通过残差的维纳滤波器更新第一模态的频谱
            u_hat_plus[n+1,:,k] = (f_hat_plus - sum_uk - lambda_hat[n,:]/2)/(1.+Alpha[k]*(freqs - omega_plus[n,k])**2)
            
            # update first omega if not held at 0 如果没有保持0,则更新第一个omega
            if not(DC):
                omega_plus[n+1,k] = np.dot(freqs[T//2:T],(abs(u_hat_plus[n+1, T//2:T, k])**2))/np.sum(abs(u_hat_plus[n+1,T//2:T,k])**2)
    
            # update of any other mode
            for k in np.arange(1,K):
                #accumulator
                sum_uk = u_hat_plus[n+1,:,k-1] + sum_uk - u_hat_plus[n,:,k]
                # mode spectrum
                u_hat_plus[n+1,:,k] = (f_hat_plus - sum_uk - lambda_hat[n,:]/2)/(1+Alpha[k]*(freqs - omega_plus[n,k])**2)
                # center frequencies
                omega_plus[n+1,k] = np.dot(freqs[T//2:T],(abs(u_hat_plus[n+1, T//2:T, k])**2))/np.sum(abs(u_hat_plus[n+1,T//2:T,k])**2)
                
            # Dual ascent  双重上升
            lambda_hat[n+1,:] = lambda_hat[n,:] + tau*(np.sum(u_hat_plus[n+1,:,:],axis = 1) - f_hat_plus)
            
            # loop counter
            n = n+1
            
            # converged yet?
            uDiff = np.spacing(1)
            for i in range(K):
                uDiff = uDiff + (1/T)*np.dot((u_hat_plus[n,:,i]-u_hat_plus[n-1,:,i]),np.conj((u_hat_plus[n,:,i]-u_hat_plus[n-1,:,i])))
    
            uDiff = np.abs(uDiff)        
                
        #Postprocessing and cleanup
        
        #discard empty space if converged early
        Niter = np.min([Niter,n])
        omega = omega_plus[:Niter,:]
        
        idxs = np.flip(np.arange(1,T//2+1),axis = 0)
        # Signal reconstruction
        u_hat = np.zeros([T, K],dtype = complex)
        u_hat[T//2:T,:] = u_hat_plus[Niter-1,T//2:T,:]
        u_hat[idxs,:] = np.conj(u_hat_plus[Niter-1,T//2:T,:])
        u_hat[0,:] = np.conj(u_hat[-1,:])    
        
        u = np.zeros([K,len(t)])
        for k in range(K):
            u[k,:] = np.real(np.fft.ifft(np.fft.ifftshift(u_hat[:,k])))
            
        # remove mirror part
        u = u[:,T//4:3*T//4]
    
        # recompute spectrum
        u_hat = np.zeros([u.shape[1],K],dtype = complex)
        for k in range(K):
            u_hat[:,k]=np.fft.fftshift(np.fft.fft(u[k,:]))
    
        return u, u_hat, omega
    

    5. 相关知识点

    (1)np.flip:沿着指定的轴反转元素

    >>> A = np.arange(8).reshape((2,2,2))
    >>> A
    array([[[0, 1],
            [2, 3]],
           [[4, 5],
            [6, 7]]])
            
    >>> flip(A, 0)
    array([[[4, 5],
            [6, 7]],
           [[0, 1],
            [2, 3]]])
            
    >>> flip(A, 1)
    array([[[2, 3],
            [0, 1]],
           [[6, 7],
            [4, 5]]])
    
    >>>np.flip(A, 2)
    array([[[1, 0],
            [3, 2]],
           [[5, 4],
            [7, 6]]])
    
    

    参考论文链接:https://pan.baidu.com/s/1BCKjc5paLkAOtM1lVlXSjQ
    提取码:105f

    展开全文
  • vmd变分模态分解,matlab源代码,亲测可用
  • VMD变分模态分解,直接调用VMD.py里面的函数即可使用
  • VMD_decomposition_VMD变分模态分解)_vmd_变分模态分解.zip
  • VMD_decomposition_VMD变分模态分解)_vmd_变分模态分解_源码.zip
  • VMD变分模态分解代码问题

    千次阅读 2020-12-11 07:14:10
     %总信号拟合误差允许程度 %--------------- Run actual VMD code [u, u_hat, omega] = VMD(f, alpha, tau, K, DC, init, tol); %--------------- Visualization % For convenience here: Order omegas ...

    clear all;

    close all;

    clc;

    % Time Domain 0 to T

    T = 1000;

    fs = 1/T;

    t = (1:T)/T;

    freqs = 2*pi*(t-0.5-1/T)/(fs);

    % center frequencies of components

    f_1 = 2;

    f_2 = 24;

    f_3 = 288;

    % modes

    v_1 = (cos(2*pi*f_1*t));          %信号1

    v_2 = 1/4*(cos(2*pi*f_2*t));     %信号2

    v_3 = 1/16*(cos(2*pi*f_3*t));    %信号3

    % for visualization purposes

    fsub = {};

    wsub = {};

    fsub{1} = v_1;

    fsub{2} = v_2;

    fsub{3} = v_3;

    wsub{1} = 2*pi*f_1;

    wsub{2} = 2*pi*f_2;

    wsub{3} = 2*pi*f_3;

    % composite signal, including noise

    f = v_1 + v_2 + v_3 + 0.1*randn(size(v_1));     %叠加信号

    f_hat = fftshift((fft(f)));

    % some sample parameters for VMD

    alpha = 2000;        % moderate bandwidth constraint

    tau = 0;            % noise-tolerance (no strict fidelity enforcement)噪声耐受,一般取0就行

    K = 3;              % 3 modes

    DC = 0;             % no DC part imposed

    init = 1;           % initialize omegas uniformly

    tol = 1e-7;         %总信号拟合误差允许程度

    %--------------- Run actual VMD code

    [u, u_hat, omega] = VMD(f, alpha, tau, K, DC, init, tol);

    %--------------- Visualization

    % For convenience here: Order omegas increasingly and reindex u/u_hat

    [~, sortIndex] = sort(omega(end,:));

    omega = omega(:,sortIndex);

    u_hat = u_hat(:,sortIndex);

    u = u(sortIndex,:);

    linestyles = {'b', 'g', 'm', 'c', 'c', 'r', 'k'};

    figure('Name', 'Composite input signal' );

    plot(t,f, 'k');

    set(gca, 'XLim', [0 1]);

    for sub = 1:length(fsub)

    figure('Name', ['Input signal component ' num2str(sub)] );

    plot(t,fsub{sub}, 'b');               %感觉这位置是对信号1,2,3直接进行plot

    set(gca, 'XLim', [0 1]);

    end

    展开全文
  • 实现二维数据包括图片的变分模态分解,可以分解成多个IMF
  • 变分模态分解算法比传统的EMD算法要好得多,这是源程序

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 177
精华内容 70
关键字:

变分模态分解vmd

友情链接: Acrobat_82825.zip