FFT sin pérdidas en datos de audio

Tengo una aplicación en la que recibiré una transmisión de audio, como si usara auriculares, en mi procesador. Me gustaría ejecutar FFT y varios algoritmos DSP en el audio muestreado y luego escupir el audio como si el dispositivo no estuviera allí. Básicamente haciendo DSP en tiempo real entre muestras, supongo. El procesador que estoy usando es el MKL26Z128xxx4, montado en la placa de desarrollo FRDM-KL26Z. Tiene un solo núcleo ARM Cortex M0+ y está programado en C/C++ y puede usar el conjunto de instrucciones de ensamblaje THUMB.

¿Cómo haría esto sin perder nada del audio transmitido?

Te resultaría más fácil con un Cortex M4, que puede multiplicar y sumar un tic de reloj
¡Gracias! En este momento, esto está solo en el proceso de desarrollo, así que supongo que no tenía eso en este momento.
Respondería recomendando el STM32F4 Discovery, por $15 y casi sin cambios en su cadena de herramientas. No dices qué DSP quieres hacer, pero será más fácil en un DSP que en un M0
Hmm, ok. Principalmente quiero lograr una FFT, idealmente en tantas muestras como sea posible sin pérdida de integridad de datos. Supongo que estoy más preocupado por el concepto de hacer esto en un controlador de un solo núcleo. Multicore es simple ya que solo obtiene datos, los copia en otro núcleo y retrasa su salida mientras el otro núcleo realiza los algoritmos de procesamiento.
¿La señal de audio es cruda o preprocesada?
La señal de audio es cruda. Señales analógicas directas
@Shannon Strutz I would like to run FFT and various DSP algorithms on the sampled audio and then spit the audio back out as if the device wasn't there.Esto es imposible. La señal muestreada debe cuantificarse y esto introducirá una pérdida irrecuperable. El ADC es de 16 bits, lo que debería ser suficiente para un audio de buen sonido, pero está lejos de ser sin pérdidas. Además, el DAC es de 12 bits, por lo que introducirá aún más distorsión en la salida. El DAC de 12 bits es suficiente para un audio que suena bien, pero está lejos del nivel "como si el dispositivo no estuviera allí".

Respuestas (3)

FFT necesita muestrear al menos el doble de la frecuencia de su señal y no debería introducir ninguna pérdida. La pérdida se introduce en la compresión o codificación. Su entrada y salida deben poder coincidir con la frecuencia, la amplitud y las frecuencias de la señal que está muestreando.

Su mayor desafío es procesar los algoritmos DSP en tiempo real, lo que depende de los algoritmos que use, cuántos y cómo su procesador puede seguirlos, con un retraso mínimo. Como fracciones de segundo, para estar sincronizado con cualquier otra cosa (video, otro audio o instrumentos en vivo).

Debe hacer algunos cálculos sobre lo que necesita, a través de pruebas, antes de poder averiguar si su plataforma es lo suficientemente buena, o dónde necesita repensar o recortar.

¡Gracias! ¿Crees que podrías indicarme la dirección correcta para esos cálculos? No estoy seguro de cuáles necesitaría completar.
Intente hacer una demostración de su procesamiento sin conexión primero, usando Matlab o una de las alternativas gratuitas. Luego calcule cuánta energía necesita para hacer lo mismo en tiempo real.

Desafortunadamente, tendrá que aceptar pérdidas en su señal si intenta reconstruirlas a partir de las muestras. A menos que haga ciertas suposiciones sólidas sobre la señal de audio, el teorema de muestreo de Nyquist-Shannon no ayuda. Una señal de audio sin procesar general no satisfará estas condiciones.

Si lo tomas k muestras a razón de 1 2 B a partir de 1 / 2 B dónde B es el ancho de banda entonces las funciones

pecado ( 2 π t B ) 2 t B
y
pecado ( 2 π t B 2 ( k + 1 ) π ) 2 t B 2 ( k + 1 )

son indistinguibles unos de otros usando solo las muestras tomadas a veces 1 2 B , 2 2 B , . . . , k 2 B ya que ambas funciones se evalúan a cero en estos puntos. La reproducción exacta de una señal del teorema de muestreo de Nyquist-Shannon asume un número infinito de puntos de muestra.

Las cosas empeoran un poco una vez que se involucra FFT. FFT reproduce la señal como una suma finita mediante el uso de un conjunto finito de frecuencias determinadas por su frecuencia de muestreo. Si tiene una señal de audio sin procesar, tiene un conjunto posiblemente infinito de frecuencias que se reciben a pesar de estar limitado por B .

En un lenguaje más matemáticamente correcto, el espacio de funciones con ancho de banda B es un espacio vectorial de dimensión infinita. Una vez que fija una frecuencia de muestreo, el espacio vectorial de funciones construido a través de FFT es de dimensión finita y, por lo tanto, no todas las señales se pueden recuperar exactamente a través de FFT.

Cualquier muestreo digital implica filtrado de paso bajo (y/o aliasing potencial) y cuantificación. Cualquier ADC o DAC en la ruta agregará demora, tanto debido al almacenamiento en búfer, al procesamiento potencial (filtrado de ruido o aproximación sucesiva), como a las constantes de tiempo físicas y eléctricas. Por lo tanto, tendrá que especificar algunos umbrales finitos en ancho de banda, piso de ruido y retardo, como iguales a sus criterios de "sin pérdida", o tendrá la imposibilidad de usar cualquier chip de procesador.

Si realiza o no una FFT para el análisis es irrelevante si omite la transmisión de datos directamente a la salida y los envía a la FFT.

Una FFT es un proceso basado en bloques, por lo que no se realiza "entre muestras", sino en bloques completos, búferes o conjuntos de muestras, lo que agrega latencia a cualquier análisis FFT (por ejemplo, esperar a que se llene un búfer lo suficientemente grande antes de comenzar) .

Se debe realizar una FFT de longitud N utilizando la aritmética del procesador (registros de acumulación) que sea al menos log2(N) bits mayor que el tamaño de bits de sus muestras, o la propia FFT introducirá (adicionales) errores de truncamiento, redondeo o recorte.