# -*- coding: utf-8 -*-
"""
@author: loicl et HG LIS CNRS 2021
nb: : le code .py usuel est restreint en discret wavelet transform (DWT).Or Daubechies est que Daubechies a été définie par Isabelle Daubechies pour former une base orthogonale et donc permettre une décomposition discrète (DWT) qui est de bien moindre complexité en temps et en mémoire et permet tout de meme les compressions super efficace sur tout signaux ou presque (cf exemple Jpeg etc). 
Mais le tord des DWT est d'être en revanche très peu interprétable, et notamment pour la reconnaissance de forme dans les scalogrammes de DCT, on s'y perd avec plein d'artefact. C'est pour cela que vers une Continuous wav trans. même pour Daubechies qui était conçue pour DWT car orthogonale. De pus Daubechies est une mère asymétrique, la seule d'ailleurs, et qui donc a capacité de matcher avec un système d'amortissement (dans le bon sens temporel une fois inversée) comme les tissus  vivants.. 
"""

#%% Importations
import pywt
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
from scipy.fftpack import next_fast_len


#%% Parameters
# Choosing a random audio
signal, sr = librosa.load("D:\\Acoustique\\2020\\16072020\\SCW1807_20200716_082600.wav", sr=None)

#duration = int(sr*2.5)  # 2.5 seconds
num_scales = 64         # 64 coefs in scaleogram
order = 5               # order of DB wavelet

#%% Using pywt

# To be able to use discret wavelets, replace in pywt/_cwt.py:
# line 123 : dt_out = dt_cplx if hasattr(wavelet, 'complex_cwt') and wavelet.complex_cwt else dt
# line 127 :     int_psi = np.conj(int_psi[::way]) if hasattr(wavelet, 'complex_cwt') and wavelet.complex_cwt else int_psi[::way]
    # => Now the function can use discrete wavelets

# line 37 : def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1, way=1):
    # => Now if way = -1 the function will use a reversed wavelet (on time axis)

# save and import pywt.
# Rdy for use.
    
scales = np.arange(1,num_scales+1)

wavelet_type = 'db'+str(order)
coefs, freqs = pywt.cwt(signal, scales, wavelet_type, sampling_period=1/sr, way=-1)

fig, axs = plt.subplots(nrows=2, sharex=True)
axs[0].imshow(np.abs(coefs), aspect='auto') 
axs[1].plot(signal)

