Background:
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 agregué a un filtro FIR, mayor será el retardo 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 nos causará una distorsión que se puede escuchar, lo que limita 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ía a la salida).
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 necesito 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: (Generalizado 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 tiempo ADC
ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 1, ADC_SampleTime_1Cycles5);
Configuración de tiempo 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!