PySDKit 0.4.25__tar.gz → 0.4.27__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pysdkit-0.4.25 → pysdkit-0.4.27}/PKG-INFO +33 -16
- {pysdkit-0.4.25 → pysdkit-0.4.27}/PySDKit.egg-info/PKG-INFO +33 -16
- {pysdkit-0.4.25 → pysdkit-0.4.27}/PySDKit.egg-info/SOURCES.txt +10 -2
- {pysdkit-0.4.25 → pysdkit-0.4.27}/README.md +2 -2
- pysdkit-0.4.27/pyproject.toml +68 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/__init__.py +12 -2
- pysdkit-0.4.27/pysdkit/_alif/__init__.py +6 -0
- pysdkit-0.4.27/pysdkit/_alif/_helpers.py +248 -0
- pysdkit-0.4.27/pysdkit/_alif/alif.py +191 -0
- pysdkit-0.4.27/pysdkit/_alif/data/__init__.py +1 -0
- pysdkit-0.4.27/pysdkit/_alif/data/prefixed_double_filter.npy +0 -0
- pysdkit-0.4.27/pysdkit/_alif/iterative_filtering.py +175 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/emd.py +2 -2
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/hht/hht.py +4 -4
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_faemd/faemd.py +2 -2
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_itd/itd.py +7 -5
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vncmd/__init__.py +2 -0
- pysdkit-0.4.27/pysdkit/_vncmd/avncmd.py +491 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/entropy/_permutation_entropy.py +2 -2
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/entropy/_sample_entropy.py +3 -3
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/models/_pca.py +5 -5
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/plot/_fourier_spectra.py +1 -1
- pysdkit-0.4.27/pysdkit/tests/__init__.py +12 -0
- pysdkit-0.4.27/pysdkit/tests/data/__init__.py +2 -0
- pysdkit-0.4.27/pysdkit/tests/models/__init__.py +2 -0
- pysdkit-0.4.27/pysdkit/tests/models/test_knn.py +190 -0
- pysdkit-0.4.27/pysdkit/tests/models/test_pca.py +80 -0
- pysdkit-0.4.27/pysdkit/tests/run_all.py +57 -0
- pysdkit-0.4.27/pysdkit/tests/test_alif.py +102 -0
- pysdkit-0.4.27/pysdkit/tests/test_avncmd.py +127 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_emd.py +68 -54
- pysdkit-0.4.27/pysdkit/tests/test_ewt.py +166 -0
- pysdkit-0.4.27/pysdkit/tests/test_faemd.py +206 -0
- pysdkit-0.4.27/pysdkit/tests/test_lmd.py +80 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_moving_decomp.py +77 -55
- pysdkit-0.4.27/pysdkit/tests/test_rlmd.py +80 -0
- pysdkit-0.4.27/pysdkit/tests/test_stl.py +153 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_vmd.py +74 -50
- pysdkit-0.4.27/pysdkit/tests/test_vmd2d.py +153 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_correlation.py +4 -4
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_function.py +3 -2
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_hilbert.py +2 -2
- pysdkit-0.4.25/pysdkit/_vncmd/avncmd.py +0 -501
- pysdkit-0.4.25/pysdkit/tests/__init__.py +0 -6
- pysdkit-0.4.25/pysdkit/tests/data/__init__.py +0 -6
- pysdkit-0.4.25/pysdkit/tests/models/__init__.py +0 -6
- pysdkit-0.4.25/pysdkit/tests/models/test_knn.py +0 -164
- pysdkit-0.4.25/pysdkit/tests/models/test_pca.py +0 -71
- pysdkit-0.4.25/pysdkit/tests/test_all.py +0 -23
- pysdkit-0.4.25/pysdkit/tests/test_ewt.py +0 -138
- pysdkit-0.4.25/pysdkit/tests/test_faemd.py +0 -170
- pysdkit-0.4.25/pysdkit/tests/test_lmd.py +0 -66
- pysdkit-0.4.25/pysdkit/tests/test_rlmd.py +0 -66
- pysdkit-0.4.25/pysdkit/tests/test_stl.py +0 -145
- pysdkit-0.4.25/pysdkit/tests/test_vmd2d.py +0 -137
- pysdkit-0.4.25/setup.py +0 -42
- {pysdkit-0.4.25 → pysdkit-0.4.27}/LICENSE +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/PySDKit.egg-info/dependency_links.txt +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/PySDKit.egg-info/requires.txt +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/PySDKit.egg-info/top_level.txt +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/_find_extrema.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/_prepare_points.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/_splines.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/ceemdan.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/eemd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/efd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/hht/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/hht/frequency.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/memd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/remd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/tvf_emd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd2d/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd2d/bemd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd2d/bmemd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd2d/emd2d.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_esmd/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_esmd/esmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_ewt/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_ewt/ewt.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_ewt/ewt2d.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_faemd/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_faemd/extrema.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_faemd/faemd2d.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_faemd/faemd3d.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_faemd/filter.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_fmd/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_fmd/fmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_fmd/nfmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_hvd/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_hvd/hvd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_ifd/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_itd/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_jmd/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_jmd/jmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_jmd/mjmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_lmd/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_lmd/lmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_lmd/rlmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_osd/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_ssa/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_ssa/ssa.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/acmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/avmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/ba_acmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/base.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/mvmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/svmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/vmd_c.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/vmd_f.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/vme.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd2d/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd2d/cvmd2d.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd2d/vmd2d.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vncmd/incmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vncmd/mncmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vncmd/vncmd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_add_noise.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_cube.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_generator.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_image.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_models.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_test_univariate.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_time_series.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/texture.txt +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/entropy/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/entropy/_approxiamte_entropy.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/models/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/models/_base.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/models/_kmeans.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/models/_knn.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/plot/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/plot/_functions.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/plot/_plot_images.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/plot/_plot_imfs.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/plot/_plot_signal.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/data/test_generator_cube.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/data/test_generator_image.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/data/test_generator_signal.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/data/test_generator_univariate_signal.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_ceemdan.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_faemd2d.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_faemd3d.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_itd.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tsa/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tsa/_dtw.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tsa/_moving_decomp.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tsa/_mstl.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tsa/_stl.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/__init__.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_cite.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_diagnalization.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_differ.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_fft.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_instantaneous.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_kernel_matrix.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_mirror.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_process.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_smooth1d.py +0 -0
- {pysdkit-0.4.25 → pysdkit-0.4.27}/setup.cfg +0 -0
|
@@ -1,20 +1,47 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PySDKit
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.27
|
|
4
4
|
Summary: A Python library for signal decomposition algorithms with a unified interface.
|
|
5
|
-
|
|
6
|
-
Author:
|
|
7
|
-
|
|
5
|
+
Author: josefinez, Deeksha Manjunath, Yuan Feng, JacktheFowler
|
|
6
|
+
Author-email: Whenxuan Wang <wwhenxuan@gmail.com>, RuiZhe Wang <3133986068@qq.com>, WenTong Zhao <23049200290@stu.xidian.edu.cn>
|
|
7
|
+
Maintainer-email: Whenxuan Wang <wwhenxuan@gmail.com>
|
|
8
|
+
License: MIT License
|
|
9
|
+
|
|
10
|
+
Copyright (c) 2019 Whenxuan Wang
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
in the Software without restriction, including without limitation the rights
|
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
furnished to do so, subject to the following conditions:
|
|
18
|
+
|
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
copies or substantial portions of the Software.
|
|
21
|
+
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
SOFTWARE.
|
|
29
|
+
|
|
30
|
+
Project-URL: Homepage, https://github.com/wwhenxuan/PySDKit
|
|
31
|
+
Project-URL: Repository, https://github.com/wwhenxuan/PySDKit
|
|
32
|
+
Project-URL: Issues, https://github.com/wwhenxuan/PySDKit/issues
|
|
8
33
|
Keywords: signal decomposition,signal processing,machine learning
|
|
9
34
|
Classifier: Development Status :: 3 - Alpha
|
|
10
35
|
Classifier: Intended Audience :: Science/Research
|
|
11
36
|
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
12
37
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
13
38
|
Classifier: License :: OSI Approved :: MIT License
|
|
39
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
40
|
Classifier: Programming Language :: Python :: 3.8
|
|
15
41
|
Classifier: Programming Language :: Python :: 3.9
|
|
16
42
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
43
|
Classifier: Programming Language :: Python :: 3.11
|
|
44
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
45
|
Requires-Python: >=3.8
|
|
19
46
|
Description-Content-Type: text/markdown
|
|
20
47
|
License-File: LICENSE
|
|
@@ -23,17 +50,7 @@ Requires-Dist: scipy>=1.11.1
|
|
|
23
50
|
Requires-Dist: matplotlib>=3.7.2
|
|
24
51
|
Requires-Dist: tqdm>=4.66.5
|
|
25
52
|
Requires-Dist: requests>=2.32.3
|
|
26
|
-
Dynamic: author
|
|
27
|
-
Dynamic: author-email
|
|
28
|
-
Dynamic: classifier
|
|
29
|
-
Dynamic: description
|
|
30
|
-
Dynamic: description-content-type
|
|
31
|
-
Dynamic: home-page
|
|
32
|
-
Dynamic: keywords
|
|
33
53
|
Dynamic: license-file
|
|
34
|
-
Dynamic: requires-dist
|
|
35
|
-
Dynamic: requires-python
|
|
36
|
-
Dynamic: summary
|
|
37
54
|
|
|
38
55
|
# PySDKit: signal decomposition in Python
|
|
39
56
|
|
|
@@ -142,7 +159,7 @@ plot_IMFs_amplitude_spectra(IMFs, smooth="exp") # use exp smooth
|
|
|
142
159
|
| [`FAEMD3D`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_faemd/faemd3d.py) (Three-Dimensional Fast and Adaptive EMD) | [[paper]](https://ieeexplore.ieee.org/document/8447300) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/71270-fast-and-adaptive-multivariate-and-multidimensional-emd) | ✖️ |
|
|
143
160
|
| [`HVD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_hvd/hvd.py) (Hilbert Vibration Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/pii/S0022460X06001556) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/178804-hilbert-vibration-decomposition?s_tid=FX_rc1_behav) | ✔️ |
|
|
144
161
|
| [`ITD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_itd/itd.py) (Intrinsic Time-Scale Decomposition) | [[paper]](https://royalsocietypublishing.org/doi/10.1098/rspa.2006.1761) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/69380-intrinsic-time-scale-decomposition-itd) | ✔️ |
|
|
145
|
-
| [`ALIF`]() (Adaptive Local Iterative Filtering) | [[paper]](https://arxiv.org/abs/1411.6051) | [[code]](https://ww2.mathworks.cn/matlabcentral/fileexchange/56210-alif) |
|
|
162
|
+
| [`ALIF`]() (Adaptive Local Iterative Filtering) | [[paper]](https://arxiv.org/abs/1411.6051) | [[code]](https://ww2.mathworks.cn/matlabcentral/fileexchange/56210-alif) | ✔️ |
|
|
146
163
|
| [`LMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_lmd/lmd.py) (Local Mean Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/abs/pii/S1051200418308133?via%3Dihub) | [[code]](https://github.com/shownlin/PyLMD/blob/master/PyLMD/LMD.py) | ✔️ |
|
|
147
164
|
| [`RLMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_lmd/rlmd.py) (Robust Local Mean Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/abs/pii/S0888327017301619) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/66935-robust-local-mean-decomposition-rlmd) | ✔️ |
|
|
148
165
|
| [`FMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_fmd/fmd.py) (Feature Mode Decomposition) | [[paper]](https://ieeexplore.ieee.org/document/9732251) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/108099-feature-mode-decomposition-fmd) | ✖️ |
|
|
@@ -159,7 +176,7 @@ plot_IMFs_amplitude_spectra(IMFs, smooth="exp") # use exp smooth
|
|
|
159
176
|
| [`VNCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/vncmd.py) (Variational Nonlinear Chirp Mode Decomposition) | [[paper]](https://ieeexplore.ieee.org/document/7990179) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/64292-variational-nonlinear-chirp-mode-decomposition) | ✔️ |
|
|
160
177
|
| [`INCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/incmd.py) (Iterative Nonlinear Chirp Mode Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/pii/S0022460X2030403X?via%3Dihub) | [[code]](https://github.com/sheadan/IterativeNCMD) | ✔️ |
|
|
161
178
|
| [`MNCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/mncmd.py) (Multivariate Nonlinear Chirp Mode Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/abs/pii/S0165168420302103) | [[code]]() | ✖️ |
|
|
162
|
-
| [`AVNCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/avncmd.py) (Adaptive Variational Nonlinear Chirp Mode Decomposition) | [[paper]](https://ieeexplore.ieee.org/abstract/document/9746147) | [[code]](https://github.com/HauLiang/AVNCMD) |
|
|
179
|
+
| [`AVNCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/avncmd.py) (Adaptive Variational Nonlinear Chirp Mode Decomposition) | [[paper]](https://ieeexplore.ieee.org/abstract/document/9746147) | [[code]](https://github.com/HauLiang/AVNCMD) | ✔️ |
|
|
163
180
|
| [`ACMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vmd/acmd.py) (Adaptive Chirp Mode Decomposition) | [[paper]]() | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/121373-data-driven-adaptive-chirp-mode-decomposition?s_tid=srchtitle) | ✔️ |
|
|
164
181
|
| [`BA-ACMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vmd/ba_acmd.py) (Bandwidth-aware adaptive chirp mode decomposition) | [[paper]](https://journals.sagepub.com/doi/abs/10.1177/14759217231174699) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/132792-bandwidth-aware-adaptive-chirp-mode-decomposition-ba-acmd?s_tid=srchtitle) | ✖️ |
|
|
165
182
|
| [`JMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_jmd/jmd.py) (Jump Plus AM-FM Mode Decomposition) | [[paper]](https://arxiv.org/abs/2407.07800) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/169388-jump-plus-am-fm-mode-decomposition-jmd?s_tid=prof_contriblnk) | ️✔️ |
|
|
@@ -1,20 +1,47 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PySDKit
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.27
|
|
4
4
|
Summary: A Python library for signal decomposition algorithms with a unified interface.
|
|
5
|
-
|
|
6
|
-
Author:
|
|
7
|
-
|
|
5
|
+
Author: josefinez, Deeksha Manjunath, Yuan Feng, JacktheFowler
|
|
6
|
+
Author-email: Whenxuan Wang <wwhenxuan@gmail.com>, RuiZhe Wang <3133986068@qq.com>, WenTong Zhao <23049200290@stu.xidian.edu.cn>
|
|
7
|
+
Maintainer-email: Whenxuan Wang <wwhenxuan@gmail.com>
|
|
8
|
+
License: MIT License
|
|
9
|
+
|
|
10
|
+
Copyright (c) 2019 Whenxuan Wang
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
in the Software without restriction, including without limitation the rights
|
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
furnished to do so, subject to the following conditions:
|
|
18
|
+
|
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
copies or substantial portions of the Software.
|
|
21
|
+
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
SOFTWARE.
|
|
29
|
+
|
|
30
|
+
Project-URL: Homepage, https://github.com/wwhenxuan/PySDKit
|
|
31
|
+
Project-URL: Repository, https://github.com/wwhenxuan/PySDKit
|
|
32
|
+
Project-URL: Issues, https://github.com/wwhenxuan/PySDKit/issues
|
|
8
33
|
Keywords: signal decomposition,signal processing,machine learning
|
|
9
34
|
Classifier: Development Status :: 3 - Alpha
|
|
10
35
|
Classifier: Intended Audience :: Science/Research
|
|
11
36
|
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
12
37
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
13
38
|
Classifier: License :: OSI Approved :: MIT License
|
|
39
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
40
|
Classifier: Programming Language :: Python :: 3.8
|
|
15
41
|
Classifier: Programming Language :: Python :: 3.9
|
|
16
42
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
43
|
Classifier: Programming Language :: Python :: 3.11
|
|
44
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
45
|
Requires-Python: >=3.8
|
|
19
46
|
Description-Content-Type: text/markdown
|
|
20
47
|
License-File: LICENSE
|
|
@@ -23,17 +50,7 @@ Requires-Dist: scipy>=1.11.1
|
|
|
23
50
|
Requires-Dist: matplotlib>=3.7.2
|
|
24
51
|
Requires-Dist: tqdm>=4.66.5
|
|
25
52
|
Requires-Dist: requests>=2.32.3
|
|
26
|
-
Dynamic: author
|
|
27
|
-
Dynamic: author-email
|
|
28
|
-
Dynamic: classifier
|
|
29
|
-
Dynamic: description
|
|
30
|
-
Dynamic: description-content-type
|
|
31
|
-
Dynamic: home-page
|
|
32
|
-
Dynamic: keywords
|
|
33
53
|
Dynamic: license-file
|
|
34
|
-
Dynamic: requires-dist
|
|
35
|
-
Dynamic: requires-python
|
|
36
|
-
Dynamic: summary
|
|
37
54
|
|
|
38
55
|
# PySDKit: signal decomposition in Python
|
|
39
56
|
|
|
@@ -142,7 +159,7 @@ plot_IMFs_amplitude_spectra(IMFs, smooth="exp") # use exp smooth
|
|
|
142
159
|
| [`FAEMD3D`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_faemd/faemd3d.py) (Three-Dimensional Fast and Adaptive EMD) | [[paper]](https://ieeexplore.ieee.org/document/8447300) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/71270-fast-and-adaptive-multivariate-and-multidimensional-emd) | ✖️ |
|
|
143
160
|
| [`HVD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_hvd/hvd.py) (Hilbert Vibration Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/pii/S0022460X06001556) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/178804-hilbert-vibration-decomposition?s_tid=FX_rc1_behav) | ✔️ |
|
|
144
161
|
| [`ITD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_itd/itd.py) (Intrinsic Time-Scale Decomposition) | [[paper]](https://royalsocietypublishing.org/doi/10.1098/rspa.2006.1761) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/69380-intrinsic-time-scale-decomposition-itd) | ✔️ |
|
|
145
|
-
| [`ALIF`]() (Adaptive Local Iterative Filtering) | [[paper]](https://arxiv.org/abs/1411.6051) | [[code]](https://ww2.mathworks.cn/matlabcentral/fileexchange/56210-alif) |
|
|
162
|
+
| [`ALIF`]() (Adaptive Local Iterative Filtering) | [[paper]](https://arxiv.org/abs/1411.6051) | [[code]](https://ww2.mathworks.cn/matlabcentral/fileexchange/56210-alif) | ✔️ |
|
|
146
163
|
| [`LMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_lmd/lmd.py) (Local Mean Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/abs/pii/S1051200418308133?via%3Dihub) | [[code]](https://github.com/shownlin/PyLMD/blob/master/PyLMD/LMD.py) | ✔️ |
|
|
147
164
|
| [`RLMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_lmd/rlmd.py) (Robust Local Mean Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/abs/pii/S0888327017301619) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/66935-robust-local-mean-decomposition-rlmd) | ✔️ |
|
|
148
165
|
| [`FMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_fmd/fmd.py) (Feature Mode Decomposition) | [[paper]](https://ieeexplore.ieee.org/document/9732251) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/108099-feature-mode-decomposition-fmd) | ✖️ |
|
|
@@ -159,7 +176,7 @@ plot_IMFs_amplitude_spectra(IMFs, smooth="exp") # use exp smooth
|
|
|
159
176
|
| [`VNCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/vncmd.py) (Variational Nonlinear Chirp Mode Decomposition) | [[paper]](https://ieeexplore.ieee.org/document/7990179) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/64292-variational-nonlinear-chirp-mode-decomposition) | ✔️ |
|
|
160
177
|
| [`INCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/incmd.py) (Iterative Nonlinear Chirp Mode Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/pii/S0022460X2030403X?via%3Dihub) | [[code]](https://github.com/sheadan/IterativeNCMD) | ✔️ |
|
|
161
178
|
| [`MNCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/mncmd.py) (Multivariate Nonlinear Chirp Mode Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/abs/pii/S0165168420302103) | [[code]]() | ✖️ |
|
|
162
|
-
| [`AVNCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/avncmd.py) (Adaptive Variational Nonlinear Chirp Mode Decomposition) | [[paper]](https://ieeexplore.ieee.org/abstract/document/9746147) | [[code]](https://github.com/HauLiang/AVNCMD) |
|
|
179
|
+
| [`AVNCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/avncmd.py) (Adaptive Variational Nonlinear Chirp Mode Decomposition) | [[paper]](https://ieeexplore.ieee.org/abstract/document/9746147) | [[code]](https://github.com/HauLiang/AVNCMD) | ✔️ |
|
|
163
180
|
| [`ACMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vmd/acmd.py) (Adaptive Chirp Mode Decomposition) | [[paper]]() | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/121373-data-driven-adaptive-chirp-mode-decomposition?s_tid=srchtitle) | ✔️ |
|
|
164
181
|
| [`BA-ACMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vmd/ba_acmd.py) (Bandwidth-aware adaptive chirp mode decomposition) | [[paper]](https://journals.sagepub.com/doi/abs/10.1177/14759217231174699) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/132792-bandwidth-aware-adaptive-chirp-mode-decomposition-ba-acmd?s_tid=srchtitle) | ✖️ |
|
|
165
182
|
| [`JMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_jmd/jmd.py) (Jump Plus AM-FM Mode Decomposition) | [[paper]](https://arxiv.org/abs/2407.07800) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/169388-jump-plus-am-fm-mode-decomposition-jmd?s_tid=prof_contriblnk) | ️✔️ |
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
LICENSE
|
|
2
2
|
README.md
|
|
3
|
-
|
|
3
|
+
pyproject.toml
|
|
4
4
|
PySDKit.egg-info/PKG-INFO
|
|
5
5
|
PySDKit.egg-info/SOURCES.txt
|
|
6
6
|
PySDKit.egg-info/dependency_links.txt
|
|
7
7
|
PySDKit.egg-info/requires.txt
|
|
8
8
|
PySDKit.egg-info/top_level.txt
|
|
9
9
|
pysdkit/__init__.py
|
|
10
|
+
pysdkit/_alif/__init__.py
|
|
11
|
+
pysdkit/_alif/_helpers.py
|
|
12
|
+
pysdkit/_alif/alif.py
|
|
13
|
+
pysdkit/_alif/iterative_filtering.py
|
|
14
|
+
pysdkit/_alif/data/__init__.py
|
|
15
|
+
pysdkit/_alif/data/prefixed_double_filter.npy
|
|
10
16
|
pysdkit/_emd/__init__.py
|
|
11
17
|
pysdkit/_emd/_find_extrema.py
|
|
12
18
|
pysdkit/_emd/_prepare_points.py
|
|
@@ -96,7 +102,9 @@ pysdkit/plot/_plot_images.py
|
|
|
96
102
|
pysdkit/plot/_plot_imfs.py
|
|
97
103
|
pysdkit/plot/_plot_signal.py
|
|
98
104
|
pysdkit/tests/__init__.py
|
|
99
|
-
pysdkit/tests/
|
|
105
|
+
pysdkit/tests/run_all.py
|
|
106
|
+
pysdkit/tests/test_alif.py
|
|
107
|
+
pysdkit/tests/test_avncmd.py
|
|
100
108
|
pysdkit/tests/test_ceemdan.py
|
|
101
109
|
pysdkit/tests/test_emd.py
|
|
102
110
|
pysdkit/tests/test_ewt.py
|
|
@@ -105,7 +105,7 @@ plot_IMFs_amplitude_spectra(IMFs, smooth="exp") # use exp smooth
|
|
|
105
105
|
| [`FAEMD3D`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_faemd/faemd3d.py) (Three-Dimensional Fast and Adaptive EMD) | [[paper]](https://ieeexplore.ieee.org/document/8447300) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/71270-fast-and-adaptive-multivariate-and-multidimensional-emd) | ✖️ |
|
|
106
106
|
| [`HVD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_hvd/hvd.py) (Hilbert Vibration Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/pii/S0022460X06001556) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/178804-hilbert-vibration-decomposition?s_tid=FX_rc1_behav) | ✔️ |
|
|
107
107
|
| [`ITD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_itd/itd.py) (Intrinsic Time-Scale Decomposition) | [[paper]](https://royalsocietypublishing.org/doi/10.1098/rspa.2006.1761) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/69380-intrinsic-time-scale-decomposition-itd) | ✔️ |
|
|
108
|
-
| [`ALIF`]() (Adaptive Local Iterative Filtering) | [[paper]](https://arxiv.org/abs/1411.6051) | [[code]](https://ww2.mathworks.cn/matlabcentral/fileexchange/56210-alif) |
|
|
108
|
+
| [`ALIF`]() (Adaptive Local Iterative Filtering) | [[paper]](https://arxiv.org/abs/1411.6051) | [[code]](https://ww2.mathworks.cn/matlabcentral/fileexchange/56210-alif) | ✔️ |
|
|
109
109
|
| [`LMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_lmd/lmd.py) (Local Mean Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/abs/pii/S1051200418308133?via%3Dihub) | [[code]](https://github.com/shownlin/PyLMD/blob/master/PyLMD/LMD.py) | ✔️ |
|
|
110
110
|
| [`RLMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_lmd/rlmd.py) (Robust Local Mean Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/abs/pii/S0888327017301619) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/66935-robust-local-mean-decomposition-rlmd) | ✔️ |
|
|
111
111
|
| [`FMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_fmd/fmd.py) (Feature Mode Decomposition) | [[paper]](https://ieeexplore.ieee.org/document/9732251) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/108099-feature-mode-decomposition-fmd) | ✖️ |
|
|
@@ -122,7 +122,7 @@ plot_IMFs_amplitude_spectra(IMFs, smooth="exp") # use exp smooth
|
|
|
122
122
|
| [`VNCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/vncmd.py) (Variational Nonlinear Chirp Mode Decomposition) | [[paper]](https://ieeexplore.ieee.org/document/7990179) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/64292-variational-nonlinear-chirp-mode-decomposition) | ✔️ |
|
|
123
123
|
| [`INCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/incmd.py) (Iterative Nonlinear Chirp Mode Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/pii/S0022460X2030403X?via%3Dihub) | [[code]](https://github.com/sheadan/IterativeNCMD) | ✔️ |
|
|
124
124
|
| [`MNCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/mncmd.py) (Multivariate Nonlinear Chirp Mode Decomposition) | [[paper]](https://www.sciencedirect.com/science/article/abs/pii/S0165168420302103) | [[code]]() | ✖️ |
|
|
125
|
-
| [`AVNCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/avncmd.py) (Adaptive Variational Nonlinear Chirp Mode Decomposition) | [[paper]](https://ieeexplore.ieee.org/abstract/document/9746147) | [[code]](https://github.com/HauLiang/AVNCMD) |
|
|
125
|
+
| [`AVNCMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vncmd/avncmd.py) (Adaptive Variational Nonlinear Chirp Mode Decomposition) | [[paper]](https://ieeexplore.ieee.org/abstract/document/9746147) | [[code]](https://github.com/HauLiang/AVNCMD) | ✔️ |
|
|
126
126
|
| [`ACMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vmd/acmd.py) (Adaptive Chirp Mode Decomposition) | [[paper]]() | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/121373-data-driven-adaptive-chirp-mode-decomposition?s_tid=srchtitle) | ✔️ |
|
|
127
127
|
| [`BA-ACMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_vmd/ba_acmd.py) (Bandwidth-aware adaptive chirp mode decomposition) | [[paper]](https://journals.sagepub.com/doi/abs/10.1177/14759217231174699) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/132792-bandwidth-aware-adaptive-chirp-mode-decomposition-ba-acmd?s_tid=srchtitle) | ✖️ |
|
|
128
128
|
| [`JMD`](https://github.com/wwhenxuan/PySDKit/blob/main/pysdkit/_jmd/jmd.py) (Jump Plus AM-FM Mode Decomposition) | [[paper]](https://arxiv.org/abs/2407.07800) | [[code]](https://www.mathworks.com/matlabcentral/fileexchange/169388-jump-plus-am-fm-mode-decomposition-jmd?s_tid=prof_contriblnk) | ️✔️ |
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "PySDKit"
|
|
7
|
+
dynamic = ["version"]
|
|
8
|
+
description = "A Python library for signal decomposition algorithms with a unified interface."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = { file = "LICENSE" }
|
|
11
|
+
requires-python = ">=3.8"
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "Whenxuan Wang", email = "wwhenxuan@gmail.com" },
|
|
14
|
+
{ name = "RuiZhe Wang", email = "3133986068@qq.com" },
|
|
15
|
+
{ name = "josefinez" },
|
|
16
|
+
{ name = "Deeksha Manjunath" },
|
|
17
|
+
{ name = "Yuan Feng" },
|
|
18
|
+
{ name = "WenTong Zhao", email = "23049200290@stu.xidian.edu.cn" },
|
|
19
|
+
{ name = "JacktheFowler" },
|
|
20
|
+
]
|
|
21
|
+
maintainers = [
|
|
22
|
+
{ name = "Whenxuan Wang", email = "wwhenxuan@gmail.com" },
|
|
23
|
+
]
|
|
24
|
+
keywords = [
|
|
25
|
+
"signal decomposition",
|
|
26
|
+
"signal processing",
|
|
27
|
+
"machine learning",
|
|
28
|
+
]
|
|
29
|
+
classifiers = [
|
|
30
|
+
"Development Status :: 3 - Alpha",
|
|
31
|
+
"Intended Audience :: Science/Research",
|
|
32
|
+
"Topic :: Scientific/Engineering :: Mathematics",
|
|
33
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
34
|
+
"License :: OSI Approved :: MIT License",
|
|
35
|
+
"Programming Language :: Python :: 3",
|
|
36
|
+
"Programming Language :: Python :: 3.8",
|
|
37
|
+
"Programming Language :: Python :: 3.9",
|
|
38
|
+
"Programming Language :: Python :: 3.10",
|
|
39
|
+
"Programming Language :: Python :: 3.11",
|
|
40
|
+
"Programming Language :: Python :: 3.12",
|
|
41
|
+
]
|
|
42
|
+
dependencies = [
|
|
43
|
+
"numpy>=1.24.3",
|
|
44
|
+
"scipy>=1.11.1",
|
|
45
|
+
"matplotlib>=3.7.2",
|
|
46
|
+
"tqdm>=4.66.5",
|
|
47
|
+
"requests>=2.32.3",
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
[project.urls]
|
|
51
|
+
Homepage = "https://github.com/wwhenxuan/PySDKit"
|
|
52
|
+
Repository = "https://github.com/wwhenxuan/PySDKit"
|
|
53
|
+
Issues = "https://github.com/wwhenxuan/PySDKit/issues"
|
|
54
|
+
|
|
55
|
+
[tool.setuptools.dynamic]
|
|
56
|
+
version = { attr = "pysdkit.__version__" }
|
|
57
|
+
|
|
58
|
+
[tool.setuptools]
|
|
59
|
+
include-package-data = true
|
|
60
|
+
|
|
61
|
+
[tool.setuptools.packages.find]
|
|
62
|
+
where = ["."]
|
|
63
|
+
include = ["pysdkit*"]
|
|
64
|
+
|
|
65
|
+
[tool.setuptools.package-data]
|
|
66
|
+
"*" = ["*.txt", "*.npy"]
|
|
67
|
+
"pysdkit._alif" = ["data/*.npy"]
|
|
68
|
+
"pysdkit._alif.data" = ["*.npy"]
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
A Python library for signal decomposition algorithms.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
__version__ = "0.4.
|
|
5
|
+
__version__ = "0.4.27"
|
|
6
6
|
|
|
7
7
|
# Empirical Mode Decomposition
|
|
8
8
|
from ._emd import EMD
|
|
@@ -70,6 +70,12 @@ from ._vncmd import VNCMD
|
|
|
70
70
|
# Iterative Nonlinear Chirp Mode Decomposition
|
|
71
71
|
from ._vncmd import INCMD
|
|
72
72
|
|
|
73
|
+
# Adaptive Variational Nonlinear Chirp Mode Decomposition
|
|
74
|
+
from ._vncmd import AVNCMD
|
|
75
|
+
|
|
76
|
+
# Adaptive Local Iterative Filtering
|
|
77
|
+
from ._alif import ALIF
|
|
78
|
+
|
|
73
79
|
# Empirical Wavelet Transform
|
|
74
80
|
from ._ewt import ewt, EWT
|
|
75
81
|
|
|
@@ -91,7 +97,7 @@ from ._emd import HHT
|
|
|
91
97
|
|
|
92
98
|
def greet():
|
|
93
99
|
print(
|
|
94
|
-
"""
|
|
100
|
+
r"""
|
|
95
101
|
____ ____ ____ _ __ _ _
|
|
96
102
|
| _ \ _ _ / ___| | _ \ | |/ /(_)| |_
|
|
97
103
|
| |_) || | | |\___ \ | | | || ' / | || __|
|
|
@@ -133,6 +139,8 @@ Variational Mode Decomposition for 2D Image | VMD2D
|
|
|
133
139
|
Compact VMD for 2D Image | CVMD2D
|
|
134
140
|
Variational Nonlinear Chirp Mode Decomposition | VNCMD
|
|
135
141
|
Iterative Nonlinear Chirp Mode Decomposition | INCMD
|
|
142
|
+
Adaptive Variational Nonlinear Chirp Mode Dec. | AVNCMD
|
|
143
|
+
Adaptive Local Iterative Filtering | ALIF
|
|
136
144
|
Empirical Wavelet Transform | EWT
|
|
137
145
|
Jump Plus AM-FM Mode Decomposition | JMD
|
|
138
146
|
Feature Mode Decomposition | FMD
|
|
@@ -168,6 +176,8 @@ __all__ = [
|
|
|
168
176
|
"CVMD2D",
|
|
169
177
|
"VNCMD",
|
|
170
178
|
"INCMD",
|
|
179
|
+
"AVNCMD",
|
|
180
|
+
"ALIF",
|
|
171
181
|
"ewt",
|
|
172
182
|
"EWT",
|
|
173
183
|
"JMD",
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Shared helpers for Iterative Filtering (IF) and Adaptive Local Iterative Filtering (ALIF).
|
|
4
|
+
|
|
5
|
+
MATLAB reference: https://github.com/Cicone/ALIF
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
import numpy as np
|
|
13
|
+
|
|
14
|
+
_FILTER_PATH = os.path.join(
|
|
15
|
+
os.path.dirname(os.path.abspath(__file__)),
|
|
16
|
+
"data",
|
|
17
|
+
"prefixed_double_filter.npy",
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
_MM_CACHE: Optional[np.ndarray] = None
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def load_prefixed_filter() -> np.ndarray:
|
|
24
|
+
"""Load the prefixed double filter shipped with the package."""
|
|
25
|
+
global _MM_CACHE
|
|
26
|
+
if _MM_CACHE is None:
|
|
27
|
+
if not os.path.isfile(_FILTER_PATH):
|
|
28
|
+
raise FileNotFoundError("Missing ALIF filter data: {}".format(_FILTER_PATH))
|
|
29
|
+
_MM_CACHE = np.load(_FILTER_PATH).astype(np.float64).ravel()
|
|
30
|
+
return _MM_CACHE
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def get_mask_v1(y: np.ndarray, k: float) -> np.ndarray:
|
|
34
|
+
"""
|
|
35
|
+
Resample the prefixed filter ``y`` to a mask of half-width ``k``.
|
|
36
|
+
|
|
37
|
+
Port of MATLAB ``get_mask_v1`` from ALIFv5_4.m / IF_v8_3.m.
|
|
38
|
+
"""
|
|
39
|
+
y = np.asarray(y, dtype=np.float64).ravel()
|
|
40
|
+
n = y.size
|
|
41
|
+
m = (n - 1) / 2.0
|
|
42
|
+
|
|
43
|
+
if k < 0:
|
|
44
|
+
return np.array([], dtype=np.float64)
|
|
45
|
+
|
|
46
|
+
if k <= m:
|
|
47
|
+
if abs(k - round(k)) < 1e-12:
|
|
48
|
+
k_int = int(round(k))
|
|
49
|
+
a = np.zeros(2 * k_int + 1, dtype=np.float64)
|
|
50
|
+
for i in range(1, 2 * k_int + 2):
|
|
51
|
+
s = (i - 1) * (2 * m + 1) / (2 * k_int + 1) + 1
|
|
52
|
+
t = i * (2 * m + 1) / (2 * k_int + 1)
|
|
53
|
+
s2 = np.ceil(s) - s
|
|
54
|
+
t1 = t - np.floor(t)
|
|
55
|
+
cs = int(np.ceil(s))
|
|
56
|
+
ft = int(np.floor(t))
|
|
57
|
+
mid = y[cs - 1 : ft].sum() if ft >= cs else 0.0
|
|
58
|
+
a[i - 1] = mid + s2 * y[cs - 1] + t1 * y[ft - 1]
|
|
59
|
+
return a
|
|
60
|
+
|
|
61
|
+
new_k = int(np.floor(k))
|
|
62
|
+
extra = k - new_k
|
|
63
|
+
c = (2 * m + 1) / (2 * new_k + 1 + 2 * extra)
|
|
64
|
+
a = np.zeros(2 * new_k + 3, dtype=np.float64)
|
|
65
|
+
|
|
66
|
+
t = extra * c + 1
|
|
67
|
+
t1 = t - np.floor(t)
|
|
68
|
+
ft = int(np.floor(t))
|
|
69
|
+
a[0] = y[:ft].sum() + t1 * y[ft - 1]
|
|
70
|
+
|
|
71
|
+
for i in range(2, 2 * new_k + 3):
|
|
72
|
+
s = extra * c + (i - 2) * c + 1
|
|
73
|
+
t = extra * c + (i - 1) * c
|
|
74
|
+
s2 = np.ceil(s) - s
|
|
75
|
+
t1 = t - np.floor(t)
|
|
76
|
+
cs = int(np.ceil(s))
|
|
77
|
+
ft = int(np.floor(t))
|
|
78
|
+
mid = y[cs - 1 : ft].sum() if ft >= cs else 0.0
|
|
79
|
+
a[i - 1] = mid + s2 * y[cs - 1] + t1 * y[ft - 1]
|
|
80
|
+
|
|
81
|
+
t2 = np.ceil(t) - t
|
|
82
|
+
ct = int(np.ceil(t))
|
|
83
|
+
a[-1] = y[ct - 1 :].sum() + t2 * y[ct - 1]
|
|
84
|
+
return a
|
|
85
|
+
|
|
86
|
+
dx = 0.01
|
|
87
|
+
f = y / dx
|
|
88
|
+
dy = m * dx / k
|
|
89
|
+
x_src = np.arange(0.0, m + 1e-12, 1.0)
|
|
90
|
+
x_query = np.arange(0.0, m + 1e-12, m / k)
|
|
91
|
+
b = np.interp(x_query, x_src, f[int(m) : 2 * int(m) + 1])
|
|
92
|
+
a = np.concatenate([b[:0:-1], b]) * dy
|
|
93
|
+
if abs(np.abs(a).sum() - 1.0) > 1e-14:
|
|
94
|
+
a = a / np.abs(a).sum()
|
|
95
|
+
return a
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def maxmins(
|
|
99
|
+
f: np.ndarray,
|
|
100
|
+
extension_type: str = "p",
|
|
101
|
+
tol: float = 1e-15,
|
|
102
|
+
) -> np.ndarray:
|
|
103
|
+
"""
|
|
104
|
+
Locate extrema of ``f`` (0-based indices).
|
|
105
|
+
|
|
106
|
+
Port of MATLAB ``Maxmins_v3_3`` (periodic / constant cases used by IF & ALIF).
|
|
107
|
+
"""
|
|
108
|
+
f = np.asarray(f, dtype=np.float64).ravel()
|
|
109
|
+
n_old = f.size
|
|
110
|
+
if n_old < 3:
|
|
111
|
+
return np.array([], dtype=int)
|
|
112
|
+
|
|
113
|
+
df = np.diff(f)
|
|
114
|
+
h = 0
|
|
115
|
+
|
|
116
|
+
if extension_type == "p":
|
|
117
|
+
while h < n_old - 1 and abs(df[h]) <= tol:
|
|
118
|
+
h += 1
|
|
119
|
+
if h >= n_old - 1:
|
|
120
|
+
return np.array([], dtype=int)
|
|
121
|
+
matlab_h = h + 1
|
|
122
|
+
df = np.diff(np.concatenate([f, f[1 : matlab_h + 1]]))
|
|
123
|
+
n_ext = n_old + matlab_h
|
|
124
|
+
loop_start = matlab_h
|
|
125
|
+
else:
|
|
126
|
+
n_ext = n_old
|
|
127
|
+
loop_start = 1
|
|
128
|
+
if extension_type == "c" and abs(df[0]) <= tol:
|
|
129
|
+
while h < n_old - 1 and abs(df[h]) <= tol:
|
|
130
|
+
h += 1
|
|
131
|
+
loop_start = h + 1
|
|
132
|
+
|
|
133
|
+
maxs = []
|
|
134
|
+
mins = []
|
|
135
|
+
c = 0
|
|
136
|
+
last_df = 0
|
|
137
|
+
posc = 0
|
|
138
|
+
|
|
139
|
+
def _mod_to_0based(matlab_idx: int) -> int:
|
|
140
|
+
m = matlab_idx % n_old
|
|
141
|
+
if m == 0:
|
|
142
|
+
m = n_old
|
|
143
|
+
return m - 1
|
|
144
|
+
|
|
145
|
+
for i_mat in range(loop_start, n_ext - 1):
|
|
146
|
+
i0 = i_mat - 1
|
|
147
|
+
if i0 + 1 >= df.size:
|
|
148
|
+
break
|
|
149
|
+
prod = df[i0] * df[i0 + 1]
|
|
150
|
+
|
|
151
|
+
if -tol <= prod <= tol:
|
|
152
|
+
if df[i0] < -tol:
|
|
153
|
+
last_df = -1
|
|
154
|
+
posc = i_mat
|
|
155
|
+
elif df[i0] > tol:
|
|
156
|
+
last_df = 1
|
|
157
|
+
posc = i_mat
|
|
158
|
+
c += 1
|
|
159
|
+
if df[i0 + 1] < -tol:
|
|
160
|
+
if last_df == 1:
|
|
161
|
+
maxs.append(_mod_to_0based(posc + (c - 1) // 2 + 1))
|
|
162
|
+
c = 0
|
|
163
|
+
if df[i0 + 1] > tol:
|
|
164
|
+
if last_df == -1:
|
|
165
|
+
mins.append(_mod_to_0based(posc + (c - 1) // 2 + 1))
|
|
166
|
+
c = 0
|
|
167
|
+
|
|
168
|
+
if prod < -tol:
|
|
169
|
+
if df[i0] < -tol and df[i0 + 1] > tol:
|
|
170
|
+
m = (i_mat + 1) % n_old
|
|
171
|
+
if m == 0:
|
|
172
|
+
m = 1
|
|
173
|
+
mins.append(m - 1)
|
|
174
|
+
last_df = -1
|
|
175
|
+
elif df[i0] > tol and df[i0 + 1] < -tol:
|
|
176
|
+
m = (i_mat + 1) % n_old
|
|
177
|
+
if m == 0:
|
|
178
|
+
m = 1
|
|
179
|
+
maxs.append(m - 1)
|
|
180
|
+
last_df = 1
|
|
181
|
+
|
|
182
|
+
if c > 0 and extension_type == "c":
|
|
183
|
+
if last_df > 0:
|
|
184
|
+
maxs.append(posc)
|
|
185
|
+
else:
|
|
186
|
+
mins.append(posc)
|
|
187
|
+
|
|
188
|
+
if not maxs and not mins:
|
|
189
|
+
return np.array([], dtype=int)
|
|
190
|
+
|
|
191
|
+
maxmins_arr = np.sort(np.unique(np.array(maxs + mins, dtype=int)))
|
|
192
|
+
if extension_type == "c" and maxmins_arr.size > 0:
|
|
193
|
+
if maxmins_arr[0] != 0 and maxmins_arr[-1] != n_old - 1:
|
|
194
|
+
maxmins_arr = np.unique(np.concatenate([[0], maxmins_arr, [n_old - 1]]))
|
|
195
|
+
return maxmins_arr.astype(int)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def build_ifft_kernel(mask: np.ndarray, n: int) -> np.ndarray:
|
|
199
|
+
"""Embed a short mask into an FFT multiplier of length ``n`` (periodic IF)."""
|
|
200
|
+
a = np.asarray(mask, dtype=np.float64).ravel()
|
|
201
|
+
nza = n - a.size
|
|
202
|
+
if nza < 0:
|
|
203
|
+
raise ValueError("Signal shorter than mask; tile the signal first.")
|
|
204
|
+
|
|
205
|
+
if nza % 2 == 0:
|
|
206
|
+
a_pad = np.concatenate([np.zeros(nza // 2), a, np.zeros(nza // 2)])
|
|
207
|
+
half = (a_pad.size - 1) // 2
|
|
208
|
+
a_centered = np.concatenate([a_pad[half:], a_pad[:half]])
|
|
209
|
+
else:
|
|
210
|
+
a_pad = np.concatenate(
|
|
211
|
+
[np.zeros((nza - 1) // 2), a, np.zeros((nza - 1) // 2 + 1)]
|
|
212
|
+
)
|
|
213
|
+
mid = a_pad.size // 2
|
|
214
|
+
a_centered = np.concatenate([a_pad[mid - 1 :], a_pad[: mid - 1]])
|
|
215
|
+
|
|
216
|
+
return np.real(np.fft.fft(a_centered))
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def adaptive_average(
|
|
220
|
+
h: np.ndarray, mask_lengths: np.ndarray, mm: np.ndarray
|
|
221
|
+
) -> np.ndarray:
|
|
222
|
+
"""
|
|
223
|
+
Position-dependent moving average used by ALIF (``ave = W * h``).
|
|
224
|
+
|
|
225
|
+
Implemented without forming the dense ``N x N`` matrix.
|
|
226
|
+
"""
|
|
227
|
+
h = np.asarray(h, dtype=np.float64).ravel()
|
|
228
|
+
mask_lengths = np.asarray(mask_lengths, dtype=np.float64).ravel()
|
|
229
|
+
n = h.size
|
|
230
|
+
ave = np.zeros(n, dtype=np.float64)
|
|
231
|
+
|
|
232
|
+
for i in range(n):
|
|
233
|
+
k = float(mask_lengths[i])
|
|
234
|
+
if k <= 0:
|
|
235
|
+
continue
|
|
236
|
+
wn = get_mask_v1(mm, k)
|
|
237
|
+
if wn.size == 0:
|
|
238
|
+
continue
|
|
239
|
+
norm1 = np.abs(wn).sum()
|
|
240
|
+
if norm1 <= 0:
|
|
241
|
+
continue
|
|
242
|
+
wn = wn / norm1
|
|
243
|
+
half = (wn.size - 1) // 2
|
|
244
|
+
idxs = np.arange(i - half, i + half + 1) % n
|
|
245
|
+
if idxs.size != wn.size:
|
|
246
|
+
continue
|
|
247
|
+
ave[i] = float(np.dot(wn, h[idxs]))
|
|
248
|
+
return ave
|