Entrada / salida desde ADC / DAC no sincronizados

0
  

RENUNCIA : esta pregunta está relacionada de alguna manera con esta otra pregunta mía , pero esta última no tuvo ninguna satisfacción   respuesta.

Estoy trabajando en un proyecto de audio DSP con el STM32F4xx, utilizando 4 entradas de audio y 1 salida de audio .

necesito  - lee cada entrada  - Procesar la señal de cada entrada,  - mezclar las señales procesadas juntas  - salida el resultado.

La entrada se obtiene a través de uno de los 3 DAC internos del STM32, 1 canal para cada entrada (es decir, 4 canales para escanear en total) y almacenados en un búfer utilizando DMA .

La salida se convierte a través de un códec utilizando un bus I2S, a 48 kHz.

Cada vez que el códec ha terminado de convertir un búfer (o más precisamente un medio búfer), activa una función de devolución de llamada en la que actualmente tengo todo el código DSP. En el bucle, las muestras de salida se calculan y se envían al medio búfer para que se envíen utilizando DMA a I2S.

Concedido que muestro mi entrada a la misma frecuencia que mi salida (48 kHz, lo que significa que mi DAC debe estar sincronizado a 4 * 48 kHz = 192 kHz), ¿cómo puedo sincronizar el ADC y la conversión del DAC? ?

He pensado en un FIFO entre la entrada y la rutina DSP, seleccionando una muestra en la cola cada vez que necesito procesar una. Pero no estoy seguro de cómo hacerlo cuando se trabaja con fragmentos de datos (un búfer tiene una profundidad de 64 muestras).

Otra solución sería tener una profundidad de búfer de entrada de solo 1 muestra, y leer esta muestra en la rutina DSP, pero no estoy seguro de que esto funcione.

¿Alguien sabe cuál es la mejor manera de hacerlo? O incluso mejor, ¿cómo sincronizar el ADC del STM32 con un códec externo?

EDIT : También pensé en usar el DAC en modo "un disparo", es decir, activar una conversión de 64 muestras para todos los canales cada vez que mi códec sube su "I Quiero muestras "bandera. ¿Funcionaría?

EDIT2 : a solicitud de @Neil_UK, aquí hay un diagrama ilustrativo de lo que está sucediendo:

4entradasestánsiendomuestreadasporelADCinternodelSTM32.Cadaunodebetenerunafrecuenciademuestreode48kHz,porloque,dadoquelaconversióndeloscanalesADCnoserealizaenparalelo,esonosdaunafrecuenciadeexploracióntotalde192kHz(corríjamesimeequivoco).

Luego,lasmuestrasconvertidasdecadaentradasealmacenanenunbúfercircularde64muestrascadaunayselevantaunindicadordeinterrupcióncadavezquesellenaunmediobúfer(esdecir,sehanalmacenado32*4muestras).

EnelotroladohayuncódecqueconviertecontinuamentelasmuestrasqueseleenvíanatravésdeI2S,desdeelDMAdelSTM32.TambiénsedesencadenaunainterrupcióncadavezquesevacíalamitaddelbúferI2S.Entrelos2hayunarutinaDSPquesesuponequeleelaentrada,lafiltraylacolocaenelbúferdesalida.

Elproblema:tengo2interrupciones:

  • El"Ya terminé de convertir" generado por el códec (DAC);
  • El "He terminado de convertir" generado por el ADC interno.

Si escaneo a 192 kHz, estas interrupciones deberían estar al menos sincronizadas (a excepción de algunas fluctuaciones), pero la fase puede ser completamente diferente. Eso significa que puedo tener mi DAC notándome que todas las muestras se envían mientras mi ADC todavía está en medio de convertir las entradas. Y esta diferencia de fase puede ser potencialmente diferente cada vez que reinicio el tablero, por lo que realmente no puedo compensarlo con un desplazamiento.

EDIT3 : Parece que el módulo SAI es una buena manera de hacerlo, si alguien tiene experiencia con SAI, me encantaría tener algunos consejos y ayuda sobre cómo utilizarlo para conectar la DAC interna con un códec externo

    
pregunta Florent

1 respuesta

0

No hay una buena manera de hacerlo a través del ADC / DAC integrado. Tendría que desencadenar la conversión de DAC en la interrupción de ADC, pero no podría obtener las tasas establecidas correctamente al usar DMA, por lo que tendría que ir muestra por muestra. Hay muchos gastos generales y, aunque podría funcionar, no te dejaría con una gran cantidad de CPU para el DSP.

La mejor solución es utilizar la interfaz I2S o SAI con un códec de audio dedicado. Puede usar dos códecs u obtener un códec que tenga capacidad de entrada y salida.

    
respondido por el Kamil Kisiel

Lea otras preguntas en las etiquetas