Langkah pertama adalah memverifikasi bahwa laju sampel awal dan laju sampel target Anda adalah bilangan rasional . Karena mereka bilangan bulat, mereka secara otomatis bilangan rasional. Jika salah satu dari mereka bukan bilangan rasional, masih mungkin untuk membuat perubahan tingkat sampel, tetapi itu adalah proses yang jauh berbeda dan lebih sulit.
Langkah selanjutnya adalah memfaktorkan dua tingkat sampel. Tingkat sampel awal, dalam hal ini, adalah 44100, yang merupakan faktor . Tingkat sampel target, 16000, faktor ke . Jadi, untuk mengkonversi dari laju sampel awal ke laju target, kami harus memusnahkan dengan dan menginterpolasi dengan .22∗ 32∗ 52∗ 7227∗ 5332∗ 7225∗ 5
Langkah-langkah sebelumnya harus dilakukan, tidak peduli bagaimana Anda ingin menguji ulang data. Sekarang mari kita bicara tentang bagaimana melakukannya dengan FFT. Trik untuk resampling dengan FFT adalah memilih panjang FFT yang membuat semuanya berjalan baik. Itu berarti memilih panjang FFT yang merupakan kelipatan dari laju penipisan (441, dalam hal ini). Sebagai contoh, mari kita pilih panjang FFT 441, meskipun kita bisa memilih 882, atau 1323, atau kelipatan positif lain dari 441.
Untuk memahami cara kerjanya, ada baiknya memvisualisasikannya. Anda mulai dengan sinyal audio yang terlihat, dalam domain frekuensi, sesuatu seperti gambar di bawah ini.
Ketika Anda selesai dengan pemrosesan Anda ingin menurunkan laju sampel menjadi 16 kHz, tetapi Anda ingin sesedikit mungkin distorsi. Dengan kata lain, Anda hanya ingin menyimpan semuanya dari gambar di atas dari -8 kHz hingga +8 kHz dan membuang yang lainnya. Itu menghasilkan gambar di bawah ini.
Harap dicatat bahwa laju sampel tidak untuk skala, mereka hanya ada untuk menggambarkan konsep.
Keindahan memilih panjang FFT yang merupakan kelipatan dari faktor penipisan adalah bahwa Anda dapat melakukan pengujian ulang hanya dengan menjatuhkan bagian dari hasil FFT, dan kemudian membalikkan FFT apa yang tersisa. Dalam kasus contoh kami, Anda FFT 441 sampel data, yang memberi Anda 441 sampel kompleks dalam domain frekuensi. Kami ingin memusnahkan oleh 441 dan interpolasi oleh 160 ( ), jadi kami menjaga 160 sampel yang mewakili frekuensi dari -8 kHz ke +8 kHz. Kami kemudian membalikkan FFT sampel dan presto itu! Anda memiliki 160 sampel domain waktu yang diambil sampelnya pada 16 kHz.25∗ 5
Seperti yang Anda duga, ada beberapa masalah potensial. Saya akan membahas masing-masing dan menjelaskan bagaimana Anda dapat mengatasinya.
Apa yang Anda lakukan jika data Anda bukan kelipatan faktor penipisan yang bagus? Anda dapat dengan mudah mengatasinya dengan melapisi bagian akhir data Anda dengan angka nol yang cukup untuk menjadikannya kelipatan faktor penipisan. Data itu diisi sebelum itu FFT.
Meskipun metode yang saya jelaskan sangat sederhana, metode ini juga tidak ideal karena dapat memperkenalkan dering dan artefak jahat lainnya dalam domain waktu. Anda dapat menghindari itu dengan memfilter data domain frekuensi sebelum menjatuhkan data frekuensi tinggi. Anda melakukan ini dengan FFT'ing filter Anda dengan panjang , padding data Anda (sebelum FFT'ing itu) dengan setidaknyall - 1nol (harap dicatat bahwa jumlah sampel data dan jumlah sampel padding KEDUA harus menjadi kelipatan positif dari faktor penipisan - Anda dapat meningkatkan panjang padding untuk memenuhi batasan ini), MENCARI data padded, mengalikan domain frekuensi data dan filter, dan kemudian aliasing frekuensi tinggi (> 8 kHz) hasil turun ke frekuensi rendah (<8 kHz) hasil sebelum menjatuhkan hasil frekuensi tinggi. Sayangnya, karena pemfilteran dalam domain frekuensi adalah topik besar dengan caranya sendiri, saya tidak akan dapat membahas lebih detail dalam jawaban ini. Namun, saya akan mengatakan bahwa jika Anda memfilter dan memproses data dalam lebih dari satu chunk, Anda perlu mengimplementasikan Overlap-and-Add atau Overlap-and-Save untuk membuat penyaringan berlanjut.
Saya harap ini membantu.
EDIT: Perbedaan antara jumlah awal sampel domain frekuensi dan jumlah target sampel domain frekuensi harus genap sehingga Anda dapat menghapus jumlah sampel yang sama dari sisi positif hasil sebagai sisi negatif dari hasil. Dalam kasus contoh kami, jumlah awal sampel adalah tingkat penipisan, atau 441, dan jumlah target sampel adalah tingkat interpolasi, atau 160. Perbedaannya adalah 279, yang bahkan tidak genap. Solusinya adalah dengan menggandakan panjang FFT ke 882, yang menyebabkan jumlah target sampel juga menjadi dua kali lipat menjadi 320. Sekarang perbedaannya genap, dan Anda dapat menjatuhkan sampel domain frekuensi yang sesuai tanpa masalah.