这篇文章给大家带来三个项目:

  1. VMD的C++实现
  2. 二维VMD的C++实现
  3. 二维VMD的Python3实现

1 VMD(变分模态分解)的C++实现,使用了Eigen3

作者:Dodge asdsay@gmail.com
更新日期:2023-11-13

VMD(变分模态分解)是一种信号处理算法,可以将输入信号分解为不同带限的内禀模态函数(IMFs)。
本项目VMD_cpp 是参考于其在MATLAB中的实现。在项目中,借助eigen3来实现C++中的VMD,从而无须MATLAB的计算。详细的输入输出,可以查看VMD_Utils.cpp文件中的 VMD函数。

本项目用MSBuild编写,也可在Visual Studio 2022、MSVC或CMAKE/GCC中运行,sln项目文件或CMakeList.txt都能用。

如果需要描述变分模态分解的文档,可参阅原始论文Variational Mode Decomposition

更新于2023-11-13:这个项目稍慢。我尝试使用OpenMP来使Eigen进行并行计算,但并没有提速。所以我没有实现那一版,我仅在原代码上修改,尽可能让Eigen加快,希望效果足够好吧。

Github仓库分享:DodgeHo/VMD_cpp


2 二维VMD(变分模态分解)的C++实现,使用了Eigen3

作者:Dodge asdsay@gmail.com
更新日期:2023-11-15

VMD(变分模态分解)是一种信号处理算法,可以将输入信号分解为不同带限的内禀模态函数(IMFs)。类似于项目VMD_CPP,本项目VMD_2D_CPP是参考于其在MATLAB中的实现。基于频谱的二维输入信号分解为k个带分离模式。

如果需要描述变分模态分解的文档,可参阅原始论文Variational Mode Decomposition。此链接中有MATLAB代码。

在这个项目中,我用Eigen3实现了C++中的VMD,无须MATLAB。同时,为了输入一张图片进行测试,使用了另一个库CImg。这个示例代码是用MSBuild编写的。
本项目用MSBuild编写,也可在Visual Studio 2022、MSVC或CMAKE/GCC中运行,sln项目文件或CMakeList.txt都能用。详细的输入和输出请查看VMD_2D_Utils.cpp文件中的VMD_2D_CPP函数。

附:这个VMD_2D运行稍慢。我之后会尝试用OpenCV重新实现。

Github仓库分享:DodgeHo/VMD_2D_cpp


3 二维VMD(变分模态分解)的Python3实现,使用NumPy

作者:Dodge asdsay@gmail.com 更新日期:2023-11-16

VMD(变分模态分解)是一种信号处理算法,可以将输入信号分解为不同带限的内禀模态函数(IMFs)。
VMD_2D意味着我们正在处理二维信号(通常两个维度应该长度相同)。项目是MATLAB中实现的模仿。基于频谱的二维输入信号分解为k个带分离模式。
本项目VMD_2D_Python是参考于其在MATLAB中的实现。基于频谱的二维输入信号分解为k个带分离模式。


在这个项目中,我用一张灰度图片进行测试。本项目VMD_2D_Python仅需要Numpy,但我们还需要OpenCV和matplotlib两个库来读取和显示图片。

python一维数据转二维数据 python 二维变一维_python一维数据转二维数据


还请注意 VMD2D.py第34-35行:

# Maximum number of iterations`<br />
N = 3000`

在原始的Matlab代码中,N是固定值3000。然而在测试中,样本图片计算的误差没有收敛。发现对于这张图片,如果设置N = 100,实际效果几乎就收敛了。请用户更改N值测试效果。


如果需要描述变分模态分解的文档,可参阅原始论文:
K. Dragomiretskiy, D. Zosso, Variational Mode Decomposition, IEEE Trans. on Signal Processing (in press) http://dx.doi.org/10.1109/TSP.2013.2288675

Github仓库分享:DodgeHo/VMD_cpp