Hintergrund:
Ich habe mit dem STM32F3 Discovery Board gearbeitet und versuche, einige Signalverarbeitungsalgorithmen von Grund auf zu implementieren. Mein Problem ist unten in der Grafik dargestellt. Je mehr Abgriffe ich einem FIR-Filter hinzufüge, desto länger ist die Verzögerung zwischen dem Eingangssignal und dem DAC-Ausgangssignal. Bei den von mir verwendeten Audiosignalen führt eine Verzögerung von über 40 us zu einer hörbaren Verzerrung, die meine Filterfähigkeiten einschränkt. Es macht es auch schwierig, das Filter zu entwerfen, da die Abtastrate durch die Rechenzeit begrenzt ist (die nächste Eingabe kann nicht verarbeitet werden, bis die vorherige an die Ausgabe gesendet wird).
Fragen:
Gibt es Hardware- oder Softwarestrukturen, die ich verwenden sollte, um die Leistung zu verbessern?
Wenn ich die Leistung nicht verbessern kann, sollte ich meinen Filter mit einer Abtastrate entwerfen, die die Anzahl der Vorgänge berücksichtigt, die ich zwischen den Abtastungen durchführen muss, und die Vorgangszeit aus dem Datenblatt?
Ich habe die CMSIS-Bibliotheken nicht ausprobiert, da ich ein besseres Gefühl für die tatsächlichen Algorithmen bekommen wollte, aber würden diese Bibliotheken die Leistung verbessern?
Codeschnipsel: (Verallgemeinert für IIR-Filter)
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;
}
ADC-Timing-Setup
ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 1, ADC_SampleTime_1Cycles5);
DAC-Timing-Setup
TIM_TimeBaseStructure.TIM_Period = 2-1 ;
TIM_TimeBaseStructure.TIM_Prescaler = 1-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 1-1;
Danke für deine Zeit und ich würde mich über jede Anleitung freuen!
Suchen Sie eine Bibliothek, die FIR-Filter in Assembly implementiert. Ich bin mir zu 100% sicher, dass es eine DSP-Bibliothek für STM32 gibt.
Schreiben Sie alternativ Ihren eigenen Code, der erweiterte Funktionen im Kern verwendet.
Chris Stratton
Andreas
Chris Stratton
Chris Stratton