FFT filtering - overlap add methode

  • Ersteller karumba
  • Erstellt am
karumba

karumba

Moderator
Teammitglied
Registriert
01.01.10
Beiträge
10.562
Reaktionen
3.805
Ort
Alzenau
Punkte
24.083
neben all unseren hardware gurus sind hier doch bestimmt auch ein DSP fachleute unterwegs. ich bin gerade dabei einen speziellen dynamischen filter als VST plugin zu programmieren & möchte dafür FFT filtering verwenden, da dies die schnellste (und mE auch bequemste) umsetzung für FIR filter ist. für ein echtzeit signal muss man sich hierfür der "overlap add" methode bedienen, d.h. den stream in blöcke der größe L zerlegen & mit der länge M nullen auffüllen bevor man die IFFT macht. beim 2ten block wird dann einfach der M-teil des ersten blocks zum L-teil des 2ten blocks dazu addiert. damit lassen sich sprünge im zeitbereich (time domain aliasing) vermeiden.

hier ist der algorithmus erkärt.
http://en.wikipedia.org/wiki/Overlap–add_method

meine frage - und da konnte ich bei meiner bisherigen recherche keine antwort drauf finden - wie groß muss ich M dimensionieren? eine mögliche idee wäre das filter in den zeitbereich zu transformieren & dann zu schauen wie lange es zum ausschwingen braucht. das müsste eigentlich die länge von M definieren, nicht? das problem ist, dass mein filter nicht statisch ist, sondern adaptiv. ich müsste das also ständig aktualisieren. hat jemand von euch vielleicht eine idee oder erfahrung damit?

danke im voraus!
 
Hi Karumba,

ok nochmal hier: da jedes Eingangssample, welches nicht Null ist, eine M-lange Antwort nach sich zieht, also anschaulich eine Art "Bleed" Effekt, muesste die Pufferzone der Nullen = M betragen. Also M = maximale FIR Laenge. gruss
 
M=L hab ich ja nicht gesagt :). L=M, bei vorgegebenem M, ergaebe aber quasi die kleinste FFT Groesse, naemlich M+L=2L, die man damit erzielen kann, so dass sich immer noch nur benachbarte Bloecke durch Aufaddieren ueberschneiden. Uebrigens war ich ungenau, es muss nur gelten: M = FIR Laenge-1.

Man kann es sich so klarmachen.

Die Operation: FFT-Gewichtung-IFFT macht Folgendes: eine zirkulaere Faltung. Das bedetuet, dass die letzten Samples im FFT-Block die ersten Samples im Ergebnisblock beeinflussen.

Wenn aber nun die letzten M Samples zu Null gesetzt sind und die Filterlaenge ist kleiner als M+1, dann haben diese Samples keinen Einfluss, heisst: das zirkulante Verhalten kommt nicht zum Tragen, und die zirkulante Faltung ergibt, mit Hilfe des spaeteren Aufaddierens und Zusammensetzens des Bloecke, also durch Superposition, die normale Faltung.

Mag jetzt etwas kompliziert klingen, aber wenn man sich den Prozess anhand eines einfachen Rechenbeispieles veranschaulicht, wird die Sache auch klarer.

EDIT

Aber auf eine Sache muss man wirklich achten: naemlich man muss das FIR Verhalten, also den Freqeunzgang des Filters an den betreffenden Stuetzstellen ganau ausrechnen und auch so umsetzen. damit man die effektive FIR Laenge im Zeitbereich nicht den erlaubten Maximalwert ueberschreitet. Man kann nicht einfach wild die Koeffizienten im Frequenzbereich veraendern.
 
