Information ausblenden

FFT filtering - overlap add methode

Dieses Thema im Forum "Do-It-Yourself (DIY)" wurde erstellt von karumba, 30.01.13.

Status des Themas:
Beachte, dass dieses Thema älter als ein Jahr ist! Möglicherweise ist es sinnvoller, einen neuen Thread zu erstellen.
  1. karumba

    karumba Themenersteller Moderator Mitarbeiter

    Registriert seit:
    01.01.10
    Artikel:
    6
    Punkte:
    23.941
    23941
    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!
     
    karumba, 30.01.13
    #1
  2. synthpark

    synthpark

    Registriert seit:
    11.11.09
    Punkte:
    52.274
    52274
    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
     
    synthpark, 30.01.13
    #2
    karumba bedankt sich.
  3. karumba

    karumba Themenersteller Moderator Mitarbeiter

    Registriert seit:
    01.01.10
    Artikel:
    6
    Punkte:
    23.941
    23941
    karumba, 30.01.13
    #3
  4. synthpark

    synthpark

    Registriert seit:
    11.11.09
    Punkte:
    52.274
    52274
    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.
     
    synthpark, 30.01.13
    #4
    karumba bedankt sich.
  5. karumba

    karumba Themenersteller Moderator Mitarbeiter

    Registriert seit:
    01.01.10
    Artikel:
    6
    Punkte:
    23.941
    23941
    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.
     
    karumba, 30.01.13
    #5
  6. derchris

    derchris

    Registriert seit:
    01.03.04
    Punkte:
    2.067
    2067
    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
     
    derchris, 30.01.13
    #6
    karumba bedankt sich.
  7. karumba

    karumba Themenersteller Moderator Mitarbeiter

    Registriert seit:
    01.01.10
    Artikel:
    6
    Punkte:
    23.941
    23941
    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.

    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.
     
    karumba, 30.01.13
    #7
  8. derchris

    derchris

    Registriert seit:
    01.03.04
    Punkte:
    2.067
    2067
    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
     
    derchris, 30.01.13
    #8
    karumba bedankt sich.
  9. karumba

    karumba Themenersteller Moderator Mitarbeiter

    Registriert seit:
    01.01.10
    Artikel:
    6
    Punkte:
    23.941
    23941
    genau, ich möchte die bins automatisieren.

    wie würdest du ein IIR filter designen, sodass es aufs gleiche hinaus läuft, als wenn man die bins der FFT dynamisiert?
     
    karumba, 30.01.13
    #9
  10. derchris

    derchris

    Registriert seit:
    01.03.04
    Punkte:
    2.067
    2067
    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
     
    derchris, 30.01.13
    #10
    karumba bedankt sich.
  11. karumba

    karumba Themenersteller Moderator Mitarbeiter

    Registriert seit:
    01.01.10
    Artikel:
    6
    Punkte:
    23.941
    23941
    vereinfacht könnte man sagen es soll ein dynamischer FFT EQ werden. die eigentliche idee wird in der art & anpassung der dynamik liegen.
     
    karumba, 30.01.13
    #11
Status des Themas:
Beachte, dass dieses Thema älter als ein Jahr ist! Möglicherweise ist es sinnvoller, einen neuen Thread zu erstellen.