STFT ve DWT (Dalgacıklar)


12

STFT, bazı frekans alanı değişiklikleri (örneğin: gürültü giderme) yapmak için ses verilerinde (örneğin .wav ses dosyasıyla) başarıyla kullanılabilir.
İle N=441000(örnekleme oranında 10 saniye örneğin fs=44100), windowsize=4096, overlap=4, STFT takribi olarak üreten bir 430x4096dizi (birinci koordinat süre, ikinci koordinat frekans kutusu). Bu dizide değişiklikler yapılabilir ve yeniden oluşturma örtüşme-ekleme (*) ile yapılabilir.

Dalgacıklarla benzer bir şey yapmak nasıl mümkün olur ? (DWT), yani zaman çerçeveleri ve frekans bölmeleri a x bile benzer bir şekil dizisi elde etmek, bu dizide bazı değişiklikler yapmak ve sonunda bir sinyal kurtarmak? Nasıl ? Çakışma ekleme işlemine eşdeğer dalgacık nedir ? Burada yer alan Python işlevleri ne olurdu ( ... ile ses modifikasyonunun kolay bir örneğini bulamadım ?)?abpyWavelets

(*): İşte kullanılabilecek STFT çerçevesi:

signal = stft.Stft(x, 4096, 4)    # x is the input
modified_signal = np.zeros(signal.shape, dtype=np.complex)

for i in xrange(signal.shape[0]):    # Process each STFT frame
    modified_signal[i, :] =  signal[i, :] * .....  # here do something in order to
                                                   # modify the signal in frequency domain !
y = stft.OverlapAdd(modified_signal, 4)   # y is the output

Amaç, dalgacıklarla benzer bir çerçeve bulmaktır.


Bir yan yorum: STFT'de bu tür bir "filtreleme" yapmak gerçekten kötü bir fikir. Gerçekten yapmak istediğiniz çoğu şeyi yapmanın harika bir yolu değil. Aslında ne elde etmeye çalışıyorsunuz?
Peter K.

PyWavelets'in yalnızca ayrık dalgacık dönüşümü için olduğunu unutmayın. STFT benzeri şeyler yapmak istiyorsanız, bir Gabor dönüşümü olan sabit Q dönüşümü, esasen karmaşık bir Morlet sürekli dalgacık dönüşümü ile aynı şey olan sürekli Q dönüşümü gibi , ancak ters çevrilebilir: grrrr.org/research/software/nsgt
Endolit

1
(bu soru "Topluluk" tarafından canlandırıldı.) Bence, dalgacıklar çakışıyor ve STFT'ye çok benzer bir şekilde ekliyor. bu yüzden sorunun doğasını tam olarak anlamıyorum.
robert bristow-johnson

Daha fazla ayrıntı gerekli mi?
Laurent Duval

Yanıtlar:


4

Kısa süreli Fourier dönüşümü genellikle, her frekansta aynı alt örnekleme ile uygulanan gereksiz bir dönüşümdür. Pencere iyi seçilmişse, tamamlanmıştır: onu tersine çevirebilir ve herhangi bir başlangıç ​​sinyalini kurtarabilirsiniz.

Gereksiz ve eksiksiz olduğundan, birçok mükemmel tersine sahiptir. Daha genel araçlar kullanılarak uygulanabilir ve anlaşılabilir: (aşırı örneklenmiş) karmaşık filtre bankaları. Bir pencere türü ve uzunluğu ve örtüşme verildiğinde, tersine çevrilip çevrilemeyeceğini hesaplayabileceğiniz bir analiz filtresi bankası sağlar. Eğer öyleyse, doğal bir ters ve optimize edilmiş ters de hesaplayabilirsiniz . Örtüşme ekleme, muhtemelen en yaygın olan, genellikle pencere seçimini kısıtlayan birçok potansiyel terslemeden yalnızca biridir.