Aber auf eine Sache muss man wirklich achten: naemlich man muss das FIR Verhalten, also den Freqeunzgang des Filters an den betreffenden Stuetzstellen ganau ausrechnen. damit man die effektive FIR Laenge im Zeitbereich nicht ueberschreitet. Man kann nicht einfach wild die Koeffizienten im Frequenzbereich veraendern.
das ist genau worauf ich hinaus will. man kann die koeffizienten schon "wild" ändern, muss aber - wie du schon sagtest - den zeitbereich des filters mitbetrachten & abhängig davon was man im frequenzbereich gemacht hat, gilt "M = maximale FIR Laenge". bei dynamischer filterung müsste ich mir aber die FIR Laenge für jeden block neu berechnen.

ich habe oben übrigens FIR länge mit FFT size verwechselt. meine aussagen machen daher nur bedingt sinn :)

herkömmliche shelf- oder peakfilter als FFT implementiert haben das problem nicht (weniger), weil die im frequenzbereich quasi "smoothed" sind. das gibt dann nach meinem verständnis auch im zeitbereich recht kurze FIR längen. ich habe auch schon über cubic/spline interpolation meines filters im frequenzbereich nachgedacht (soll auch die filterlänge verkürzen). das erfüllt aber dann leider nicht den vorgesehenen zweck.
 
Wenn du die FIR fuer jeden Block neu berechnest funktioniert deine Dynamik aber nur blockweise und wechselt von Block zu Block auch abrupt.

Normalerweise macht man die Impulsantwort gleich der halben FFT-Laenge. Ansonsten wuerde man ja entweder Fehler durch die zirkulaere Faltung bekommen oder man verschenkt FFT-Groesse. Wenn die IR-Laenge variabel ist sollte sie natuerlich immer kleiner oder gleich der halben FFT-Laenge sein.

Soll das linearphasig werden oder warum die FIR?


gruss, Chris
 
Wenn du die FIR fuer jeden Block neu berechnest funktioniert deine Dynamik aber nur blockweise und wechselt von Block zu Block auch abrupt.
ja, das hatte ich mir auch schon überlegt. ich müsste dann wohl on-top noch eine glättung drüberlegen. so wirklich als "korrekt" empfinde ich das aber nicht, von daher habe ich die idee wieder verworfen.

Soll das linearphasig werden oder warum die FIR?
nein, müsste nicht zwingend linear phase sein, ich brauche aber die FFT-auflösung für mein filter. daher kommt nur FIR in frage.
 
Was meinst du denn mit FFT-Aufloesung, willst du die Bins dynamisieren?
Wenn es nicht um linearphasig geht, ist ein IIR-Filter einem FIR-Filter doch eigentlich ueberlegen.


gruss, Chris
 
Was meinst du denn mit FFT-Aufloesung, willst du die Bins dynamisieren?
genau, ich möchte die bins automatisieren.

Wenn es nicht um linearphasig geht, ist ein IIR-Filter einem FIR-Filter doch eigentlich ueberlegen.
wie würdest du ein IIR filter designen, sodass es aufs gleiche hinaus läuft, als wenn man die bins der FFT dynamisiert?
 
karumba schrieb:
Wenn es nicht um linearphasig geht, ist ein IIR-Filter einem FIR-Filter doch eigentlich ueberlegen.
wie würdest du ein IIR filter designen, sodass es aufs gleiche hinaus läuft, als wenn man die bins der FFT dynamisiert?
Das waere dann in der Tat noch etwas, bei dem ein FFT-Filter ueberlegen ist, da man FFT-Groesse/2 Filter paralell rechnen kann.

Andererseits ist die lineare Freuqenzaufloesung einer FFT fuer Audio nicht unbedingt ideal, aber ich kenne die genaue Anwendung ja auch nicht.


gruss, Chris
 
Andererseits ist die lineare Freuqenzaufloesung einer FFT fuer Audio nicht unbedingt ideal, aber ich kenne die genaue Anwendung ja auch nicht.
vereinfacht könnte man sagen es soll ein dynamischer FFT EQ werden. die eigentliche idee wird in der art & anpassung der dynamik liegen.
 

Neue Antworten


Oft gelesene Themen

Zurück
Oben