Devi conoscere i requisiti numerici del tuo algoritmo e scegliere la precisione di conseguenza.
Quindi facciamo i calcoli qui: un punto mobile a 32 bit ha una mantissa a 24 bit e un esponente a 8 bit. Ciò fornisce un rapporto segnale / rumore di circa 150 dB su un intervallo dinamico di circa 1540 dB. Questo è molto per la maggior parte delle cose audio. La doppia precisione ti dà circa il doppio.
Ogni algoritmo ha determinati requisiti per la precisione numerica. Se progettato correttamente tutti gli algoritmi audio che conosco fanno bene con il virgola mobile a 32 bit. "correttamente progettato" è la parola chiave qui. Ad esempio, un passaggio di banda del 6 ° ordine da 40-200 Hz campionato a 44,1 kHz implementato come filtro bi-quad IIR II direttamente presenterà alcuni problemi di rumore a 32 bit. Tuttavia funziona perfettamente come filtro trasposto forma II o forma diretta I.
Se si tenta di espandere parzialmente la frazione dello stesso filtro passa banda utilizzando, ad esempio, la funzione residuez () di Matlab, si otterranno risultati negativi anche con doppia precisione. Ancora una volta i requisiti numerici dell'algoritmo per quei dati di input specifici superano ciò che la doppia precisione ha da offrire. La chiave per risolvere questo problema non è di accecare ciecamente la precisione, ma di utilizzare invece un algoritmo migliore.
Infine diamo un'occhiata a ciò che rende vulnerabile il floating (32 bit o 64 bit): hai un'enorme gamma dinamica, ovvero puoi ridimensionare il segnale di 200 dB, amplificare di 500 dB, ridurlo di nuovo di 300 dB e finire esattamente dove hai iniziato senza alcuna perdita di precisione. Quindi non è così. La virgola mobile ha difficoltà ad aggiungere numeri di dimensioni molto diverse. C'è un punto in cui l'aggiunta di un piccolo numero non fa alcuna differenza, ovvero ottieni 1 + dx = 1. Questo numero "dx" è circa 1,2e-7 per virgola mobile a 32 bit e 2,2e-16 per 64 bit. Se l'algoritmo include l'aggiunta o la sottrazione di numeri così distanti tra loro in grandezza, potresti riscontrare problemi.
Un buon esempio di ciò è il filtro Direct Form II menzionato in precedenza: il filtro From II diretto (vedere ad esempio https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html ) fondamentalmente calcola le variabili di stato filtrando l'input con prima la funzione di trasferimento solo su palo e poi filtrando con gli zeri per creare l'output. Ora se i poli sono vicini al cerchio dell'unità, la funzione di trasferimento solo polo diventa molto, molto grande. Quindi la variabile di stato può essere molto più grande dell'input (da 80 dB a 100 dB più grande) e sommare le variabili di stato con l'input crea molto rumore.
La soluzione qui è quella di passare a un filtro di forma II o diretto di forma I trasposto. L'analisi mostra che le variabili di stato non possono essere più grandi di input / output quindi forse 12dB o giù di lì, quindi la mancata corrispondenza dell'entità del problema non si verifica in primo luogo.