Perlambat Memutar Musik Sambil Memelihara Frekuensi

10

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?

Hans
sumber
1
Selain jawaban yang diberikan di bawah ini, silakan lihat tautan ini untuk informasi lebih lanjut.
A_A

Jawaban:

5

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:

  • TDHS (Domain waktu Harmonic Sacaling)
  • SOLA (Synchronous Overlap Add)
  • PSOLA (Pitch Synchronous Overlap Add)
  • WSOLA (Waveform Similarity Overlap Add)

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 4xtumpang tindih untuk resintesis, satu ukuran jendela hann 4096sudah 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

Ederwander
sumber
Terima kasih atas jawaban Anda. Apa masalah dengan pendekatan yang paling naif: perluas sinyal waktu secara keseluruhan sebagai fungsi pada interval waktu keseluruhan tanpa windowing ke deret Fourier dan kalikan semua frekuensi dengan konstanta. Saya mengerti kesalahan lokal apa pun dalam domain waktu akan memengaruhi semua koefisien Fourier. Selain itu, apa jebakan dari pendekatan non-lokal yang naif ini?
Hans
Saya belum pernah mencoba hal seperti itu, mungkin berhasil, masalah yang jelas adalah bahwa ini bisa sangat mahal, Ini tentu bukan cara yang efisien, bayangkan bahwa Anda memiliki sepotong audio (1 menit) sampel pada 44100Hz, sekarang ke lakukan apa yang Anda usulkan, Anda harus menerapkan fourier pada 44100 * 60 = 2646000poin sekaligus dan memproses, jadi lupakan setiap upaya pemrosesan waktu nyata seperti ini ,
ederwander
1
Saya tidak berpikir apa yang saya sarankan sebelumnya akan bekerja dalam arti matematika murni (mengabaikan sensitivitas biaya dan kesalahan).
Hans
3

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.

Cepat
sumber
Terima kasih banyak atas jawabannya. Apakah Anda memiliki referensi tentang penerapan wavelet untuk masalah ini?
Hans
Silakan lihat komentar saya di bawah jawaban ederwander juga. Terima kasih.
Hans
2

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/

James Paul Millard
sumber
Kode asli tidak berlaku time stretch, kode asli berlaku Pitch Shift, dalam hal ini untuk menerapkan modifikasi skala waktu yang perlu Anda gabungkan Pitch Shifit + Resample (interpolation), kode Bernsee berfungsi dengan baik menggunakan ukuran jendela yang 4096Anda 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 baik
ederwander
Ups, sekarang ingat bahwa saya harus menerapkan Re-Sampling untuk menyelesaikan rentang waktu, sehingga nada aslinya tidak diubah. Sepertinya Bernsee telah membuat beberapa perubahan pada kodenya sejak versi tertaut di GitHub. Kode terbarunya untuk tersedia untuk diunduh dari situs webnya - ini dapat meningkatkan rentang pergeseran dari spesifikasi aslinya. Saya mengubah kode aslinya sehingga saya bisa menaikkan 8x.
James Paul Millard
tidak ada perbedaan antara kode Anda dan halaman Bernsee, matematika utamanya masih sama, perbedaan kuat yang bisa saya lihat adalah ukuran window = 8192pada kode dari halaman unduh, jadi Anda harus melakukan 4x poin lebih banyak untuk memproses , Saya kembali untuk mengatakan bahwa dengan ukuran setengah jendela 8192/2=4096Anda 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.
ederwander
Meskipun saya memberikan tautan GitHub ke BatPhone, itu BUKAN kode saya. Saya baru saja menariknya dari pencarian Internet untuk memberikan tampilan smbPitchShift (). Kode saya banyak dimodifikasi dari versi Bernsee, dan tinggal di file ini: github.com/CreativeDetectors/PitchScope_Player/blob/master/Src/…
James Paul Millard
Ya sekarang saya bisa melihat, itu benar-benar sebuah contoh ulang, Anda mungkin tertarik untuk melihat / mendengar fase vocoder saya beraksi.
ederwander