Saya baru-baru ini mulai bermain dengan transformasi Fourier (setelah menghabiskan beberapa minggu belajar tentang matematika di baliknya). Saya memutuskan untuk mencoba meretas filter low-pass pada gigitan suara berikut:
Secara khusus, saya mengambil transformasi Fourier, memusatkan 1/2 dari frekuensi tertinggi, dan kemudian mengambil transformasi Fourier terbalik. Ini yang saya dapat
Mengapa ada suara berderak itu?
fourier-transform
discrete-signals
sound
JeremyKun
sumber
sumber
Jawaban:
Dua potensi masalah:
sumber
Pertama, sebagai catatan, transformasi fourier tidak ideal untuk filter low / high pass. Filter Butterworth adalah tempat yang baik untuk memulai dan mengikuti filter Chebyshev / Elliptical jika Anda menjadi lebih ambisius.
Sepertinya Anda mencoba menerapkan filter yang ideal. Tidak ada cara kita dapat menerapkan filter 'dinding bata' ini di mana kita memotong semua frekuensi di atas / di bawah nilai yang diberikan. Semua filter yang dikembangkan dengan baik akan meruncing dari 1 ke 0 di sekitar frekuensi cut-off kami.
Filter ideal hanya mungkin teoretis dan jika Anda memiliki Continuous Fourier Transform, metode Anda di atas akan berfungsi.
Tapi kami sedang melakukan Transformasi Fourier Diskrit sehingga ada lebih banyak yang perlu dikhawatirkan. Karena saya tidak yakin metode implementasi Anda, saya akan menebak bahwa Anda melakukan windowing karena hanya mengeluarkan frekuensi adalah cara pasti untuk mendapatkan cracking di DFT windowed.
Ketika windowing dalam DFT, orang mungkin berpikir bahwa amplitudo frekuensi antara windows relatif kontinu. misalnya jika frekuensi 400Hz memiliki amplitudo 0,5 di jendela saat ini yang di jendela berikutnya amplitudo akan mendekati 0,5. Sayangnya ini tidak benar, jadi jika kita hanya menghapus frekuensi 400Hz dari DFT kita, kita mungkin mendengar suara keras atau celah di antara windows.
Contoh kecil: Cut off rate 600Hz Window 1 memainkan sinus 800Hz Window 2 menghubungkan 'terus menerus' dengan window 1 dan memainkan 400Hz. Kemudian kita akan mendengar bunyi pop di antara jendela karena jendela 1 akan diam dan jendela 2 akan segera hidup.
Hal lain yang perlu diingat adalah bahwa kita hanya dapat mewakili jumlah frekuensi yang terbatas dengan DFT. Jika kita memiliki file audio dengan gelombang sinus frekuensi antara dua frekuensi diskrit kita di DFT kita, maka kita benar-benar merepresentasikannya dengan banyak frekuensi diskrit kita. Jadi meskipun contoh file audio mungkin mengandung gelombang sinus yang lebih rendah dari cutoff kami, jika frekuensinya di antara frekuensi DFT kami daripada kami mungkin memotong sebagian dan mengeluarkannya dengan metode di atas, karena frekuensi yang lebih tinggi diperlukan untuk mewakili audio mengajukan.
Semoga itu bisa membantu
sumber
Memang mungkin untuk melakukan seperti yang Anda sarankan tetapi tidak tanpa beberapa efek samping. Katakanlah kita membentuk sinyal uji sederhana mana:s(t)=slow(t)+shigh(t)
di mana kami mengatakan bahwa kedua berada di bawah frekuensi cut-off lowpass yang dipilih sedemikian rupa sehingga , dan kami memilih . Kita tentu saja dapat memilih amplitudo seperti yang kita inginkan dan saya baru saja memilih yang di atas untuk menjaga hal-hal sederhana. Dengan memiliki dua kontribusi frekuensi di bawah frekuensi cut-off dan satu di atas membuatnya mudah untuk mengikuti dan membandingkan sinyal.f0,f1 fcut f0<f1<fcut f2>fcut
Berikut ini saya berasumsi bahwa kami memiliki sampel diambil dengan frekuensi . Pada kenyataannya, kami memilih untuk membuat sinyal yang diamati menjadi halus. Juga diasumsikan bahwa kami hanya mempertimbangkan satu kumpulan sampel data. Jika Anda perlu menangani beberapa kerangka waktu, periksa kertas karya Fred Harris bernama "Pada Penggunaan Windows untuk Analisis Harmonik dengan Transformasi Fourier Diskrit" dari Proc. IEEE pada tahun 1978.N fs>2⋅f2 fs≫2⋅f2
Saya telah menggabungkan program Python kecil untuk menggambarkan beberapa konsep - kodenya cukup buruk tetapi saya hanya mengambil beberapa kode lama yang saya miliki untuk masalah yang sama. Meskipun hampir tidak ada komentar, itu harus cukup mudah diikuti karena modul kecil. Ada dua fungsi dft / idft ; dua fungsi fshiftn / fshiftp untuk mengubah frekuensi sinyal i DFT domain untuk penyaringan; sebuah fungsi dftlpass untuk melakukan pemfilteran dalam domain DFT; fungsi zpblpass untuk melakukan penyaringan dengan menggunakan filter Butterworth; fungsi bbdftsig untuk membentuk sinyal uji dan melakukan penyaringan; dan akhirnya sebuah fungsi plot keciluntuk merencanakan sinyal. Di akhir skrip, parameter yang berbeda diatur dan angka yang berbeda dibuat.
Memilih dan memberi kita resolusi frekuensi Hz. Jika kita memilih sesuai dengan ini kita bisa mendapatkan persetujuan sempurna dengan memilih frekuensi seperti yang ditunjukkan di atas. Jika kita pertama-tama memilih frekuensi yang ada di grid sebagai , , dan kita memiliki kita mendapatkan set hasil pertama. Bagian pertama, tengah dan terakhir dari sinyal yang relevan ditunjukkan di bawah ini:N=5000 fs=1000 fs/N=0.2 f0,f1,f2 f0=3 f1=11 f2=21 fcut=15
Seperti yang terlihat dari gambar, kita memiliki input gabungan sebagai sinyal magenta; sinyal hijau seperti yang hanya bisa kita lihat dari tanda 'x' adalah (sinyal input mentah ketika kita hanya memasukkan sinyal input di bawah frekuensi cut-off); sinyal merah adalah sinyal yang kami dapatkan saat menggunakan filter DFT; dan sinyal biru adalah yang kita dapatkan dari filter Butterworth. Seperti yang terlihat di atas, kami memperoleh persetujuan sempurna antara dan sinyal DFT yang difilter - tetapi filter Butterworth memiliki beberapa dampak pada sinyal in-band (khususnya komponen dis slow slow f1 . Seperti yang cukup tipikal untuk jenis pengolahan ini, kami memiliki beberapa perbedaan di awal dan akhir urutan karena efek tepi dan kesepakatan yang cukup baik antara kedua jenis penyaringan di bagian tengah.
Jika kita mengubah frekuensi menjadi yang tidak ada di kisi frekuensi (dan lebih jauh itu cukup dekat dengan frekuensi cut-off), kita melihat beberapa hasil yang berbeda seperti yang ditunjukkan di bawah ini.f1 f1=11.5
Sekarang kita melihat perbedaan besar antara sinyal hijau, biru dan merah yang dalam situasi ideal harus identik. Di tengah-tengah sinyal mereka semua setuju dengan cukup baik - DFT dan referensi setuju dengan yang terbaik.slow
Jadi kesimpulannya adalah mungkin untuk menggunakan penyaringan langsung dengan memaksa koefisien Fourier ke nol yang juga kadang-kadang dilakukan dalam penginderaan tekan untuk mengurangi dukungan sinyal untuk memaksa sparsity pada sinyal. Namun, ada konsekuensi dari ini sebagai peningkatan kesalahan khususnya di tepi sinyal. Selanjutnya, di atas adalah kasus terbaik di mana seluruh sinyal diperlakukan sebagai satu urutan. Jika sinyal harus dipecah dalam kerangka waktu maka akan menjadi rumit karena kita perlu mempertimbangkan beberapa teknik windowing atau lainnya untuk memastikan kontinuitas sinyal di antara frame. Jadi saran saya mirip dengan beberapa posting lain dalam merekomendasikan untuk menggunakan Butterworth / Elliptic / .. atau filter apa pun secara normal.
sumber
Mem-nolkan nampan dalam FFT sebenarnya dapat meningkatkan amplitudo frekuensi lain yang dekat tetapi tidak terpusat pada nampan ed-nol atau nampan yang berdekatan. Peningkatan ini dapat menyebabkan kliping.
Selain itu, jika Anda melakukan FFT menggunakan blok yang tidak nol-empuk (dan tidak tumpang tindih) (yang bertentangan dengan seluruh lagu dalam satu FFT besar), setiap modifikasi data FFT akan membungkus dari belakang ke depan. urutan domain waktu di setiap blok, sehingga menambah diskontinuitas aneh lainnya di tempat yang salah.
sumber
Berikut adalah filter bandpass FFT bin-zeroing cepat dan kotor, dengan kode FFT juga.
untuk setiap sampel audio input, panggil mainbandpass dengan sampel input dan rentang frekuensi yang ingin Anda simpan dalam potongan rendah dan potongan tinggi. Jika pintasan lebih besar dari pintasan, hasilnya adalah filter band-reject. Ada konvolusi melingkar yang terjadi, tetapi tidak akan ada emisi pita yang bagus untuk modem.
sumber