PyWavelets CWT: resampling vs menghitung ulang wavelet

Oct 01 2020

Terkait . The pelaksanaan pra-terintegrasi wavelet sekali, dan resamples itu pada setiap scale, akhirnya differencing untuk melaksanakan bawah:

$$ C_{a, b} = \frac{1}{\sqrt{a}} \sum_k s(k)\left( \int_{-\infty}^{k+1} \overline{\psi \left(\frac{t-b}{a} \right) }dt - \int_{-\infty}^{k} \overline{\psi \left(\frac{t-b}{a} \right) }dt \right) $$

Tapi itu juga terjadi * sqrt(scale), sedangkan di atas kita jelas membagi ; apa masalahnya? Dan bagaimana jika dibandingkan dengan menghitung ulang wavelet pada setiap skala?

Jawaban

OverLordGoldDragon Oct 01 2020 at 14:19

Normalisasi memang oleh 1 / sqrt(scale), dan ini adalah norma-L2; triknya ada di wavelet skala.

Saya akan gunakan di wavelet='morl'seluruh. Sebelum mengintegrasikan, kita dapat memeriksa wavelet di sini ; itu dikembalikan oleh wavelet.wavefun, yang dikompilasi biner, tetapi setelah beberapa tebakan, saya menemukan itu cocok persis dengan

scipy.signal.morlet2(1024, 1024 / 16) * sqrt(1024 / 16) * np.pi**(.25)

yang, dari sumber , menggunakan notasi Wiki ,$\psi(t) = \psi_{\sigma}(t/a)$, dimana $a$ adalah skala, dan

$$ \psi_{\sigma}(t) = e^{j\sigma t} e^{-t^2/2} \tag{1} \label{1} $$

(skala dan $\pi^{-1/4}$membatalkan). Inilah yang diintegrasikan melalui cumsum(psi) * step, dan kemudian disampling ulang untuk semua scales.


Sampel ulang vs. dihitung ulang

Apa sebenarnya yang dilakukan resampling ini dalam hal Persamaan 1 ? Apakah hanya resolusi wavelet yang lebih tinggi pada skala yang sama , atau apakah itu setara dengan menghitung ulang Persamaan 1 di setiap skala? Cukup nyaman, terakhir, tetapi hanya perkiraan, dan perkiraan menurun secara substansial untuk yang kecil scale(- code1 ):

Pemberitahuan dari code1, bagaimanapun, wavelet yang dihitung ulang:

Ns = len(int_psi_scale)
w = real(morlet2(Ns, Ns / 16) * sqrt(Ns / 16) * np.pi**(.25))  # repeats first blob
w /= scale

Komputasi ulang mencakup 1 / scale, yang, bersama dengan * sqrt(scale), sama dengan 1 / sqrt(scale). Misteri terpecahkan.


Kode Anda salah, di mana * step?

Digantikan oleh 1 / scale. Bagaimana?

Dalam kode MAE, perhatikan bahwa for scale=64, we have int_psi_scale == int_psi, which == cumsum(psi) * step. Untuk w_int, kami lakukan cumsum(w) / scale. Dan 1 / scaleadalah ... == step. Jadi, wavelet pra-integrasi,, psihanya wdi scale=64(dalam morlet2kode di atas 1024 / 16 == 64,, check out), dan stepkebetulan ... nyaman? == 1 / scalesaat mengintegrasikan.

Lalu kenapa 1 / scaleada? Tidak jelas. Ada dua kemungkinan dalam pikiran: (1) mempertahankan norma wavelet pada integrasi; (2) penskalaan wavelet , tidak bergantung pada integrasi.

  1. Jika wavelet dinormalisasi L1 atau L2 sebelum integrasi, keduanya akan dipertahankan. Ini dari aturan rantai; ganti saja$f$ dengan $\psi$, dan $k$ dengan $1/a$:

$$ \int f(k x) dx = \frac{1}{|k|} \int f(x) dx $$

  1. Ini tampaknya lebih mungkin, karena diffnanti hampir sama dengan membatalkan integrasi, mengalahkan tujuan (1). Mengapa mengubah skala wavelet? Normalisasi - lihat di sini .

Anda curang sebelumnya; tidak adaw /= scale

Benar, kode sebenarnya menunjukkan w_int = cumsum(w) / scale, tetapi keduanya persis sama. Dengan demikian, pertanyaan sebelumnya tentang di mana 1 / scale"milik", atau "berasal dari". Ini dijawab di sini , dan di bagian lain di bawah.


Mengapa step == 1 / scaledi integrasi? (- untuk referensi, dari sini (dalam kode1,$n$adalah x)):

Hanya kebetulan, atau step, bersama$n_i$, dibuat dengan hati-hati untuk menghasilkan properti resampling yang nyaman, yang pada gilirannya diminati step = 1 / scale? Tidak tahu, mungkin akan memperbarui jawaban nanti.