Open amanita-citrina opened 3 years ago
The difference between the current cwt implementation and the proposed changes can be illustrated as follows:
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.
The CI checks failed for some Matlab compatibility tests. Unfortunately, I have no idea how to fix this.
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()
.