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 430x4096
array (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 a
kerangka waktu, dan b
tempat 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.
Jawaban:
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).
sumber
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.
sumber
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.Ada banyak cara mendefinisikan basis wavelet. Biasanya wavelet terlihat seperti:
Karena dimensi data yang ditransformasikan melebihi sinyal, basis wavelet tidak akan menjadi ortonormal. Yaitu yang berikut ini akan salah:
Dengan kata lain, Anda dapat merekonstruksi sinyal dengan sempurna hanya dengan menjumlahkan wavelet penyusunnya.
"Modifikasi" Anda dapat dengan mudah dimasukkan dalam jumlah di atas:
Pembaruan 2013-11-19: Menambahkan detail implementasi di bawah ini seperti yang diminta.
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. ;-)
sumber