PyWavelets CWT: normalleştirme? Vs Scipy?

Oct 01 2020

Alakalı . Uygulanmakta olan denklem şu şekilde normalleşir sqrt(1 / scale):

$$ 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) $$

öyleyse neden vermez pywt._cwtyapmak * sqrt (ölçek) ? Ayrıca, nasıl normalleşiyor (L1, L2, vb.)?


Düzenleme : scipy en inceledikten sonra cwt , ben böylece (birkaç bariz detaylar hariç) iki karşılaştırarak aynı şey, ben cevap "ideali" olarak tanımlanan tam olarak ne uygulanması ediyor fark etti. Pywt algoritmasının hangi senaryolarda daha iyi olduğunu bilmiyorum, ancak genel olarak - Scipy için kolay kazanç . Pywt'nin temel kusurunu gidermek için bir PR açtım .

Edit2 : en az beklenen bir yerde pywt en fazla scipy 's bir görünür kenarı Bulunan düşük ölçekler . Ele burada .

Düzenleme 3 : Düşük precisiongirişi sabitledikten sonra pywt, aslında çeşitli sentetik sinyallerin hepsinden pywtdaha üstün buldum scipy, ama squeezepyher zaman ikisini de geçiyorum. Testler burada , daha fazlası geliyor.

Yanıtlar

3 OverLordGoldDragon Oct 01 2020 at 21:20

İnkübasyondan doğuma kadar matematiği takip edelim. Bir ölçekte psiyeniden ölçeklendirilmiş morlet2( daha önce gösterildiği gibi ) ile başlar$a=64$, ve $\sigma=5$:

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

alır entegre ve L1-normalize : - (aşağıda caveat2 bakınız)

$$ \psi = \psi_{\text{int}}(t) = \frac{1}{a} \int \psi_{\sigma}(t/a)\ dt \tag{3} $$

Norm, skaler bir faktör tarafından yanlıştır, ancak önemli olan, farklı için aynıdır .$a$; öyle olduğunu doğrulayabilirsiniz (büyük için$a$, entegrasyon sınırlarını artırın). Bunun L1 normalleştirilmiş dalgacık olduğunu, entegre dalgacık olmadığını unutmayın.$\psi_\text{int}(t)$; göreceğimiz gibi ayrım esastır.

$\psi$ daha sonra sinyal ile birleşir $s$ve sonlu farklı ve olumsuz; dan burada , şudur:

$$ -\text{DIFF}(\text{conv}) = [s \cdot (\psi_{\text{int}}(t - 0) - \psi_{\text{int}}(t - 1)),\ ...] \tag{4} $$

Yakından incelersek, bu, belirli sayısal farklılıklarla (daha sonra ele alınacak) önceki entegrasyonu geri almaya eşdeğerdir, bu nedenle

$$ \psi = \frac{1}{a} \psi_{\sigma}(t/a) \tag{5} $$

Son olarak * sqrt(scale):

$$ \boxed{\psi = \frac{1}{\sqrt{a}} \psi_{\sigma}(t/a)} \tag{6} $$

bu, sonuçta L2-normalize edilmiştir . Bunu bir test sinyali ile doğrulayabiliriz; L2, yüksek frekansları bastırarak, genlik / güç temsilinde daha düşük frekanslara doğru eğilimlidir . Yukarıdakiler doğruysa, yalnızca bunu görmekle kalmaz, aynı zamanda * sqrt(scale)koddan kaldırarak bir düzeltme de uygulayabiliriz :

Uygulamaya özel uyarılar aşağıda tartışılacaktır.


Normalleştirme ölçekler arasında ne kadar güvenilir? - Harika değil (- kod2 ):

Sağ tarafta sınırlı sayıda örnek kullanan en iyi durumu, sol tarafta yeniden örnekleme uygulamasını görüyoruz. Açıkçası, az sayıda örneğin doğal olarak zayıf çözünürlüğü nedeniyle, normlarımız düşük ölçekler için iyi sonuç vermez - ancak yeniden hesaplanan varyant, en azından ortalama bir normu yaklaşık olarak sabit tutar .

Daha da ilginci, yeniden örneklenmiş olan aniden ikinci dereceden görünür. $\log_2(a)=6$; Anlaşma ne? Hatırlayın "Başlıyor ... büyük ölçekte$a=64$"; bu, orijinal ( int_psi) ' den daha fazla örnekle yeniden örneklediğimiz zamandır :

kimin diffolduğunu

  • 1LR olarak görmek int_pside scale=256aynı değerlere yeniden örnekleme olduğu int_pside sıfır olarak birden çok kez, bildirimleri diff(2LR).
  • Daha sonra L2 normu hakkında bir fikir edinmek için değerlerin karesini alıyoruz ve 3LR'deki L2 normalleştirilmiş değerlerle karşılaştırıyoruz; sudan biçimlendirilmemiş değerleri üfleyen normlu değerler buluyoruz. Bu aşırı mı yoksa uygun mu?
  • Aynı ölçekte yeniden hesaplananla karşılaştırın; 4LR'de en azından yeniden hesaplananların şeklini görüyoruz - artık ihmal edilebilir değil. Bu, yeniden örneklemenin dalgacık genliğini olduğundan fazla tahmin ettiğini ve norm hesaplamasında bu, sıfır olmasından dolayı değerlerin yarısı kadar önemli ölçüde dengelendiğinden diff, aşırı tahmin büyük olmalıdır.

