Riformattazione dei dati audio del motore audio di basso livello: conversione della frequenza di campionamento e della profondità di bit
Prima di tutto, sembra che ci sia un numero scarso di tutorial di programmazione audio di basso livello là fuori, quindi se qualcuno conosce alcune buone risorse sarei molto grato. Ora passiamo all'argomento in questione!
Sto usando WASAPI per il motore audio che sto cercando di sviluppare e ho difficoltà a riformattare i dati del file audio letto in un formato che il dispositivo audio è pronto a ricevere. In particolare, mi chiedo come convertire al volo la frequenza di campionamento e la profondità di bit di un file audio letto nel formato richiesto del dispositivo. Ho visto un esempio in cui è stata utilizzata l'interpolazione lineare, ma ho letto altrove che un tale filtro introduce troppi artefatti come l'aliasing, quindi ancora una volta mi chiedo quali algoritmi pratici sarebbero per riformattare i dati audio in un'applicazione in tempo reale.
Risposte
L'interpolazione Sinc non introduce artefatti di aliasing per i dati originariamente limitati in banda corretta prima del campionamento. (Ma deve essere leggermente modificato, poiché un kernel Sinc o Dirichlet ha una durata infinita.)
Un riferimento canonico sul perché la ricostruzione funziona e su come interpolare è qui: https://ccrma.stanford.edu/~jos/resample/
Ho una semplice implementazione in Basic qui: http://www.nicholson.com/rhn/dsp.html#3
L'altro metodo comune è l'upsampling del rapporto intero filtrato passa-basso seguito dal downsampling del rapporto intero filtrato passa-basso mediante i due rapporti appropriati. Un altro metodo comune è generare un banco di filtri FIR polinomiali (di più fasi di kernel di interpolazione Sinc con finestra (o filtri FIR altrimenti ottimizzati). Un altro metodo comune è utilizzare interpolatori polinomiali di ciascuna delle gobbe del kernel Sinc, risultando in un banco di filtri di Farrow .
Devi portare abbastanza bit di valori intermedi aritmetici per mantenere il tuo rumore di fondo di quantizzazione al di sotto di qualunque sia la tua specifica.