Anticipando el retraso en el procesamiento en sistemas embebidos

Fondo:

He estado trabajando con la placa de descubrimiento STM32F3 y estoy tratando de implementar algunos algoritmos de procesamiento de señales desde cero. Mi problema se muestra a continuación en el gráfico. Cuantos más toques agregue a un filtro FIR, mayor será el retraso entre la señal de entrada y la señal de salida DAC. Para las señales de audio que estoy usando, un retraso de más de 40 us causará una distorsión que se puede escuchar, lo que limitará mis capacidades de filtrado. También dificulta el diseño del filtro porque la frecuencia de muestreo está limitada por el tiempo de cálculo (la siguiente entrada no se puede procesar hasta que la anterior se envíe a la salida).

Una prueba rápida del tiempo de retardo entre una señal de entrada y la salida uC DAC

Preguntas:

¿Hay estructuras de hardware o software que debería utilizar para mejorar el rendimiento?

Si no puedo mejorar el rendimiento, ¿debo diseñar mi filtro con una frecuencia de muestreo que tenga en cuenta la cantidad de operaciones que debo realizar entre muestras y el tiempo de operación de la hoja de datos?

No he probado las bibliotecas CMSIS porque quería tener una mejor idea de los algoritmos reales, pero ¿estas bibliotecas mejorarían el rendimiento?

Fragmentos de código: (Generalizados para filtros IIR)

while (1)
{
    dreadADC();
    FilteredValue=filter(ADC1ConvertedValue);
    DAC_SetChannel2Data(DAC_Align_12b_R, FilteredValue);
}
uint16_t filter(__IO uint16_t nValue)
{

    for(i=(Taps-1);i>0;i--)
    {
        x[i]=x[i-1];
        y[i]=y[i-1];
    }
    x[0]=nValue;
    y[0]=0;
    for(j=1;j<Taps;j++)
    {
         y[0]= y[0]+(b[j]*x[j])-(a[j]*y[j]);
    }
    y[0]=y[0]+(b[0]*x[0]);
    return y[0]+1024;
}

Configuración de temporización ADC

ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 1, ADC_SampleTime_1Cycles5);

Configuración de temporización DAC

TIM_TimeBaseStructure.TIM_Period = 2-1 ;          
TIM_TimeBaseStructure.TIM_Prescaler = 1-1;       
TIM_TimeBaseStructure.TIM_ClockDivision = 1-1; 

Gracias por su tiempo y agradecería cualquier orientación!

Su requisito de menos de 40 us de retraso es bastante sospechoso para el "audio", y será inalcanzable (teoría, independientemente de la implementación) para todos los filtrados, excepto los más triviales.
Establecí 40us como umbral para una frecuencia de muestreo de 25KHz, que es el rango superior de la audición humana. Idealmente, me gustaría tener más de un punto de muestra por período aquí también para la reconstrucción de la señal. Pensé que el STM32F3 que funciona con un reloj de 72 MHz estaría a la altura. Si esto es inalcanzable, ¿cómo se implementaría un filtro digital para señales de alta frecuencia?
El problema es teórico: independientemente de la velocidad de cómputo, cualquier filtro de tiempo discreto útil tiene un retraso de múltiples períodos de muestra a medida que aparecen versiones retrasadas de la señal en la expresión del filtro (explícitamente para un FIR, implícitamente y, por lo general, también explícitamente para un IIR). Solo si puede retrasar de manera comparable cualquier otro camino con el que mida el retraso en relación, puede lograr menos.
Lo que digo es que si bien su cálculo debe mantenerse al día con su velocidad de datos, la mayor parte de su retraso (múltiples períodos de muestra) proviene de esperar las muestras de entrada necesarias para calcular una salida (más cualquier canalización que pueda usar).

Respuestas (1)

Encuentre una biblioteca que implemente filtros FIR en ensamblaje. Estoy 100% seguro de que existe una biblioteca DSP para STM32.

Alternativamente, escriba su propio código que use funciones avanzadas en el núcleo.

Eso podría mejorar la velocidad de cálculo, pero aún así no permitiría el diseño de filtros anticausales. Hay un retraso promedio mínimo en las muestras para un filtro determinado, independientemente de cómo implemente el cálculo.