这篇文章给大家带来三个项目:
- VMD的C++实现
- 二维VMD的C++实现
- 二维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两个库来读取和显示图片。
还请注意 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