[项目成果]PySDKit:信号分解算法的Python库

文摘   2024-10-11 19:04   广东  

GitHub链接:https://github.com/wwhenxuan/PySDKit
PyPI链接:https://pypi.org/project/PySDKit/

什么是信号分解😊

信号分解是“后小波时代”中最为可靠的信号时频分析技术,该方法假设现实中复杂的非平稳非线性信号是由多个简单的子信号(本征模态函数)组成,通过分析这些子信号的特征可以间接或直接揭示原始复杂信号的时频信息。信号分解克服了傅立叶变换在非平稳和非线性信号处理上的局限性,并且分解后得到的本征模态函数在各方面都超越了小波变化的时频图。自1998年希尔伯特-黄变换提出之后,一系列一元/多元信号分解算法都取得了重大发展,并成功应用于医疗和工业等多个领域。

信号分解算法在机器学习中的实际情况😭

但由于信号处理领域的学者使用的主要编程语言为Matlab,而Python是机器学习和深度学习的主阵地,因此信号分解算法缺乏像小波变换有pywavelets等综合且全面的Python库,导致其在机器学习和深度学习领域中的使用远没有小波变化那么广泛。

开发PySDKit信号分解算法库的动机😋

为了更好的使信号分解算法作为一种高效的特征工程,与机器学习模型或深度神经网络模型相结合,方便大家的使用,减小科研难度并缩短科研周期,本人从2024年4月着手开发第一个综合全面的信号分解Python库:PySDKit。该项目目前已经成功复现经验模型分解EMD,经验小波变化EWT,变分模态分解VMD,非线性调频模态分解VNCMD等主流的算法以及可视化平台😍。截止到目前PyPI的下载量高达1594次🔥。在此希望大家也能多多参与和使用,只要大家用的开心就是对我们开发者最大的鼓励👍,Github链接,希望大家多多点star🌟。

PySDKit简易的使用方式

项目安装

我们可以直接通过pip指令安装PySDKit

pip install pysdkit

在项目开发时,我们仅使用了NumPyScipy两个主流的数据科学模块,并使用matplotlib开发了数据可视化平台。

使用方法

整个项目不仅包括信号分解的算法,还有一系列的信号处理功能模块以及可视化平台,其中很多的对象在开发时都借鉴了Scikit-learn形式简易的API,主要分为以下四个步骤即可快速实现信号的分解与可视化:

  1. 导入信号分解算法并传递参数;
  2. 创建信号分解算法的对象实例;
  3. 使用fit_transform方法输入信号实现分解;
  4. 使用plot_IMFs函数对原信号和分解得到的信号进行可视化。

使用示例

下面我们将使用以下模拟信号来测试经验模态分解经验小波变换两种算法,并通过变分模态分解算法来处理真实信号。

import numpy as np
from pysdkit import EMD
from pysdkit.data import test_ewt
from pysdkit.plot import plot_IMFs

# create an example signal
t, signal = test_ewt()
print(signal.shape)

# create an instance for signal decomposition
emd = EMD()  # try empirical mode decomposition algorithm
# implement signal decomposition
IMFs = emd.fit_transform(signal, max_imf=3)
plot_IMFs(signal, IMFs)


上述代码中使用的信号分解算法是最为经典的方法:经验模态分解(Empirical Mode Decomposition, EMD)。该方法通过利用信号极值的递归筛选过程,将输入信号分解为固有模态的本征模态函数(Intrinsic Mode Function, IMF),可以被写为如下的的形式:

其中为递增的相位函数,为可随时间变化的振幅。

为了得到更好的分解结果,我们可以尝试其他算法如经验小波变换(Empirical wavelet transform, EWT),该方法融合了经验模态分解和小波变换的优势,通过峰值检测机制对频谱进行分割,并在每个分割区间构建小波滤波器,实现将一个复杂信号分解为一系列具有紧支撑频谱的调频调幅信号。

from pysdkit import EWT

# create an instance for signal decomposition
ewt = EWT()  # try empirical wavelet transform algorithm
IMFs = ewt.fit_transform(signal=signal)
print(IMFs.shape)
plot_IMFs(signal, IMFs)


要论最具代表性的信号分解方法非变分模态分解(Variational mode decomposition, VMD)莫属,该方法在频域中将信号分解问题转化为了一个带有约束的变分优化问题,我们用表示待分解的信号,表示分解得到的第个本征模态函数,表示的中心频率,则该问题通过拉格朗日交替乘子法()可以写为:

我们使用更为复杂的真实信号来测试VMD算法的性能,对于该算法我们需要传递特定的参数。

from pysdkit import VMD

# load new signal
signal = np.load("example.npy")

# use variational mode decomposition
vmd = VMD(alpha=500, K=3, tau=0.0, tol=1e-9)
IMFs = vmd.fit_transform(signal=signal)
print(IMFs.shape)

vmd.plot_IMFs(save_figure=True, dpi=600)

项目当前发展情况🤗

目前整个项目仅由我一个人开发,因此整体进度较慢,如果有对信号处理感兴趣,并且喜欢编程和优化算法的朋友们可以参与一起研发。

我希望能够尽可能的准确复现目前已有的绝大多数的信号分解算法,为大家提供一个综合且全面的信号分解Python库🥳。

联系方法意见反馈:whenxuan@ieee.org

参考文献

Lei Y, Lin J, He Z, et al. A review on empirical mode decomposition in fault diagnosis of rotating machinery[J]. Mechanical systems and signal processing, 2013, 35(1-2): 108-126.

Rehman N, Mandic D P. Multivariate empirical mode decomposition[J]. Proceedings of the Royal Society A: Mathematical, Physical and Engineering Sciences, 2010, 466(2117): 1291-1302.

Gilles J. Empirical wavelet transform[J]. IEEE transactions on signal processing, 2013, 61(16): 3999-4010.

Dragomiretskiy K, Zosso D. Variational mode decomposition[J]. IEEE transactions on signal processing, 2013, 62(3): 531-544.

ur Rehman N, Aftab H. Multivariate variational mode decomposition[J]. IEEE Transactions on signal processing, 2019, 67(23): 6039-6052.


EvoIGroup
Evolutionary Intelligence (EvoI) Group。主要介绍进化智能在网络科学,机器学习,优化和实际(工业)应用上的研究进展。欢迎投稿推文等。联系方式:evoIgroup@163.com。
 最新文章