fftw problem



  • Hi,

    ein problem bei der verwendung der fftw library für fouriertransformationen.
    ich habe ein bild mit der größe nx*ny*nz im real space und einen filter nx*ny*nz im fourierspace. wenn ich nun mein bild in den fourierspace transformiere (funktion rfftwnd_one_real_to_complex) dann ändert sich die dimension des bildes laut fftw doku auf nx*ny*(nz/2+1) (auf grund von redudanzen im fourier space). nun möchte ich aber das bild mit dem filter (einer wedge) multiplizieren, was aber aufgrund des größenunterschiedes nicht möglich ist

    beispiel:
    image in realspace 32*32*32 with fouriertransform 32*32*17
    wedge filter im fourierspace erzeugt: 32*32*32

    in matlab ergibt sich dieses größenänderung nicht und mit folgendem aufruf funktioniert das ganze problemlos (funktion wedge zeugt einen filter mit der größe des original images und z.b 30 grad)
    [matlab_code]
    wedgedImage = real(ifourier(fourier(image).*fftshift(wedge(size( image), 30)));
    [/matlab_code]

    wie bekomme ich dies nun unter C mit der fftw zum laufen?
    lordy



  • Die lassen wohl die "2. Hälfte" der Transformierten weg, Du kannst Dir diesen fehlenden Teil Deiner Matrix selbst wieder zusammenbauen. Wg Ersparnis von Speicher ist die Vorgehensweise der FFTW-Lib natürlich richtig, aber mathematisch ist es nicht korrekt, da der symmetrische Teil natürlich eigentlich dazu gehört.

    Wenn Du wirklich fit bist in der komplexen Matrizenrechnung, kannst Du Dir auch Deinen Wedge-Filter auf die kleinere Matrix der Transformierten zusammen kürzen, auch das geht.

    Ich habe mit der FFTW-Lib noch nicht aktiv gearbeitet und dieses Problem für Matrizen noch nicht lösen müssen, aber Du kannst prinzipiell den fehlenden Teil der Transformierten selbst erstellen, indem Du Zugriffe auf die Indizes der 2. Matrixhälfte aus der vorhandenen Matrix und den Symmetrievorschriften kombinierst.

    Quasi so:

    double getValue(n)
    {
       if (n >= N/2)
          return symmetrie(vector[n - N/2]);      
       else
          return vector[n];
    }
    

    Wie allerdings jetzt die Symmetrieabbildung für die Matrix im Komplexen aussieht kann ich Dir auswendig auch nicht sagen...



  • Marc++us schrieb:

    Die lassen wohl die "2. Hälfte" der Transformierten weg, Du kannst Dir diesen fehlenden Teil Deiner Matrix selbst wieder zusammenbauen. Wg Ersparnis von Speicher ist die Vorgehensweise der FFTW-Lib natürlich richtig, aber mathematisch ist es nicht korrekt, da der symmetrische Teil natürlich eigentlich dazu gehört.

    Wenn Du wirklich fit bist in der komplexen Matrizenrechnung, kannst Du Dir auch Deinen Wedge-Filter auf die kleinere Matrix der Transformierten zusammen kürzen, auch das geht.

    Ich habe mit der FFTW-Lib noch nicht aktiv gearbeitet und dieses Problem für Matrizen noch nicht lösen müssen, aber Du kannst prinzipiell den fehlenden Teil der Transformierten selbst erstellen, indem Du Zugriffe auf die Indizes der 2. Matrixhälfte aus der vorhandenen Matrix und den Symmetrievorschriften kombinierst.

    Quasi so:

    double getValue(n)
    {
       if (n >= N/2)
          return symmetrie(vector[n - N/2]);      
       else
          return vector[n];
    }
    

    Wie allerdings jetzt die Symmetrieabbildung für die Matrix im Komplexen aussieht kann ich Dir auswendig auch nicht sagen...

    thx so in etwa ist es gegangen.
    hab die daten vorher noch in z-y-x reichenfolge umsortieren müssen und dann die spiegelung um x angefügt und schon hat man wieder originalgröße


Anmelden zum Antworten