STFT dan DWT (Wavelets)

12

STFT dapat berhasil digunakan pada data suara (dengan .wav soundfile misalnya) untuk melakukan beberapa modifikasi domain frekuensi (misalnya: penghapusan kebisingan).
Dengan N=441000(yaitu 10 detik pada sampling rate fs=44100), windowsize=4096, overlap=4, STFT menghasilkan approximatively sebuah 430x4096array (koordinat pertama: kerangka waktu, koordinat kedua: bin frekuensi). Modifikasi dapat dilakukan pada array ini, dan rekonstruksi dapat dilakukan dengan tumpang tindih-tambah (*).

Bagaimana mungkin melakukan hal serupa dengan wavelet ? (DWT), yaitu mendapatkan array bentuk yang sama a x b, dengan akerangka waktu, dan btempat frekuensi, melakukan beberapa modifikasi pada array ini, dan pada akhirnya, memulihkan sinyal? Bagaimana? Apa yang setara dengan wavelet untuk tumpang tindih-tambahkan ? Apa yang akan menjadi fungsi Python yang terlibat di sini (saya belum menemukan contoh mudah modifikasi audio dengan pyWavelets...)?

(*): Ini adalah kerangka kerja STFT yang dapat digunakan:

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

Tujuannya adalah untuk menemukan kerangka kerja yang mirip dengan wavelet.

Basj
sumber
Komentar sampingan: melakukan semacam "penyaringan" pada STFT adalah ide yang sangat buruk. Ini bukan cara yang bagus untuk melakukan banyak hal yang benar-benar ingin Anda lakukan. Apa yang sebenarnya ingin Anda capai?
Peter K.
Perhatikan bahwa PyWavelets hanya untuk transformasi wavelet diskrit. Jika Anda ingin melakukan hal-hal seperti STFT, Anda akan lebih mudah memahami transformasi wavelet kontinu, seperti transformasi Q konstan, yang merupakan transformasi Gabor, pada dasarnya hal yang sama dengan transformasi wavelet kontinyu Morlet yang rumit , tetapi dirancang untuk menjadi invertible: grrrr.org/research/software/nsgt
endolith
1
(pertanyaan ini dihidupkan kembali oleh "Komunitas".) Menurut pendapat saya, wavelet tumpang tindih dan menambahkan dengan cara yang sangat mirip dengan STFT. jadi saya tidak mengerti sifat pertanyaannya.
robert bristow-johnson
Apakah ada detail lebih lanjut?
Laurent Duval

Jawaban:

4

Transformasi Fourier waktu-pendek umumnya merupakan transformasi yang berlebihan, biasanya diimplementasikan dengan subsampling yang sama pada setiap frekuensi. Jika jendela dipilih dengan baik, itu selesai: Anda dapat membalik dan memulihkan sinyal awal apa pun.

Karena mubazir dan lengkap, ia memiliki banyak invers yang sempurna. Ini dapat diimplementasikan dan dipahami menggunakan alat yang lebih umum: bank filter kompleks (oversampled). Diberikan jenis dan panjang jendela ditambah tumpang tindih memberi Anda bank filter analisis yang dapat Anda hitung apakah itu dapat dibalik atau tidak. Jika ya, Anda dapat menghitung invers alami, dan inversi yang dioptimalkan juga. Tumpang tindih-tambah hanyalah satu dari banyak invers potensial, mungkin yang paling umum, yang sering membatasi pilihan jendela.

Transformasi wavelet diskrit standar juga merupakan bank filter, dengan perbedaan bahwa subsampling tidak sama di setiap pita frekuensi (atau skala yang lebih tepat). Ini berubah menjadi panjang yang tidak rata untuk setiap skala. Namun, ada implementasi wavelet redundan yang menghasilkan "array persegi panjang" dari koefisien yang dapat Anda gunakan. Skema yang paling dikenal disebut dengan nama yang berbeda: wavelet shift-invariant atau time-invariant , wavelet undecimated, transformasi wavelet stasioner(SWT), dan terkadang berputar-putar. Rekonstruksi standarnya melibatkan langkah-langkah yang mirip dengan tumpang tindih, kecuali mereka lebih "tertanam" karena faktor pengambilan sampel yang berbeda atas skala. Anda dapat menggunakannya dengan wavelet diskrit apa pun dari perpustakaan, atau bahkan dengan mendesain wavelet Anda sendiri. Alasannya adalah bahwa wavelet diskrit standar dirancang dengan non-redundansi dalam pikiran, yang membatasi pilihan wavelet. Dengan redundansi, pilihan wavelet Anda meningkat, karena kendala untuk memenuhi kurang ketat. Avatar "akhir" adalah transformasi wavelet kontinu, yang mengakui "hampir" setiap wavelet sintesis terbalik. Kalimat terakhir saya cukup buruk, saya harap Anda mendapatkan artinya: ketika sebuah matriks kuadrat tidak dapat dibalik, itu hanya memiliki satu kebalikan. Ketika matriks "persegi panjang" dibiarkan tidak dapat dibalik dengan cara yang digeneralisasi,

