Memutar audio musik dengan kecepatan lebih lambat akan menurunkan nada (frekuensi). Apakah ada alat dan teori untuk memperlambat pemutaran lagu sambil menjaga frekuensinya tetap sama? Saya kira kita bisa melakukan transformasi Fourier windowed atau transformasi wavelet. Tampaknya kita harus memilih dulu ukuran jendela atau secara dinamis memilih basis wavelet. Apakah ada teori dan aplikasi spesifik dan terperinci untuk melakukan itu?
10
Jawaban:
Ya beberapa dari kita dapat melakukannya, Anda dapat mempercepat atau memperlambat tanpa mempengaruhi nada, beberapa orang memanggil aplikasi Time Stretch ini, ada berbagai cara untuk melakukannya, Anda dapat melakukannya di domain frekuensi atau domain waktu, Anda harus memilih apa yang terbaik untuk Anda, Anda akan menemukan beberapa kelebihan dan kekurangan masing-masing.
Domain waktu:
Dalam Time Domain Anda dapat mencoba beberapa teknik seperti:
Pro: Cepat, beberapa algoritma mudah dimengerti, kualitas bagus dalam suara monofonik.
Cons: Secara umum Anda akan membutuhkan track pitch yang sangat bagus untuk menyambungkan pada posisi yang tepat, sulit dilakukan :-(, jadi jika track pitch Anda gagal atau tidak berfungsi dalam suara Poliphonic, algoritma ini akan memberikan banyak gangguan / artefak dalam suara output.
Domain Frekuensi:
Semua rentang waktu yang saya tahu dalam domain frekuensi didasarkan pada teknik fase vocoder .
Pro: Akan bekerja dalam suara polifonik atau monofonik.
Cons: Dapat menyakitkan memahami semua matematika, implementasi agak sulit, tidak begitu cepat seperti kode domain waktu, untuk suara saya lebih suka hasil waktu domain, beberapa trik untuk meningkatkan hasil fase standar vocoder tidak dibagikan.
Saya dapat mengatakan bahwa ukuran jendela dan hop adalah salah satu kunci untuk kualitas fase vocoder, umumnya kita memilih
4x
tumpang tindih untuk resintesis, satu ukuran jendela hann4096
sudah cukup untuk telinga saya (tentu saja jika Anda memiliki kekuatan pemrosesan untuk ukuran ini) , vocoder fase standar dapat menambahkan beberapa efek reverberant, untuk mencoba menghindari masalah semacam ini Anda mungkin perlu mengunci fase.Untuk dataile lihat di kertas Miller Puckette dan Portnoff
sumber
44100 * 60 = 2646000
poin sekaligus dan memproses, jadi lupakan setiap upaya pemrosesan waktu nyata seperti ini ,Alat / teori yang Anda jelaskan adalah bidang penelitian teknologi musik yang luas, yang secara luas disebut modifikasi skala waktu audio. Komponen besar dari bidang ini adalah bagaimana Anda dapat mencegah perubahan yang terdengar hingga frekuensi setelah peregangan waktu. Ini dapat didekati dengan metode frekuensi dan waktu-domain, tergantung pada kendala atau tujuan aplikasi Anda. Entri wikipedia untuk modifikasi skala waktu / pitch Audio adalah titik awal yang baik.
Jika Anda ingin melakukan pendekatan menggunakan basis frekuensi / wavelet, ukuran jendela dan pilihan basis Anda akan memengaruhi seberapa baik Anda dapat melokalisasi sinyal. Untuk menggunakan STFT sebagai contoh, jendela panjang akan bekerja dengan baik untuk sinusoid stasioner tetapi menghancurkan transien Anda. Jendela yang lebih pendek akan memberikan respons sementara yang lebih disukai dengan biaya lokalisasi domain frekuensi. Kinerja pangkalan wavelet lainnya akan tergantung pada sifat proyeksi sinyal Anda ke pangkalan.
sumber
Di bawah ini adalah tautan ke fungsi tutorial sederhana dan berharga dalam C ++ (smbPitchShift.cpp) oleh Stephan M. Bernsee, yang dapat memperlambat atau mempercepat musik tanpa mengubah nada.
Dia telah merilis kode ini di bawah Lisensi Wide Wide (WOL). Dalam aplikasi saya, saya dapat mengadaptasi fungsinya untuk memperlambat musik secara real-time - yaitu saat memutar file mp3 dan juga melakukan deteksi nada pada sinyal mp3 pada saat yang sama.
Saya juga menyertakan tautan ke situs web Bernsee yang berisi uraian terperinci tentang Time-Stretching dan Pitch-Shifting dari sinyal audio, seperti musik.
https://github.com/AndyA/BatPhone/blob/master/pitchshift.c
http://blogs.zynaptiq.com/bernsee/time-pitch-overview/
sumber
time stretch
, kode asli berlakuPitch Shift
, dalam hal ini untuk menerapkan modifikasi skala waktu yang perlu Anda gabungkanPitch Shifit + Resample (interpolation)
, kode Bernsee berfungsi dengan baik menggunakan ukuran jendela yang4096
Anda dapat melempar pergantian satu oktaf (di atas atau di bawah) , itu artinya Anda hanya akan dapat membuat skala waktu dengan kualitas yang baik menggunakan faktor antara 2.0x-0.5x, vocoder fase yang dibangun dengan baik dapat mencapai hasil yang lebih baik menggunakan ukuran jendela yang sama, dan Anda akan dapat memperkirakan ini faktor dengan kualitas yang lebih baik8192
pada kode dari halaman unduh, jadi Anda harus melakukan 4x poin lebih banyak untuk memproses , Saya kembali untuk mengatakan bahwa dengan ukuran setengah jendela8192/2=4096
Anda dapat melakukan hal yang sama menggunakan beberapa rahasia fase vocoder, intinya di sini adalah bahwa Anda dapat menjaga kualitas dengan pemrosesan yang jauh lebih sedikit.