Quando considerare il doppio punto (64 bit) in virgola mobile per l'audio


12

Quando si sintetizzano ed elaborano l'audio su processori moderni, quando si potrebbe considerare di utilizzare qualcosa di diverso dal punto mobile a precisione singola (32 bit)? Ovviamente, l'audio che entra e esce nel mondo reale è 16/24 bit, quindi sto solo parlando della precisione dei segnali (sia l'audio stesso che cose come i coefficienti di filtro) nel software.

Supponiamo che:

  • la CPU / DSP ha un supporto hardware in virgola mobile per precisione singola e doppia
  • La priorità è l'audio di qualità, non le prestazioni elevate. Ad esempio, la doppia precisione verrebbe presa in considerazione se offrisse una migliore qualità (percettiva).

Risposte:


9

I single float IEEE forniscono solo circa 24 bit di mantissa. Ma molti algoritmi DSP / filtraggio (biquad IIR con poli / zeri vicino al cerchio unitario, ecc.) Richiedono molto più di 24 bit di mantissa per prodotti computazionali intermedi (accumulatori, ecc.), Solo per ottenere risultati finali precisi a quasi 16 o 24 bit. Per questi tipi di algoritmi, gli accumulatori interi con scala a 32, 40 e 48 bit venivano spesso utilizzati con DSP che non avevano FPU.

Ma su molte implementazioni di processori attuali (per PC, smartphone, ecc.), La FPU a doppia precisione è molto più veloce rispetto al tentativo di utilizzare numeri interi scalati a 32 o 64 bit quando l'algoritmo deve avere più di 24 bit di prodotto intermedio.

Per impedire il cestino della cache dei dati, i dati grezzi possono essere in formato intero intero o float a precisione singola, mentre solo il kernel computazionale più locale potrebbe utilizzare un formato a risoluzione più elevata. Ma se si condividono risultati di calcolo intermedi tra i moduli DSP, il protocollo di interscambio tra i moduli può anche trarre vantaggio da un bus o un formato dati a risoluzione più elevata (più di 24 bit mantissa).


Questo è il tipo di informazioni che stavo cercando. Accetterò questa risposta se potessi gentilmente fornire un esempio concreto di un caso in cui è richiesta la doppia precisione per far funzionare un filtro, cioè suonerà male (o almeno abbastanza ordinario) con una precisione singola, ma liscio come il burro con doppia precisione.
user1849104

Inoltre, cosa intendi esattamente con il cestino della cache? Vuoi dire che avere il doppio dei dati che lo attraversano renderà le cose orribilmente lente?
user1849104

È stato fornito un esempio, IIR con poli / zeri vicino al cerchio unitario. Se esiste una cache, algoritmi e set di dati funzionanti che si adattano a questa cache possono essere significativamente più veloci di quelli che non lo fanno.
hotpaw2,

9

la CPU / DSP ha un supporto hardware in virgola mobile per precisione singola e doppia.

Dipende davvero dal tipo di supporto di cui stai parlando. Su x86, quando si utilizzano le istruzioni in virgola mobile in stile x87, si ottiene la precisione interna completa a 80 bit e lo stesso tempo di elaborazione, sia che si lavori con precisione singola o doppia.

Ma quando si utilizzano le istruzioni SIMD, è possibile svolgere il doppio del lavoro utilizzando i float a 32 bit rispetto ai float a 64 bit. Questo è un grosso problema.

Un'altra cosa da tenere in considerazione è la memoria: l'utilizzo della doppia precisione divide per due la quantità di dati che si adatta ai livelli più veloci di memoria cache.

Quando si sintetizzano ed elaborano l'audio su processori moderni,

Scenderà a che tipo di sintesi ed elaborazione fai. Se coinvolge filtri IIR (o più in generale qualsiasi cosa con variabili di stato e / o feedback), puoi spararti più facilmente nel piede (instabilità o imprecisioni a basso taglio dovute al troncamento del coefficiente) con 32 bit, se non lo fai pensa troppo a quello che stai facendo. Alcune topologie di filtri funzionano perfettamente con 32 bit.

In ogni caso, si tratta di un problema di precisione numerica: in termini di qualità, non ci sarà alcuna differenza percettiva. Tieni presente che è abbastanza ridicolo aspettarsi che una catena audio hardware abbia più di 20 bit di precisione (supponendo che la scheda sia instradata in modo impeccabile e tutte le parti siano ideali, stiamo ancora correndo al limite del rumore Johnson!) - e questa precisione è ampiamente coperta da galleggianti a precisione singola. Il percorso del segnale su un banco di missaggio di fascia alta ha 50 anni di amplificatori operazionali, che singolarmente hanno diversi ordini di grandezza più distorsione rispetto al rumore di quantizzazione delle operazioni aritmetiche su galleggianti a precisione singola.


Sarebbe sicuro dire che l'uso della precisione singola con le istruzioni SIMD ti darà sempre circa il doppio delle prestazioni rispetto alla doppia precisione?
user1849104

Dal momento che non posso più modificare il commento precedente: non ho mai avuto l'opportunità di utilizzare (direttamente) alcun set di istruzioni SIMD. È possibile utilizzare semplicemente la precisione singola e ottenere il doppio delle prestazioni? O la realtà si mette in mezzo?
user1849104

6

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.


2

La doppia precisione offre due vantaggi rispetto alla precisione singola: maggiore portata e migliore risoluzione. Sarei molto sorpreso se la gamma estesa facesse la differenza nella tua applicazione. In tal caso, probabilmente c'è qualcosa che non va nel tuo ridimensionamento.

Se ci fosse un miglioramento sarebbe nella risoluzione. Una migliore risoluzione significa meno rumore di quantizzazione . A meno che il rumore di quantizzazione non sia vicino allo stesso livello di tutte le altre fonti di rumore, probabilmente non farà alcuna differenza. Puoi fare alcune analisi dei tuoi livelli di rumore e segnale per avere un'idea di quanto rumore provenga dall'errore di quantizzazione, ma non saprai con certezza se farà la differenza o meno finché non lo implementerai con entrambi e vedere se fa la differenza.


2

Se lavori con audio sintetizzato che subisce molta elaborazione tra generazione e rendering (conversione in numero intero a 16/24 bit), trarrai vantaggio dal lavorare con la massima precisione numerica della tua macchina.

È anche importante fare una distinzione fondamentale tra numeri interi e numeri in virgola mobile. Un virgola mobile a doppia precisione (64 bit) è diverso da un intero a 64 bit e puoi persino lavorare con interi di precisione arbitraria nel software, a seconda degli strumenti software che usi. Sarebbe importante se dovessi registrare suoni invece di generarli (per quanto ne so, la conversione AD salva sempre i suoni campionati in formato intero).

Non posso esserne del tutto sicuro, ma se generi il tuo suono già in virgola mobile, molto probabilmente gli artefatti più comuni non saranno presenti per definizione e puoi elaborarlo con molta più "qualità audio". Forse puoi anche generare i campioni sonori solo DOPO che hai già applicato alcuni effetti al generatore stesso. L'unico momento in cui introducerai effettivamente qualsiasi potenziale artefatto è quando lo converti per l'output in un formato di file intero, come ad esempio .WAV.

In realtà, dal momento che la maggior parte delle macchine ha una precisione "doppia" (64 bit) nativa al giorno d'oggi, non vedo più un motivo per lavorare con 32 bit ...

Spero possa aiutare!


3
"Non vedo più un motivo per lavorare con 32 bit ..." a meno che tu non usi SIMD!
Pichenettes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.