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.
Files changed (162) hide show
  1. {pysdkit-0.4.25 → pysdkit-0.4.27}/PKG-INFO +33 -16
  2. {pysdkit-0.4.25 → pysdkit-0.4.27}/PySDKit.egg-info/PKG-INFO +33 -16
  3. {pysdkit-0.4.25 → pysdkit-0.4.27}/PySDKit.egg-info/SOURCES.txt +10 -2
  4. {pysdkit-0.4.25 → pysdkit-0.4.27}/README.md +2 -2
  5. pysdkit-0.4.27/pyproject.toml +68 -0
  6. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/__init__.py +12 -2
  7. pysdkit-0.4.27/pysdkit/_alif/__init__.py +6 -0
  8. pysdkit-0.4.27/pysdkit/_alif/_helpers.py +248 -0
  9. pysdkit-0.4.27/pysdkit/_alif/alif.py +191 -0
  10. pysdkit-0.4.27/pysdkit/_alif/data/__init__.py +1 -0
  11. pysdkit-0.4.27/pysdkit/_alif/data/prefixed_double_filter.npy +0 -0
  12. pysdkit-0.4.27/pysdkit/_alif/iterative_filtering.py +175 -0
  13. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/emd.py +2 -2
  14. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/hht/hht.py +4 -4
  15. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_faemd/faemd.py +2 -2
  16. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_itd/itd.py +7 -5
  17. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vncmd/__init__.py +2 -0
  18. pysdkit-0.4.27/pysdkit/_vncmd/avncmd.py +491 -0
  19. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/entropy/_permutation_entropy.py +2 -2
  20. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/entropy/_sample_entropy.py +3 -3
  21. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/models/_pca.py +5 -5
  22. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/plot/_fourier_spectra.py +1 -1
  23. pysdkit-0.4.27/pysdkit/tests/__init__.py +12 -0
  24. pysdkit-0.4.27/pysdkit/tests/data/__init__.py +2 -0
  25. pysdkit-0.4.27/pysdkit/tests/models/__init__.py +2 -0
  26. pysdkit-0.4.27/pysdkit/tests/models/test_knn.py +190 -0
  27. pysdkit-0.4.27/pysdkit/tests/models/test_pca.py +80 -0
  28. pysdkit-0.4.27/pysdkit/tests/run_all.py +57 -0
  29. pysdkit-0.4.27/pysdkit/tests/test_alif.py +102 -0
  30. pysdkit-0.4.27/pysdkit/tests/test_avncmd.py +127 -0
  31. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_emd.py +68 -54
  32. pysdkit-0.4.27/pysdkit/tests/test_ewt.py +166 -0
  33. pysdkit-0.4.27/pysdkit/tests/test_faemd.py +206 -0
  34. pysdkit-0.4.27/pysdkit/tests/test_lmd.py +80 -0
  35. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_moving_decomp.py +77 -55
  36. pysdkit-0.4.27/pysdkit/tests/test_rlmd.py +80 -0
  37. pysdkit-0.4.27/pysdkit/tests/test_stl.py +153 -0
  38. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_vmd.py +74 -50
  39. pysdkit-0.4.27/pysdkit/tests/test_vmd2d.py +153 -0
  40. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_correlation.py +4 -4
  41. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_function.py +3 -2
  42. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_hilbert.py +2 -2
  43. pysdkit-0.4.25/pysdkit/_vncmd/avncmd.py +0 -501
  44. pysdkit-0.4.25/pysdkit/tests/__init__.py +0 -6
  45. pysdkit-0.4.25/pysdkit/tests/data/__init__.py +0 -6
  46. pysdkit-0.4.25/pysdkit/tests/models/__init__.py +0 -6
  47. pysdkit-0.4.25/pysdkit/tests/models/test_knn.py +0 -164
  48. pysdkit-0.4.25/pysdkit/tests/models/test_pca.py +0 -71
  49. pysdkit-0.4.25/pysdkit/tests/test_all.py +0 -23
  50. pysdkit-0.4.25/pysdkit/tests/test_ewt.py +0 -138
  51. pysdkit-0.4.25/pysdkit/tests/test_faemd.py +0 -170
  52. pysdkit-0.4.25/pysdkit/tests/test_lmd.py +0 -66
  53. pysdkit-0.4.25/pysdkit/tests/test_rlmd.py +0 -66
  54. pysdkit-0.4.25/pysdkit/tests/test_stl.py +0 -145
  55. pysdkit-0.4.25/pysdkit/tests/test_vmd2d.py +0 -137
  56. pysdkit-0.4.25/setup.py +0 -42
  57. {pysdkit-0.4.25 → pysdkit-0.4.27}/LICENSE +0 -0
  58. {pysdkit-0.4.25 → pysdkit-0.4.27}/PySDKit.egg-info/dependency_links.txt +0 -0
  59. {pysdkit-0.4.25 → pysdkit-0.4.27}/PySDKit.egg-info/requires.txt +0 -0
  60. {pysdkit-0.4.25 → pysdkit-0.4.27}/PySDKit.egg-info/top_level.txt +0 -0
  61. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/__init__.py +0 -0
  62. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/_find_extrema.py +0 -0
  63. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/_prepare_points.py +0 -0
  64. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/_splines.py +0 -0
  65. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/ceemdan.py +0 -0
  66. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/eemd.py +0 -0
  67. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/efd.py +0 -0
  68. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/hht/__init__.py +0 -0
  69. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/hht/frequency.py +0 -0
  70. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/memd.py +0 -0
  71. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/remd.py +0 -0
  72. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd/tvf_emd.py +0 -0
  73. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd2d/__init__.py +0 -0
  74. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd2d/bemd.py +0 -0
  75. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd2d/bmemd.py +0 -0
  76. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_emd2d/emd2d.py +0 -0
  77. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_esmd/__init__.py +0 -0
  78. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_esmd/esmd.py +0 -0
  79. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_ewt/__init__.py +0 -0
  80. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_ewt/ewt.py +0 -0
  81. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_ewt/ewt2d.py +0 -0
  82. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_faemd/__init__.py +0 -0
  83. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_faemd/extrema.py +0 -0
  84. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_faemd/faemd2d.py +0 -0
  85. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_faemd/faemd3d.py +0 -0
  86. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_faemd/filter.py +0 -0
  87. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_fmd/__init__.py +0 -0
  88. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_fmd/fmd.py +0 -0
  89. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_fmd/nfmd.py +0 -0
  90. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_hvd/__init__.py +0 -0
  91. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_hvd/hvd.py +0 -0
  92. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_ifd/__init__.py +0 -0
  93. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_itd/__init__.py +0 -0
  94. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_jmd/__init__.py +0 -0
  95. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_jmd/jmd.py +0 -0
  96. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_jmd/mjmd.py +0 -0
  97. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_lmd/__init__.py +0 -0
  98. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_lmd/lmd.py +0 -0
  99. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_lmd/rlmd.py +0 -0
  100. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_osd/__init__.py +0 -0
  101. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_ssa/__init__.py +0 -0
  102. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_ssa/ssa.py +0 -0
  103. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/__init__.py +0 -0
  104. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/acmd.py +0 -0
  105. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/avmd.py +0 -0
  106. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/ba_acmd.py +0 -0
  107. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/base.py +0 -0
  108. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/mvmd.py +0 -0
  109. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/svmd.py +0 -0
  110. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/vmd_c.py +0 -0
  111. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/vmd_f.py +0 -0
  112. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd/vme.py +0 -0
  113. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd2d/__init__.py +0 -0
  114. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd2d/cvmd2d.py +0 -0
  115. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vmd2d/vmd2d.py +0 -0
  116. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vncmd/incmd.py +0 -0
  117. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vncmd/mncmd.py +0 -0
  118. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/_vncmd/vncmd.py +0 -0
  119. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/__init__.py +0 -0
  120. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_add_noise.py +0 -0
  121. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_cube.py +0 -0
  122. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_generator.py +0 -0
  123. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_image.py +0 -0
  124. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_models.py +0 -0
  125. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_test_univariate.py +0 -0
  126. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/_time_series.py +0 -0
  127. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/data/texture.txt +0 -0
  128. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/entropy/__init__.py +0 -0
  129. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/entropy/_approxiamte_entropy.py +0 -0
  130. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/models/__init__.py +0 -0
  131. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/models/_base.py +0 -0
  132. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/models/_kmeans.py +0 -0
  133. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/models/_knn.py +0 -0
  134. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/plot/__init__.py +0 -0
  135. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/plot/_functions.py +0 -0
  136. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/plot/_plot_images.py +0 -0
  137. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/plot/_plot_imfs.py +0 -0
  138. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/plot/_plot_signal.py +0 -0
  139. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/data/test_generator_cube.py +0 -0
  140. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/data/test_generator_image.py +0 -0
  141. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/data/test_generator_signal.py +0 -0
  142. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/data/test_generator_univariate_signal.py +0 -0
  143. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_ceemdan.py +0 -0
  144. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_faemd2d.py +0 -0
  145. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_faemd3d.py +0 -0
  146. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tests/test_itd.py +0 -0
  147. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tsa/__init__.py +0 -0
  148. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tsa/_dtw.py +0 -0
  149. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tsa/_moving_decomp.py +0 -0
  150. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tsa/_mstl.py +0 -0
  151. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/tsa/_stl.py +0 -0
  152. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/__init__.py +0 -0
  153. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_cite.py +0 -0
  154. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_diagnalization.py +0 -0
  155. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_differ.py +0 -0
  156. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_fft.py +0 -0
  157. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_instantaneous.py +0 -0
  158. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_kernel_matrix.py +0 -0
  159. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_mirror.py +0 -0
  160. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_process.py +0 -0
  161. {pysdkit-0.4.25 → pysdkit-0.4.27}/pysdkit/utils/_smooth1d.py +0 -0
  162. {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.25
3
+ Version: 0.4.27
4
4
  Summary: A Python library for signal decomposition algorithms with a unified interface.
5
- Home-page: https://github.com/wwhenxuan/PySDKit
6
- Author: whenxuan, changewam, josefinez, Yuan Feng, Wentong Zhao, JacktheFowler, Deeksha Manjunath
7
- Author-email: wwhenxuan@gmail.com
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.25
3
+ Version: 0.4.27
4
4
  Summary: A Python library for signal decomposition algorithms with a unified interface.
5
- Home-page: https://github.com/wwhenxuan/PySDKit
6
- Author: whenxuan, changewam, josefinez, Yuan Feng, Wentong Zhao, JacktheFowler, Deeksha Manjunath
7
- Author-email: wwhenxuan@gmail.com
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
- setup.py
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/test_all.py
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.25"
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,6 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Adaptive Local Iterative Filtering (ALIF) package."""
3
+ from .alif import ALIF
4
+ from .iterative_filtering import IterativeFiltering
5
+
6
+ __all__ = ["ALIF", "IterativeFiltering"]
@@ -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