From d7b016c3b72df5c1f8b29758007ed9e72d2e8f43 Mon Sep 17 00:00:00 2001
From: OverLordGoldDragon
<16495490+OverLordGoldDragon@users.noreply.github.com>
Date: Fri, 6 Nov 2020 00:49:09 +0400
Subject: [PATCH] 0.5.0 Pre-release
See [Releases](https://github.com/OverLordGoldDragon/ssqueezepy/releases).
---
README.md | 79 +----
examples.py | 111 -------
examples/README.md | 5 +
examples/imgs/ridge_chirp.png | Bin 0 -> 1022133 bytes
examples/ridge_chirp.py | 50 ++++
ssqueezepy/__init__.py | 21 +-
ssqueezepy/_cwt.py | 197 +++++++++++++
ssqueezepy/_ssq_cwt.py | 204 +++++++++++++
ssqueezepy/algos.py | 36 +++
ssqueezepy/experimental.py | 35 +++
ssqueezepy/ssqueezing.py | 238 +++++++++++++++
ssqueezepy/stft_transforms.py | 6 +-
ssqueezepy/synsq_cwt.py | 187 ------------
ssqueezepy/synsq_stft.py | 58 ++--
ssqueezepy/toolkit.py | 37 +++
ssqueezepy/utils.py | 343 +++++++++++++++------
ssqueezepy/viz_toolkit.py | 80 +++++
ssqueezepy/wavelet_transforms.py | 492 +++++++++++--------------------
tests/__init__.py | 0
tests/reconstruction_test.py | 70 +++++
20 files changed, 1418 insertions(+), 831 deletions(-)
delete mode 100644 examples.py
create mode 100644 examples/README.md
create mode 100644 examples/imgs/ridge_chirp.png
create mode 100644 examples/ridge_chirp.py
create mode 100644 ssqueezepy/_cwt.py
create mode 100644 ssqueezepy/_ssq_cwt.py
create mode 100644 ssqueezepy/algos.py
create mode 100644 ssqueezepy/experimental.py
create mode 100644 ssqueezepy/ssqueezing.py
delete mode 100644 ssqueezepy/synsq_cwt.py
create mode 100644 ssqueezepy/toolkit.py
create mode 100644 ssqueezepy/viz_toolkit.py
create mode 100644 tests/__init__.py
create mode 100644 tests/reconstruction_test.py
diff --git a/README.md b/README.md
index e903aa1b..f7ed9913 100644
--- a/README.md
+++ b/README.md
@@ -1,62 +1,17 @@
# Synchrosqueezing in Python
-Synchrosqueezing Toolbox ported to Python, authored by Eugene Brevdo, Gaurav Thakur. Original: https://github.com/ebrevdo/synchrosqueezing
+[Synchrosqueezing Toolbox](https://github.com/ebrevdo/synchrosqueezing) ported to Python.
-**Reviewers needed**; the repository is in a development stage - details below.
+`ssqueezepy`'s come out of retirement; see [Releases](https://github.com/OverLordGoldDragon/ssqueezepy/releases). I've validated all main methods; the repo's now production-ready. The rest is a matter of extending.
+
+Significant changes to some code structure are expected until v0.6.0, but whatever's not explicitly marked as problematic will work as intended. README will also change soon.
## Features
- Forward & inverse CWT- and STFT-based Synchrosqueezing
- Forward & inverse discretized Continuous Wavelet Transform (CWT)
- Forward & inverse discretized Short-Time Fourier Transform (STFT)
- Phase CWT & STFT
+ - More
-## Reviewers needed
-An eventual goal is a merged Pull Request to PyWavelets ([relevant Issue](https://github.com/PyWavelets/pywt/issues/258)). Points of review include:
- 1. **Correctness**; plots generated from CWT transforms resemble those in the publications, but not entirely
- 2. **Completeness**; parts of code in the original Github are missing or incorrect, and I'm unable to replace them all
- 3. **Unit tests**; I'm not familiar with Synchrosqueezing itself, so I don't know how to validate its various functionalities
- 4. **Licensing**; unsure how to proceed here; [original's](https://github.com/ebrevdo/synchrosqueezing/blob/master/LICENSE) says to "Redistributions in binary form must reproduce the above copyright notice" - but I'm not "redistributing" it, I'm distributing my rewriting of it
- 5. **Code style**; I'm aware PyWavelets conforms with PEP8 (but I don't), so I'll edit PR code accordingly
-
-## Review To-do:
-
-**Correctness**:
- - [ ] 1. Example 1
- - [ ] 2. Example 2
-
-**Completeness**:
- - [ ] 1. `freqband` in `synsq_cwt_inv` and `synsq_stft_inf` is defaulted to an integer, but indexed into as a 2D array; the two have nearly identical docstrings, and reference the same equation, but the equation appears completely irrelevant to both.
- - [ ] 2. `quadgk` has been ported as quadpy's [`quad`](https://github.com/nschloe/quadpy/blob/master/quadpy/line_segment/_tools.py#L16) (linked its wrapped function), which does not support infinite integration bounds, and has [trouble](https://github.com/nschloe/quadpy/issues/236) with computing `synsq_stft_inv`'s integral. Needs a workaround.
- - [ ] 3. As seen in examples, the y-axis shows "scales", not frequencies - and the relation between the two is neither clear nor linear; it also isn't linear w.r.t. `len(t)`, `nv`, or `fs`. Publications show frequencies instead.
-
-**Unit tests**: Whatever suffices for PyWavelets will suffice for me
-
-## Implementation To-do:
- One checkmark = code written; two = reviewed
-
-| Status | Toolbox name | Repository name | Repository file |
-| --- | --- | --- | --- |
-| [ ] [**x**] | [`synsq_cwt_fw`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/synsq_cwt_fw.m) | `synsq_cwt_fwd` | [synsq_cwt.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/synsq_cwt.py) |
-| [ ] [**x**] | [`synsq_cwt_iw`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/synsq_cwt_iw.m) | `synsq_cwt_inv` | [synsq_cwt.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/synsq_cwt.py) |
-| [ ] [**x**] | [`synsq_stft_fw`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/synsq_stft_fw.m) | `synsq_stft_fwd` | [synsq_stft.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/synsq_stft.py) |
-| [ ] [**x**] | [`synsq_stft_iw`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/synsq_stft_iw.m) | `synsq_stft_inv` | [synsq_stft.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/synsq_stft.py) |
-| [ ] [**x**] | [`synsq_squeeze`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/synsq_squeeze.m) | `synsq_squeeze` | [wavelet_transforms.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/wavelet_transforms.py) |
-| [ ] [**x**] | [`synsq_cwt_squeeze`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/synsq_cwt_squeeze.m) | `synsq_cwt_squeeze` | [wavelet_transforms.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/wavelet_transforms.py) |
-| [ ] [**x**] | [`phase_cwt`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/phase_cwt.m) | `phase_cwt` | [wavelet_transforms.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/wavelet_transforms.py) |
-| [ ] [**x**] | [`phase_cwt_num`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/phase_cwt_num.m) | `phase_cwt_num` | [wavelet_transforms.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/wavelet_transforms.py) |
-| [ ] [**x**] | [`cwt_fw`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/cwt_fw.m) | `cwt_fwd` | [wavelet_transforms.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/wavelet_transforms.py) |
-| [ ] [ ] | [`cwt_iw`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/cwt_iw.m) |
-| [ ] [**x**] | [`stft_fw`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/stft_fw.m) | `stft_fwd` | [stft_transforms.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/stft_transforms.py) |
-| [ ] [**x**] | [`stft_iw`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/stft_iw.m) | `stft_inv` | [stft_transforms.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/stft_transforms.py) |
-| [ ] [**x**] | [`phase_stft`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/phase_stft.m) | `phase_stft` | [stft_transforms.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/stft_transforms.py) |
-| [ ] [**x**] | [`padsignal`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/padsignal.m) | `padsignal` | [utils.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/utils.py) |
-| [ ] [**x**] | [`wfiltfn`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/wfiltfn.m) | `wfiltfn` | [utils.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/utils.py) |
-| [ ] [ ] | [`wfilth`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/wfilth.m) |
-| [ ] [**x**] | [`synsq_adm`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/synsq_adm.m) | `synsq_adm` | [utils.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/utils.py) |
-| [ ] [**x**] | [`buffer`](https://www.mathworks.com/help/signal/ref/buffer.html) | `buffer` | [utils.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/utils.py) |
-| [**x**] [**x**] | [`est_riskshrink_thresh`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/est_riskshrink_thresh.m) | `est_riskshrink_thresh` | [utils.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/utils.py) |
-| [**x**] [**x**] | [`p2up`](https://github.com/ebrevdo/synchrosqueezing/blob/master/synchrosqueezing/p2up.m) | `p2up` | [utils.py](https://github.com/OverLordGoldDragon/synchrosqueezing_python/blob/master/synchrosqueezing/utils.py) |
-
-There are more unlisted (see original repo), but not all will be implemented, in particular GUI implementations.
## Differences w.r.t. original
@@ -68,33 +23,11 @@ There are more unlisted (see original repo), but not all will be implemented, in
- **Edited docstrings**; filled missing info, & few corrections
- **Moved functions**; each no longer has its own file, but is grouped with other relevant functions
- **Code style**; grouped parts of code as sub-functions for improved readability; indentation for vertical alignment; other
- - **Performance**; this repo may work faster or slower, as Numpy arrays are faster than C arrays, but some of original funcs use MEX-optimized code with no Numpy equivalent. Also using dense instead of sparse matrices (see below).
- - **Performance**; this repo _will_ work **10x+ faster** for some of the methods which were vectorized out of for-loops
+ - **Performance**; this repo will work faster and for less memory for some methods (to be documented)
**Other**:
- Dense instead of sparse matrices for `stft_fwd` in [stft_transforms.py](https://github.com/OverLordGoldDragon/ssqueezepy/blob/master/synchrosqueezing/stft_transforms.py), as Numpy doesn't handle latter in ops involved
-## Examples
-
-See [examples.py](https://github.com/OverLordGoldDragon/ssqueezepy/blob/master/examples.py). Links to: [paper [1]](https://sci-hub.se/https://doi.org/10.1016/j.sigpro.2012.11.029), [paper[2]](https://arxiv.org/pdf/0912.2437.pdf). `_inv` methods (reconstruction, inversion) have been omitted as they involve `freqband`.
-
-**EX 1:** Paper [1], pg. 1086
-
-Only real components shown; imaginary are nearly identical, sometimes sign-opposite.
-
-
-
-
-
-
-synsq-CWT (`synsq_cwt_fwd`) appears to produce strongest agreement with paper (FIG 4), while none of STFT yield any resemblance of anything in the papers. It's also unclear whether `synsq_squeeze` was used for "synsq" in FIG 4 instead.
-
-**EX 2:** Paper [2], pg. 18
-
-
-
-
-Similar situation as EX 1; again CWT has close resemblance, and STFT is in a separate reality. The two apparent discrepancies w/ CWT are: (1) slope of the forking incline, steeper in FIG. 3; (2) position of horizontal line, lower in FIG. 3. As for the black lines in FIG 3, they seem to be the (manual) "markings" mentioned under the figure in the paper.
diff --git a/examples.py b/examples.py
deleted file mode 100644
index bc2c4a3f..00000000
--- a/examples.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# -*- coding: utf-8 -*-
-# Papers:
-# [1] https://sci-hub.se/https://doi.org/10.1016/j.sigpro.2012.11.029
-# [2] https://arxiv.org/pdf/0912.2437.pdf
-import numpy as np
-import matplotlib.pyplot as plt
-
-from ssqueezepy import synsq_cwt_fwd, synsq_stft_fwd
-from ssqueezepy import cwt_fwd, stft_fwd
-
-#%%
-def viz_y(y, y1, y2):
- _, axes = plt.subplots(1, 2, sharey=True, figsize=(11, 3))
- axes[0].plot(y1)
- axes[1].plot(y2)
- plt.subplots_adjust(left=0, right=1, bottom=0, top=1, wspace=0, hspace=0)
- plt.show()
-
- plt.plot(y)
- plt.gcf().set_size_inches(14, 4)
- plt.show()
-
-def viz_s(s, sN, s1, s2, s3):
- _, axes = plt.subplots(1, 3, sharey=True, figsize=(10, 3))
- axes[0].plot(t, s1)
- axes[1].plot(t, s2)
- axes[2].plot(t, s3)
- plt.subplots_adjust(left=0, right=1, bottom=0, top=1, wspace=0, hspace=0)
- plt.show()
-
- _, axes = plt.subplots(2, 1, sharex=True, figsize=(10, 5))
- plt.subplots_adjust(left=0, right=1, bottom=0, top=1, wspace=0, hspace=0)
- axes[0].plot(t, s)
- axes[1].plot(t, sN)
- plt.show()
-
-def _get_norm(data, norm_rel, norm_abs):
- if norm_abs is not None and norm_rel != 1:
- raise ValueError("specify only one of `norm_rel`, `norm_abs`")
-
- if norm_abs is None:
- vmax = np.max(np.abs(data)) * norm_rel
- vmin = -vmax
- else:
- vmin, vmax = norm_abs
- return vmin, vmax
-
-def _make_plots(*data, cmap='bwr', norm=None, titles=None):
- vmin, vmax = norm or None, None
-
- _, axes = plt.subplots(1, len(data), sharey=True, figsize=(11, 4))
- plt.subplots_adjust(left=0, right=1, bottom=0, top=1, wspace=.1, hspace=0)
-
- for i, x in enumerate(data):
- axes[i].imshow(x, cmap=cmap, aspect='auto', vmin=vmin, vmax=vmax)
- axes[i].invert_yaxis()
- axes[i].set_title(titles[i], fontsize=14, weight='bold')
- plt.show()
-
-def viz_gen(x, cmap='bwr', norm_rel=1, norm_abs=None):
- vmin, vmax = _get_norm(np.real(x), norm_rel, norm_abs)
- _make_plots(np.real(x), np.imag(x), cmap=cmap,
- norm=(vmin, vmax), titles=("Real", "Imag"))
-
-def viz_gen2(x1, x2, cmap='bwr', norm_rel=1, norm_abs=None):
- vmin, vmax = _get_norm(np.real(x1), norm_rel, norm_abs)
- _make_plots(np.real(x1), np.real(x2), cmap=cmap,
- norm=(vmin, vmax), titles=("s", "sN"))
-
-OPTS = {'type': 'bump', 'mu':1}
-#%%
-"""Paper [2], pg. 18"""
-t = np.linspace(0, 12, 1000)
-y1 = np.cos(8*t)
-y2 = np.cos(t**2 + t + np.cos(t))
-y = y1 + y2
-viz_y(y, y1, y2)
-#%%
-Tx_yc, *_ = synsq_cwt_fwd(y, fs=len(t)/t[-1], nv=32, opts=OPTS)
-Tx_ys, *_ = synsq_stft_fwd(t, y, opts=OPTS)
-#%%
-viz_gen(Tx_yc, cmap='bwr', norm_abs=(-5e-5, 5e-5))
-viz_gen(Tx_ys, cmap='bwr', norm_abs=(-5e-5, 5e-5))
-#%%
-"""Paper [1], pg. 1086"""
-t = np.linspace(0, 10, 2048)
-s1 = (1 + .2*np.cos(t)) * np.cos(2*np.pi*(2*t + .3*np.cos(t)))
-s2 = (1 + .3*np.cos(t)) * np.cos(2*np.pi*(2.4*t + .3*np.sin(t) + .5*t**1.2)
- ) * np.exp(-t/15)
-s3 = np.cos(2*np.pi*(5.3*t + 0.2*t**1.3))
-N = np.random.randn(len(t)) * np.sqrt(2.4)
-s = s1 + s2 + s3
-sN = s + N
-viz_s(s, sN, s1, s2, s3)
-#%%
-# feed "denoised" (actually noiseless) signal as noted on pg. 1086 of [1]
-Tx_sc, *_ = synsq_cwt_fwd(s, fs=len(t)/t[-1], nv=32, opts=OPTS)
-Tx_sNc, *_ = synsq_cwt_fwd(sN, fs=len(t)/t[-1], nv=32, opts=OPTS)
-Tx_ss, *_ = synsq_stft_fwd(t, s, opts=OPTS)
-Tx_sNs, *_ = synsq_stft_fwd(t, sN, opts=OPTS)
-#%%
-viz_gen2(Tx_sc, Tx_sNc, cmap='bwr', norm_abs=(-5e-5, 5e-5))
-viz_gen2(Tx_ss, Tx_sNs, cmap='bwr', norm_abs=(-5e-5, 5e-5))
-#%%
-Wx_s, *_ = cwt_fwd(s, 'bump', opts=OPTS)
-Wx_sN, *_ = cwt_fwd(sN, 'bump', opts=OPTS)
-Sx_s, *_ = stft_fwd(s, dt=t[1]-t[0], opts=OPTS)
-Sx_sN, *_ = stft_fwd(sN, dt=t[1]-t[0], opts=OPTS)
-#%%
-viz_gen2(Wx_s, Wx_sN, cmap='bwr', norm_abs=(-1.3, 1.3))
-viz_gen2(Sx_s, Sx_sN, cmap='bwr', norm_abs=(-1.3, 1.3))
diff --git a/examples/README.md b/examples/README.md
new file mode 100644
index 00000000..0a1c173b
--- /dev/null
+++ b/examples/README.md
@@ -0,0 +1,5 @@
+# Examples
+
+## Exponential chirp
+
+
\ No newline at end of file
diff --git a/examples/imgs/ridge_chirp.png b/examples/imgs/ridge_chirp.png
new file mode 100644
index 0000000000000000000000000000000000000000..3fd3750fdfd644500b482b9b55f7815c7e28b004
GIT binary patch
literal 1022133
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