不知道你数据样本点有多少个,EMD要递归计算,插值很消耗时间,没法解决。EMD-signal这里是一个EMD开源包,包括EMD和它的一些改进的实现,底层是C语言实现的,效率比较高。scipy库里有些信号处理的API,得到IMFs以后再进行希尔伯特变换得到瞬时频率。其他的方法还有变分模态分解VMDIEEE Journals & Magazine这是论文,网上可以找到matlab实现的代码 ,你可以试一下。VMD将实际输入信号分解为多个具有特定稀疏属性的模式,同时再现输入,每种模式之前的稀疏性被选择为其频谱带宽, IMF是同时提取而不是递归,效率比较高。 我4000个数据点计算大概需要2s,google学术上有许多相关应用,你自己看一下吧。
EMD-signalpypi.org
VMD是把信号分解为调幅调频信号的集合,它假设分解出来的信号在中心频率周围紧凑(带宽小)
目标:最小化各模式带宽(分解得到的AM-FM信号频率变化不大)
重建约束:各模式累加可以精确重建原信号
在最小化目标里引入二次罚项和拉格朗日乘子
第二项是二次罚项 ,加快收敛
第三项是拉格朗日乘子。拉格朗日乘数法的基本思想:作为一种优化算法,拉格朗日乘子法主要用于解决约束优化问题,它的基本思想就是通过引入拉格朗日乘子来将含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题。拉格朗日乘子背后的数学意义是其为约束方程梯度线性组合中每个向量的系数。f(t)-uk(t)的和=0,是一个等式约束。把等式约束f(t)-uk(t)乘以一个系数lambda(t)与加到原最小化式子写称为拉格朗日函数,而系数称为拉格朗日乘子。通过拉格朗日函数对各个变量求导,令其为零,可以求得候选值集合,然后验证求得最优值。
然后就是求解最新的这个无约束最小化问题,具体算法见论文。一份python代码
import numpy as np
"""
输入和参数:
-----------------------------------------------
signal - 要分解的时域信号(1D)
alpha -- 数据重构的平衡参数,即二次罚项因子
tau ---- 双重上升的时间步长(对于噪音松弛,选择0)
K ----- 要恢复的模态数量,K>=1
DC ----- 如果第一种模态被放置并保持在DC(0-freq)
init --- 0 = 所有的omegas从0开始
1 = 所有的omegas开始均匀分布
2