Saat mensintesis dan memproses audio pada prosesor modern, kapan orang akan mempertimbangkan untuk menggunakan sesuatu selain floating point dengan presisi tunggal (32 bit)? Jelas, audio yang masuk dan keluar ke dunia nyata adalah 16/24 bit, jadi saya hanya berbicara tentang ketepatan sinyal (baik audio itu sendiri dan hal-hal seperti koefisien filter) dalam perangkat lunak.
Asumsikan bahwa:
- CPU / DSP memiliki dukungan floating point perangkat keras untuk presisi tunggal dan ganda
- Prioritasnya adalah kualitas audio, bukan kinerja tinggi. Sebagai contoh, presisi ganda akan dipertimbangkan jika menawarkan kualitas yang lebih baik (persepsi).
sumber
Itu benar-benar tergantung pada jenis dukungan apa yang Anda bicarakan. Pada x86, saat menggunakan instruksi floating point gaya x87, Anda mendapatkan presisi internal 80-bit penuh dan waktu pemrosesan yang sama - apakah Anda bekerja dengan presisi tunggal atau ganda.
Tetapi ketika menggunakan instruksi SIMD, Anda bisa menyelesaikan pekerjaan dua kali lebih banyak menggunakan float 32-bit daripada float 64-bit. Itu masalah besar.
Satu hal yang perlu dipertimbangkan adalah memori - menggunakan pembagian presisi ganda dengan dua jumlah data yang sesuai dengan tingkat memori cache tercepat.
Ini akan mengarah pada jenis sintesis dan pemrosesan yang Anda lakukan. Jika itu melibatkan filter IIR (atau lebih umum apa pun dengan variabel keadaan dan / atau umpan balik), Anda dapat lebih mudah menembak diri sendiri (ketidakstabilan atau ketidaktepatan cutoff rendah karena pemotongan koefisien) dengan 32-bit, jika Anda tidak pikirkan terlalu banyak tentang apa yang Anda lakukan. Beberapa topologi filter berfungsi sempurna dengan 32-bit.
Bagaimanapun, ini adalah masalah ketepatan numerik - dalam hal kualitas, tidak akan ada perbedaan persepsi. Perlu diingat bahwa sangat konyol untuk mengharapkan rantai audio perangkat keras memiliki lebih dari 20 bit presisi (dengan anggapan dewan dirutekan tanpa cela dan semua bagiannya ideal, kami masih menjalankan batas kebisingan Johnson!) - dan presisi ini sebagian besar ditutupi oleh pelampung presisi tunggal. Jalur sinyal pada meja pencampur kelas atas memiliki 50-an op-amp, yang secara individual memiliki beberapa urutan distorsi lebih besar daripada kebisingan kuantisasi operasi aritmatika pada pelampung presisi tunggal.
sumber
Anda perlu mengetahui persyaratan numerik dari algoritma Anda dan memilih presisi yang sesuai.
Jadi mari kita lakukan perhitungannya di sini: Titik apung 32-bit memiliki mantissa 24 bit dan eksponen 8 bit. Ini memberi Anda sekitar 150 dB rasio sinyal terhadap noise pada rentang dinamis sekitar 1540 dB. Itu banyak untuk kebanyakan hal audio. Presisi ganda memberi Anda kira-kira dua kali lipat.
Setiap algoritma memiliki persyaratan tertentu untuk ketepatan numerik. Jika dirancang dengan baik semua algoritma audio yang saya tahu baik-baik saja dengan floating point 32-bit. "dirancang dengan baik" adalah kata kunci di sini. Sebagai contoh, pass band urutan ke-6 dari 40-200 Hz sampel pada 44.1kHz diimplementasikan sebagai langsung dari II IIR filter bi-quad memang akan memiliki beberapa masalah kebisingan pada 32-bit. Namun itu berfungsi dengan baik sebagai transpos bentuk II atau filter bentuk I langsung.
Jika Anda mencoba ekspansi fraksi parsial dari filter pass band yang sama menggunakan misalnya fungsi residuez () Matlab, Anda akan mendapatkan hasil yang buruk bahkan dengan presisi ganda. Sekali lagi persyaratan numerik dari algoritma untuk data input spesifik tersebut melebihi apa yang ditawarkan presisi ganda. Kunci untuk memperbaiki ini bukan untuk membabi buta ketepatan, tetapi untuk menggunakan algoritma yang lebih baik sebagai gantinya.
Akhirnya mari kita lihat apa yang membuat mengambang (32 bit atau 64 bit) rentan: Anda memiliki rentang dinamis yang sangat besar, yaitu Anda dapat menurunkan sinyal dengan 200dB, memperkuat dengan 500dB, mengurangi lagi dengan 300dB dan Anda berakhir tepat di mana Anda mulai dengan hampir tidak ada kerugian dalam presisi apa pun. Jadi bukan itu. Floating point memiliki kesulitan menambahkan angka yang sangat berbeda ukurannya. Ada titik di mana menambahkan angka kecil tidak membuat perbedaan, yaitu Anda mendapatkan 1 + dx = 1. Angka "dx" ini sekitar 1.2e-7 untuk titik apung 32-bit dan 2.2e-16 untuk 64 bit. Jika algoritme Anda menyertakan penambahan atau pengurangan angka yang terlalu jauh besarnya, Anda mungkin mengalami masalah.
Contoh yang bagus untuk ini adalah filter Direct Form II yang disebutkan sebelumnya: Filter direct From II (lihat misalnya https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html ) pada dasarnya menghitung variabel status dengan memfilter input dengan fungsi transfer hanya kutub pertama dan kemudian menyaring dengan nol untuk membuat output. Sekarang jika kutub dekat dengan lingkaran unit, fungsi transfer hanya kutub menjadi sangat, sangat besar. Jadi variabel keadaan bisa jauh lebih besar dari input (80dB hingga 100dB lebih besar) dan menjumlahkan variabel keadaan dengan input menciptakan banyak suara.
Solusinya di sini adalah pergi ke bentuk II yang dialihkan atau filter Formulir I langsung. Analisis menunjukkan bahwa variabel keadaan tidak boleh lebih besar dari input / output maka mungkin 12dB atau sekitar itu, jadi masalah besarnya ketidakcocokan tidak terjadi di tempat pertama.
sumber
Ada dua manfaat untuk mendapatkan presisi ganda relatif terhadap presisi tunggal: peningkatan jangkauan dan resolusi yang lebih baik. Saya akan sangat terkejut jika rentang peningkatan akan membuat perbedaan dalam aplikasi Anda. Jika ya, mungkin ada yang salah dengan penskalaan Anda.
Jika ada perbaikan, itu akan menjadi resolusi. Resolusi yang lebih baik berarti lebih sedikit noise kuantisasi . Namun, kecuali derau kuantisasi mendekati tingkat yang sama dengan semua sumber derau lainnya, mungkin derau itu tidak akan membuat perbedaan. Anda dapat melakukan beberapa analisis tingkat kebisingan dan sinyal untuk mendapatkan gambaran tentang seberapa banyak gangguan berasal dari kesalahan kuantisasi, tetapi Anda tidak akan benar-benar tahu pasti apakah itu akan membuat perbedaan atau tidak sampai Anda menerapkannya dengan keduanya dan lihat apakah ada bedanya.
sumber
Jika Anda bekerja dengan audio yang disintesis yang mengalami banyak pemrosesan antara generasi dan rendering (konversi ke 16/24 bit integer), maka Anda akan mendapat manfaat dari bekerja dalam ketepatan numerik terbaik yang dimiliki mesin Anda.
Penting juga untuk membuat perbedaan mendasar antara bilangan bulat dan angka floating point. Titik mengambang presisi ganda (64bit) berbeda dari integer 64bit, dan Anda bahkan dapat bekerja dengan integer presisi sewenang-wenang dalam perangkat lunak, tergantung pada alat perangkat lunak yang Anda gunakan. Itu akan menjadi penting jika Anda harus merekam suara daripada membuatnya (sejauh yang saya tahu, konversi AD selalu menyimpan suara sampel dalam format integer).
Saya tidak bisa benar-benar yakin tentang itu, tetapi jika Anda menghasilkan suara Anda sudah di floating point, artefak yang lebih umum kemungkinan besar tidak akan hadir dengan definisi, dan Anda dapat memprosesnya dengan lebih banyak "kualitas audio". Mungkin Anda bahkan dapat menghasilkan sampel suara SETELAH Anda sudah menerapkan beberapa efek ke generator itu sendiri. Satu-satunya saat ketika Anda benar-benar akan memperkenalkan artefak potensial adalah ketika Anda mengonversinya untuk output dalam beberapa format file integer, seperti .WAV misalnya.
Sebenarnya, karena sebagian besar mesin memiliki presisi "ganda" (64bit) asli saat ini, saya tidak melihat alasan untuk bekerja dengan 32bits lagi ...
Semoga itu bisa membantu!
sumber