Ne kadar büyük? En yüksek dalgacık genliklerini, yeniden örneklenmiş diff(int_psi_256)ve yeniden hesaplanmış w( morlet2/scale) değiştirilmemiş ölçeklerde karşılaştırabiliriz ; norming değişiklikleri hem aynı faktörle ( *sqrt(scale)) değiştirir, bir fark yaratmaz .

Kesinlikle yeterli, yine $a=64$kritik davranış görüyoruz; yeniden örneklenen doygunlukların en yüksek genliği minimumda iken, yeniden hesaplananlar azalmaya devam eder. Farkı$a=256$sıfırları dengelemek için yeterince büyük (~ 12db = 4x, kare ise -> 16x) diff, dolayısıyla L2 normunun neden büyüdüğü.

Ancak L1 normunun daha yüksek ölçeklerde iyi davrandığına dikkat edin . Nedenini bulmak için sıfırların oranını aşırı tahmin faktörüyle kesin olarak karşılaştırmalıyız. İkincisinin 4x olduğunu zaten biliyoruz; birincisi, düz olmayan bir bölge aldım (aksi takdirde yine de sıfırdır) ve sıfırların örnek sayısına oranını buldum: 0.75 . Bu, 4 değerden 1'inin sıfır olmadığı ve her birinin 4 kat daha büyük olduğu anlamına gelir ... L1 normunu korumak için gereken tam oran.

Bu sıfır oranı yukarıdaki grafiklerden çok net değil - bunun yerine noktalar:


Eğer diffgeri alır cumsum, neden hiç birini yapın?

İyi soru. Aslında, her ikisini de ortadan kaldırarak kalite bozulması (fermuar) etkisinin ortadan kalktığını buldum:

Ancak başka bir şey de kaybolur - yüksek frekans ölçekleri (solda) ve işaret dönüyor (bunu eksi de kaldırarak çözdüm coef = -). Ben kısmen değiştirerek bu ofset * sqrt(scale)tarafından 1 / sqrt(scale)(sağda), ama bu L2 davayı normlu bizi alır ( 1 / scaleşimdiye kadar bulunan her şeyin ışık bir asılsız modifikasyon overkill) ve olduğunu. Yani yapılabilir mi? Elbette, int-diffdans olmadan da uygulanabilir , ancak burada keşfetmeyeceğim.


Uyarı: etkili norm

Geri çağırma, convkırpılır len(x), bu nedenle tüm dalgacık hesaplamaya katılmayabilir, oysa yukarıdaki hesaplamalar aksini varsayar. Varsayım, xne kadar uzun olursa o kadar doğrudur - ama len(x) == 512aynı dalgacıkla precision=10(2 ^ 10 = 1024 int_psi), yeniden hesaplanan dalgacıkla karşılaştırıldığında şöyle olur:

Dağınıklık! Her ikisi de önemli ölçüde bozuluyor, bu da muhtemelen kısa sinyallere sabitlenmiş yeterince büyük ölçeklere özgü olduğunu gösteriyor. Basit bir geçici çözüm, sinyali sıfır doldurmaktır, ancak uyarıları anlamadan buna kefil olmazdım (dalgacıklar için değil, DFT için yapıyorum ).

Ayrıca, normun yalnızca ölçek başına değil, aynı zamanda vardiya başına ($b$); dalgacık, merkezi sinyalin merkezinde olduğu zamanın aksine, sinyalin içine girerken daha azdır.

Ama ölçeğe göre tutarsak, önceki örnekte hile yaptığımı itiraf ediyorum. $f=4$; başlangıçta seçtim$f=1$, ancak L1 normu arsa güzel görünmüyordu ve nedenini anlamadım. Şu andan beri, burada ölçek başına hem L1 hem de L2$f=1,64$:

Önceki arsa ile karşılaştırın; Her iki normun sol modlarının (düşük ölçekler) nasıl etkilenmediğini, sadece yüksek ölçekli (düşük frekanslı) olanların artık beklendiği gibi çok daha büyük (L2) ve daha düşük (L1) olduğuna dikkat edin.


Uyarı 2: * stepL1 normalleştirmesini yapmaz

Bunun yerine, diffyeniden örneklenen entegre dalgacıktan kaynaklanır; * stepyalnızca doğru başlangıç ölçek ayarlar ve değerlerin kaybı olmadan atlanabilir. Bu , dalgacık yeniden hesaplanırken veya entegre edilmemiş dalgacık yeniden örneklenirken olmaz.

( Yeniden hesaplananın scipy.signal.morlet2L2 normalleştirildiğini, ancak yalnızca açıkça normalleştirildiği için; diff-örnek- int"kendi kendine normalleştirilmiş" olduğunu unutmayın).