Inverse FFT - wie funktioniert sowas?



  • Vorab: ich glaube, ich brauche eine Erklärung für Dummies. Da mir selber das mathematische Grundgerüst fehlt, möchte ich auf eine fertige Library zurückgreifen - scheitere jedoch an deren Benutzung.

    Ich habe eine Tabelle mit Frequenzen und zugeordneten Amplituden. Diese Tabelle beschreibt mir ein Geräusch/Ton, d.h. sie sagt aus, wie viele Sinuswellenformen der angegebenen Frequenzen bei den ebenfalls darin angegebenen Amplituden überlagert werden sollen.

    Die Frequenzen können dabei fix vorgegeben (und initial frei ausgewählt) werden, lediglich die Amplituden werden sich später im Programm ständig ändern.

    Jetzt hätte ich die Möglichkeit, einfach jede einzelne Sinuswellenform separat zu berechnen und diese dann zusammenzumixen, das würde dann zu dem gewünschten Ergebnis führen. Allerdings fürchte ich, dass dieswe Methode schleppend langsam ist.

    Also: es muss eine Inverse FFT her, bei der dich aus meiner Beschreibung von Frequenzen/Amplituden die passenden Audiodaten erzeugen kann.

    Mit JTransforms ( https://sites.google.com/site/piotrwendykier/software/jtransforms ) habe ich eigentlich auch was passendes gefunden, leder werde ich aus der Beschreibung nicht schlau:

    Es gibt einen einzigen Konstruktor:

    FloatFFT_1D
    public FloatFFT_1D(int n)
    Creates new instance of FloatFFT_1D.

    Parameters:
    n - size of data

    ...und diverse Methoden, die aber alle prinzipiell änlich aussehen:

    realInverseFull
    public void realInverseFull(float[] a,
    boolean scale)
    Computes 1D inverse DFT of real data leaving the result in a . This method computes the full real inverse transform, i.e. you will get the same result as from complexInverse called with all imaginary part equal 0. Because the result is stored in a, the size of the input array must greater or equal 2*n, with only the first n elements filled with real data.

    Parameters:
    a - data to transform
    scale - if true then scaling is performe

    Wenn der Parameter a meine Amplitudenwerte beinhaltet - wo werden dann die zugehörigen Frequenzen definiert?

    Oder funktioniert diese Umwandlung prinzipiell anders/nicht so, wie ich mir das so vorstelle?



  • Zwaks schrieb:

    public void realInverseFull(float[] a,
    boolean scale)
    Computes 1D inverse DFT of real data leaving the result in a . This method computes the full real inverse transform, i.e. you will get the same result as from complexInverse called with all imaginary part equal 0. Because the result is stored in a, the size of the input array must greater or equal 2*n, with only the first n elements filled with real data.

    Parameters:
    a - data to transform
    scale - if true then scaling is performe

    Wenn der Parameter a meine Amplitudenwerte beinhaltet - wo werden dann die zugehörigen Frequenzen definiert?

    Die Frequenzen sind implizit. Allerdings ist die von dir zitierte Doku nicht besonders klar formuliert. Wenn ich das richtig verstehe steckst du da n reelle Werte rein und bekommst n reelle Werte raus. So könnte man es zumindest machen. Dabei sind das dann Amplituden von n/2+1 Frequenzen ... von 0 bis zur Nyquist-Frequenz in gleich großen Schritten. Für die beiden Extreme reicht jeweils eine "Amplitude". Für die Frequenzen dazwischen brauchst du zwei Werte x, y. Die Amplitude ergibt sich dann aus der sqrt(x2+y2) und die Phase aus atan2(y,x) -- oder so ähnlich.

    Vielleicht beschreibst du dein eigentliches Problem einfach genauer. Dann kann man dir ggf auch Tipps geben, wie man es am besten löst. Wie sind denn so bei dir die Frequenzen verteilt? Wieviele hast du davon? Wie schnell ändert sich da was? Was ist die Abtastrate? ...


Anmelden zum Antworten