Standart ayrık dalgacık dönüşümleri de filtre kümeleridir, alt örneklemenin her frekans bandında aynı olmaması (veya daha doğru bir şekilde ölçeklenmesi). Bu, her ölçek için eşit olmayan uzunluklara dönüşür. Yine de, üzerinde çalışabileceğiniz katsayıların "dikdörtgen dizisini" veren gereksiz dalgacık uygulamaları vardır. En iyi bilinen şemalar farklı isimler altında adlandırılır: kaydırma-değişmez veya zamanla değişmeyen dalgacıklar , tahmin edilmemiş dalgacıklar, sabit dalgacık dönüşümü(SWT) ve bazen döngüsel eğirme. Standart rekonstrüksiyonu, ölçekler üzerindeki farklı örnekleme faktörleri nedeniyle daha "gömülü" olmaları dışında, örtüşme-ekleme işlemine benzer adımları içerir. Bunları bir kütüphaneden herhangi bir ayrı dalgacıkla veya hatta kendi dalgacınızı tasarlayarak kullanabilirsiniz. Bunun nedeni, standart ayrık dalgacıkların artıklık olmaması düşünülerek tasarlanmasıdır, bu da dalgacık seçimini kısıtlar. Fazlalık ile, yerine getirilecek kısıtlamalar daha az katı olduğundan dalgacık seçimi artar. "Nihai" avatar, her ters sentez dalgasını "neredeyse" kabul eden sürekli dalgacık dönüşümüdür. Son cümlem oldukça berbat, umarım anlam kazanırsınız: Bir kare matris ters çevrilebilir olduğunda, sadece bir tersi vardır. Bir "dikdörtgen" matris genel bir şekilde ters çevrilebilir olduğunda,

Durağan Dalgacık Dönüşümünün bir python uygulaması var gibi görünüyor . 2.3.4'te birkaç referans bulabilirsiniz . Bağlantılı makalenin çeviri değişmez dalgacıklar bölümü .

Genellikle pratik uygulamalarda (jeofizik, tahribatsız muayene, ultrasonlar, titreşimler) tespit, denoising veya restorasyon için çok daha sağlamdır.


"Gereksiz" anlamına gelen "çıktıda, girdinin yeniden üretilmesi için gerekenden daha fazla bilgi var"
endolith

1
NM>N

3

Kısa süreli Fourier dönüşümü ile filtreleme için örtüşme ekleme / örtüşme kaydetme gereksiniminiz temel olarak, aldığınız katsayılarla ilişkili temel işlevlerin belirli bir zaman aralığında tanımlandığıdır (zaman içindeki tek bir nokta yerine). Genişleme katsayılarını hesaplamak için kullandığınız Fourier dönüşümü, sinyal çerçeve uzunluğunuzla tanımlanan dairesel bir alan üzerinde kıvrım da uygular. Bu, çerçevenin iki uç noktasının bir daire içinde gerçekten tanımlandığı ve kapatıldığı anlamına gelir. Bu nedenle, düzenlediğiniz katsayıların temel işlevlerinin, etrafını sararak çerçevenin her iki ucunu da asla etkilemediğinden emin olmalısınız.

Dalgacıklar ne zaman çeviri özvektörleri ne de dairesel kıvrım kullanılarak hesaplanmazlar. Bu, örtüşme veya kaydetme veya dairesel kıvrımın yan etkileri ile ilgili başka yöntemlere ihtiyacınız olmadığı anlamına gelir. Bunun yerine, dalgacık temeli vektörleri sinyalinizi tanımlamak için sadece olası bir temeldir. Dolayısıyla (tam, ayrık, muhtemelen dik) dalgacık dönüşümü, zaman alanı tabanından dalgacık alanı tabanına temel değişikliğinden başka bir şey değildir. Temel değişiklikler ters çevrilebilir (sizi oraya getiren temel değişiklik matrisinin tersini uygulayarak) ve zaman alanına geri dönebilirsiniz.

Pencere boyutu, çakışma, örnekleme oranı olarak verdiğiniz parametrelerin tümü dalgacık dönüşümü için geçerli değildir. İhtiyacınız olan tek şey bir anne dalgacıktır. Sonuçları STFT çıkışınızla karşılaştırmak istiyorsanız, dalgacık prototipi olarak STFT temel vektörlerinden herhangi birini (yani, pencereniz karmaşık bir üstel taşıyıcı ile çarpılır) seçebilirsiniz. Ardından, sinyalinizi, sonuçta katsayılarınız haline getiren yüksek ve düşük geçişli filtrelenmiş ve azaltılmış sinyallerin bir ağacına ayıracak hızlı dalgacık dönüşümünü uygularsınız. Her katsayı bir dalgacık temel vektörü ve parametreleri (ölçek, zaman) veya (sıklık, zaman) ile ilişkilidir. Katsayıları değiştirebilir ve sonra ters ayrık dalgacık dönüşümünü uygulayabilirsiniz. Katsayılarınızı alır ve tekrar bir sinyal üretmek için bunları bir resentez filtre bankasından geçirir.

Bu süreçler önemsiz değildir ve yeni başlayanlar için sindirimi zor olabilir. Ancak, hızlı dalgacık dönüşümünü ve tersini uygulayan seçtiğiniz platform için kütüphaneler / araç kutuları bulabilmeniz gerekir. Bununla birlikte, kendi dalgacık tabanınızı gerçekleştirmek istiyorsanız, ayrışma ve sentez filtre bankaları için filtre katsayılarını türetmeniz gerekecektir. Bu derin bir teori gerektirir ve muhtemelen önce onu incelemeniz gerekecektir.