Tampaknya ada implementasi python dari Stationary Wavelet Transform . Anda dapat menemukan beberapa referensi di 2.3.4. Bab terjemahan wavelet invarian dari kertas yang ditautkan .

Ini umumnya jauh lebih kuat untuk deteksi, denoising atau restorasi dalam aplikasi praktis (geofisika, pengujian non-destruktif, ultrasonik, getaran).

Laurent Duval
sumber
"Redundant" yang berarti "memiliki lebih banyak informasi dalam output daripada yang diperlukan untuk mereproduksi input"?
endolith
1
NM>N
3

Alasan Anda perlu tumpang tindih add / overlap simpan untuk pemfilteran dengan waktu pendek Transformasi Fourier pada dasarnya, bahwa fungsi dasar yang terkait dengan koefisien yang Anda peroleh didefinisikan berdasarkan rentang waktu tertentu (sebagai lawan dari satu titik waktu). Transformasi Fourier yang Anda gunakan untuk menghitung koefisien ekspansi juga menerapkan konvolusi pada domain lingkaran yang ditentukan oleh panjang bingkai sinyal Anda. Itu berarti dua titik ujung frame benar-benar diidentifikasi dan ditutup dalam lingkaran. Itulah sebabnya Anda harus memastikan bahwa fungsi dasar dari koefisien yang Anda edit tidak pernah memengaruhi kedua ujung frame dengan membungkusnya.

Wavelet bukan vektor vektor eigen waktu dan juga tidak dihitung menggunakan konvolusi melingkar. Ini berarti Anda tidak perlu menambahkan atau menyimpan tumpang tindih atau metode lain yang berurusan dengan efek samping dari konvolusi melingkar. Alih-alih, vektor basis wavelet hanyalah dasar yang memungkinkan untuk menggambarkan sinyal Anda. Transformasi wavelet (lengkap, diskrit, mungkin ortogonal) tidak lain merupakan dasar perubahan dari basis domain waktu ke basis domain wavelet. Perubahan dasar dapat dibalik (dengan menerapkan kebalikan dari matriks perubahan dasar yang membawa Anda ke sana) dan Anda dapat beralih kembali ke domain waktu.

Parameter yang Anda berikan sebagai ukuran jendela, tumpang tindih, laju pengambilan sampel semuanya tidak berlaku untuk transformasi wavelet. Satu-satunya yang Anda butuhkan adalah wavelet ibu. Jika Anda ingin membandingkan hasil dengan output STFT Anda, Anda dapat memilih salah satu vektor basis STFT (yaitu jendela Anda dikalikan dengan pembawa eksponensial kompleks) sebagai prototipe wavelet. Kemudian Anda menerapkan transformasi wavelet cepat, yang akan menguraikan sinyal Anda menjadi pohon sinyal disaring dan dihancurkan tinggi dan low pass yang akhirnya menjadi koefisien Anda. Setiap koefisien dikaitkan dengan vektor basis wavelet dan parameternya (skala, waktu) atau (frekuensi, waktu). Anda dapat memanipulasi koefisien dan kemudian menerapkan transformasi wavelet diskrit terbalik. Ini akan mengambil koefisien Anda dan menjalankannya melalui bank filter resintesis untuk menghasilkan sinyal lagi.

Proses ini tidak sepele dan mungkin sulit dicerna untuk pemula. Tetapi Anda harus dapat menemukan perpustakaan / kotak alat untuk platform pilihan Anda yang mengimplementasikan transformasi wavelet cepat dan kebalikannya. Namun, jika Anda ingin mewujudkan basis wavelet Anda sendiri, Anda harus menurunkan koefisien filter untuk bank filter dekomposisi dan sintesis. Itu membutuhkan beberapa teori yang mendalam, dan Anda mungkin harus mempelajarinya terlebih dahulu.

