Reformateo de datos de audio del motor de audio de bajo nivel: conversión de frecuencia de muestreo y profundidad de bits
En primer lugar, parece que hay una escasa cantidad de tutoriales de programación de audio de bajo nivel, así que si alguien conoce algunos buenos recursos, lo agradecería mucho. ¡Ahora pasemos al tema que nos ocupa!
Estoy usando WASAPI para el motor de audio que estoy tratando de desarrollar y tengo dificultades para reformatear los datos de archivos de audio leídos en un formato que el dispositivo de audio esté preparado para recibir. Específicamente, me pregunto cómo convertir sobre la marcha la frecuencia de muestreo y la profundidad de bits de un archivo de audio leído en el formato solicitado del dispositivo. Vi un ejemplo en el que se usó la interpolación lineal, pero leí en otra parte que dicho filtro introduce demasiados artefactos como el aliasing, por lo que nuevamente me pregunto qué algoritmos prácticos serían para reformatear los datos de audio en una aplicación en tiempo real.
Respuestas
La interpolación Sinc no introduce artefactos de alias en los datos que originalmente estaban correctamente limitados en banda antes del muestreo. (Pero debe modificarse ligeramente, ya que un kernel Sinc o Dirichlet tiene una duración infinita).
Una referencia canónica sobre por qué funciona la reconstrucción y cómo interpolar está aquí: https://ccrma.stanford.edu/~jos/resample/
Tengo una implementación simple en Basic aquí: http://www.nicholson.com/rhn/dsp.html#3
El otro método común es el muestreo ascendente de la proporción de enteros filtrados de paso bajo seguido de la reducción de la proporción de enteros filtrados de paso bajo mediante las dos proporciones apropiadas. Otro método común es generar un banco de filtros FIR polifásico (de múltiples fases de núcleos de interpolación Sinc en ventana (o filtros FIR optimizados) .Otro método común es usar interpoladores polinomiales de cada una de las jorobas del núcleo Sinc, lo que da como resultado un banco de filtros Farrow .
Debe llevar suficientes bits de valores intermedios aritméticos para mantener el piso de ruido de cuantificación por debajo de cualquiera que sea su especificación.