Dalgacık dönüşümünün başka lezzetleri, yani aşırı tamamlanmış bir temelde çalışan sürekli dalgacık dönüşümü vardır. Hem hesaplamak hem de tersine çevirmek çok daha yavaştır, böylece şu anda yapmak istediğiniz şey için bir seçenek değildir.


1
Cevabınız için teşekkürler. Bir kod çerçevesine sahip olmaya çalışmamın ana nedeni, her zaman fark ettim (çocukluğumdan birkaç yıl öncesine kadar doktoramı bitirdiğimde (DSP ile ilgili değil, tabii ki sormazdım) acemi sorular burada!)) bazı gerçek hayattaki materyallerin (örneğin DSP'deki ses sinyali) manipüle edilmesinin , derin teoriyi anlamaya çok yardımcı olduğu. Ne kod istiyorum geçerli: Audio sound -> Wavelet transform -> (do something on the array) -> Inversion -> Audio output. Bir sürü ile (dizide bir şey yapın), eminim dalgacığın nasıl çalıştığını biraz daha anlayacağım.
Basj

1
@Basj, dediğim gibi yap. Hem hızlı dalgacık dönüşümünü hem de tersini destekleyen bir python kütüphanesi bulun ve üretilen katsayı ağacıyla oynayın. İyi şanslar ve iyi eğlenceler!
Jazzmaniac

"hepsi dalgacık dönüşümü için geçerli değil" CWT için geçerli değil mi?
endolith

1

Dalgacık tabanını tanımlamanın birçok yolu vardır. Genellikle bir dalgacık şöyle görünür:

wx0,k0(x)=Aexp(ik0x)e(k0(xx0))

x0k0eAk

(x0,k0)(x0,k0)

Dönüştürülen verilerin boyutsallığı sinyalin boyutunu aştığından, dalgacık temeli ortonormal olmayacaktır. Yani aşağıdakiler yanlış olacaktır:

wk0,x0|wk0,x0=δ(x0,x0)δ(k0,k0)

Aw

x0,k0|wx0,k01k0wx0,k0|=identity

Başka bir deyişle, sadece kurucu dalgacıklarını toplayarak sinyali mükemmel bir şekilde yeniden oluşturabilirsiniz.

"Modifikasyon" unuz yukarıdaki toplamda eklenebilir:

my_filter=x0,k0|wx0,k0f(x0,k0)wx0,k0|

2013-11-19 Güncellemesi: Aşağıda istendiği gibi uygulama ayrıntılarını ekleme.

f(x)

cx0,k0=wx0,k0|f

k0cx0,k0x0ffw0,k0cx0,k0

  • ff^
  • k01/4
    • f^w^0,k0
    • [kl,kr)w^0,k0
    • Buna ters bir Fourier dönüşümü uygulayın.
    • exp(ixkl+kr2)cx0,k0x0

k0x0w0,k0k0k0

cx0,k0k0

Kesikli spektrumlar bazen FFT'nizin nasıl tanımlandığına bağlı olarak normalleştirme problemleri ortaya çıkarır. Buradaki tüm olasılıkları kapsamayacağım. Normalizasyon temelde kolay bir sorundur. ;-)

w^x0,k0(k)wx0,k0(x)

w^x0,k0=Aexp(i(kk0)x0)exp((Qlog(k/k0))2)

QAk0


1
Gerçekten nasıl çalıştığını anlamak için gerekli olan dalgacık teorisi hakkında bu önemli noktaları hatırladığınız için teşekkür ederiz. Ancak burada soru, örneğin ses sinyali üzerinde çalışacak bir çerçeve kodu oluşturmakla ilgili olacaktır. Sorular: bu sonsuz meblağlarla nasıl başa çıkılacağı, pencerelerin nasıl seçileceği (ya da daha çok ana dalgacık ), Python'daki pyWavelets kullanılarak nasıl yapılır (ya da başka bir eşdeğer dil, o zaman Python'a tercüme edeceğim), nasıl yapılır parametreleri seçin (örnekteki ses için olduğu gibi: örnekleme oranı = 44100, fft penceresi = 4096, çakışma = 4, vb.)
Basj

akk|kakk|=Id

K

akakf

1
Çalışıp çalışmadığını görmenin en iyi yolu, minimal bir kod örneği sağlamak olacaktır (örneğin pyWavelet ile hayal ettiğim birkaç satırda mümkün olmalıdır) (anladığımda bunu iyi yapacağım, sanırım ben dalgacıklar hakkında okuma birkaç gün daha gerekir!)
Basj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.