Ada rasa lain dari transformasi wavelet, yaitu transformasi wavelet kontinu yang bekerja dengan basis overcomplete. Keduanya jauh lebih lambat untuk menghitung dan jauh lebih sulit untuk dibalik, sehingga saat ini tidak menjadi pilihan untuk apa yang ingin Anda lakukan.

Jazzmaniac
sumber
1
Terima kasih atas jawaban anda. Alasan utama mengapa saya mencoba untuk memiliki kerangka kode adalah bahwa saya selalu memperhatikan (dari masa kecil saya hingga beberapa tahun yang lalu ketika saya menyelesaikan PhD saya (tidak terkait dengan DSP tentu saja, jika demikian saya tidak akan bertanya) jadi pertanyaan pemula di sini!)) adalah bahwa memanipulasi beberapa materi kehidupan nyata (misalnya sinyal audio dalam DSP) banyak membantu untuk memahami teori yang mendalam. Apa yang saya ingin kode: Audio sound -> Wavelet transform -> (do something on the array) -> Inversion -> Audio output. Dengan banyak (melakukan sesuatu pada array), saya yakin saya akan lebih mengerti bagaimana wavelet bekerja.
Basj
1
@ Basj, maka lakukan seperti yang saya katakan. Temukan pustaka python yang mendukung transformasi wavelet cepat dan kebalikannya dan kemudian bermain dengan pohon koefisien yang dihasilkan. Semoga berhasil dan selamat bersenang - senang!
Jazzmaniac
"Apakah semua tidak berlaku untuk transformasi wavelet" Mereka berlaku untuk CWT, kan?
endolith
1

Ada banyak cara mendefinisikan basis wavelet. Biasanya wavelet terlihat seperti:

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

x0k0eAk

(x0,k0)(x0,k0)

Karena dimensi data yang ditransformasikan melebihi sinyal, basis wavelet tidak akan menjadi ortonormal. Yaitu yang berikut ini akan salah:

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

Aw

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

Dengan kata lain, Anda dapat merekonstruksi sinyal dengan sempurna hanya dengan menjumlahkan wavelet penyusunnya.

"Modifikasi" Anda dapat dengan mudah dimasukkan dalam jumlah di atas:

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

Pembaruan 2013-11-19: Menambahkan detail implementasi di bawah ini seperti yang diminta.

f(x)

cx0,k0=wx0,k0|f

k0cx0,k0x0ffw0,k0cx0,k0

  • ff^
  • k01/4
    • f^w^0,k0
    • [kl,kr)w^0,k0
    • Terapkan transformasi Fourier terbalik untuk itu.
    • exp(ixkl+kr2)cx0,k0x0

k0x0w0,k0k0k0

cx0,k0k0

Memotong spektrum kadang-kadang menimbulkan masalah normalisasi, tergantung pada bagaimana FFT Anda didefinisikan. Saya tidak akan berusaha untuk menutup semua kemungkinan di sini. Normalisasi pada dasarnya adalah masalah yang mudah. ;-)

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

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

QAk0

apt1002
sumber
1
Terima kasih telah mengingat poin-poin penting tentang teori wavelet, yang memang perlu untuk memahami cara kerjanya. Tapi di sini pertanyaannya lebih tentang membangun kode kerangka kerja yang akan bekerja pada sinyal audio misalnya. Pertanyaannya adalah: bagaimana menangani jumlah tak terbatas ini, bagaimana memilih windows (atau lebih tepatnya mother-wavelet ), bagaimana melakukannya menggunakan pyWavelets dengan Python (atau bahasa lain yang setara, saya akan menerjemahkan ke Python kemudian), bagaimana cara pilih parameter (seperti dalam contoh saya untuk audio: laju sampling = 44100, jendela fft = 4096, tumpang tindih = 4, dll.)
Basj
akk|kakk|=Id
K
akakf
1
Cara terbaik untuk melihat apakah itu berfungsi atau tidak adalah dengan memberikan contoh kode minimal (dengan pyWavelet misalnya itu mungkin dalam beberapa baris yang saya bayangkan) (Saya akan melakukannya dengan baik begitu saya memahaminya, saya pikir saya perlu beberapa hari lagi membaca tentang wavelet!)
Basj