Du hast Recht. Die FFT-basierte Verarbeitung erhöht die Latenz Ihres Systems. Es gibt jedoch Möglichkeiten, dies zu optimieren.
Nehmen wir an, Sie haben einen FIR-Filter der Länge "N". Dies kann FFT-basiert unter Verwendung der Standardmethode zum Hinzufügen oder Speichern von Überlappungen implementiert werden, wobei die FFT-Länge 2 * N betragen würde. Die Gesamtsystemlatenz beträgt ebenfalls ungefähr 2 * N: Sie müssen einen Frame mit N Samples akkumulieren und dann, während Sie den nächsten Eingaberahmen akkumulieren, die Berechnung für den aktuellen Frame durchführen. Wenn der zweite Frame akkumuliert wurde (Zeitversatz 2 * N), ist der erste Frame zum Ausgehen bereit. Wenn Sie eine schnelle CPU haben, können Sie dies etwas beschleunigen, indem Sie unterschiedliche Ausrichtungen für Eingabe- und Ausgaberahmen verwenden, aber das ist normalerweise mehr Mühe als es wert ist.
Sie können den Filter auch in K kleinere Blöcke der Länge M aufteilen, dh N = K * M. Die FFT muss nur über M Eingangsabtastungen durchgeführt werden, und die Verzögerung und Akkumulation über die mehreren Filterabschnitte erfolgt im Frequenzbereich. Bill Gardner hat hier einige Varianten davon beschrieben: http://www.cs.ust.hk/mjg_lib/bibs/DPSu/DPSu.Files/Ga95.PDF
Es wird oft als "Block Convolver" bezeichnet.
Dies ermöglicht es, die Latenz im Grunde gegen die Effizienz abzuwägen, und bietet ein Kontinuum zwischen der direkten FIR und der Überlappungsadditionsmethode in voller Größe. Ein netter Nebeneffekt des Block Convolver ist, dass die Gesamtfilterlänge nicht eine Potenz von 2 sein muss. Beispielsweise können Sie einen Filter mit 768 Registerkarten als 6 Blöcke mit 128 Blöcken ohne signifikanten Effizienzverlust implementieren.