PyWavelets / pywt

PyWavelets - Wavelet Transforms in Python
http://pywavelets.readthedocs.org
MIT License
2.04k stars 470 forks source link

CWT: Interpolate wavelet values (Issue #531) #580

Open amanita-citrina opened 3 years ago

amanita-citrina commented 3 years ago

The current implementation of CWT first takes equi-distant samples (currently 1024) over the range of the wavelet, then integrates the samples using np.cumsum.

Later on, the correct sampling instants are determined for each scale. The sample values are approximated by taking the value of the precomputed integral at the next smaller sampling instant. One can also view this as sampling jitter. It results in clearly visible artefacts (see issues #531 and #570).

This pull request aims to (mostly) eliminate the visible artefacts by interpolating the integral values at the scale-dependent sampling instants. This approximation is obviously more accurate (except perhaps for pathological cases), as can be seen in the attached plots. It is also low-complexity and avoids potentially expensive recomputing of wavelet samples.

The pull request is a result of the discussions about pull request #574. It solves the most urgent (and least controversial) issue addressed in #574, namely the strong visible artefacts at higher scales.

The proposed code passed all tests when running pywt.tests().

pywt_old pywt_new

amanita-citrina commented 3 years ago

The difference between the current cwt implementation and the proposed changes can be illustrated as follows:

cwt_figure

The current implementation replaces the true sample value with the value of the closest precomputed sample to the left. The proposed method instead interpolates between the adjacent precomputed samples.

Of course, the accuracy of both schemes improves as the number of precomputed samples increases. Nevertheless, linear interpolation will always be more accurate for a specific number of precomputed samples. On the other hand, the current scheme has a lower computational cost.

amanita-citrina commented 3 years ago

The CI checks failed for some Matlab compatibility tests. Unfortunately, I have no idea how to fix this.