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.