Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fftw 2d fft (https://www.delphipraxis.net/158178-fftw-2d-fft.html)

j0hnnie 8. Feb 2011 15:54

Fftw 2d fft
 
Guten Tag!

Ich würde gerne die 2D-FFT über die dll von FFTW einbinden. Bei der eindimensionalen FFT übergebe ich der Funktion einfach für den In- und Output jeweils einen Pointer auf einen dynamischen Array.

Delphi-Quellcode:
Ain, Aout : Array of Single;
plan : Pointer;
...
SetLength(Ain, 128);
SetLength(Aout, 128);
...
plan := fftwf_plan_dft_1d(128, @Ain[0], @Aout[0],FFTW_FORWARD,FFTW_ESTIMATE);
fftwf_execute(plan);
fftwf_destroy_plan(plan);
In der zweidimensionalen Version verlangt die Funktion auch zwei Pointer. Allerdings kommen ich hier mit den zweidimensionalen dynamischen Arrays (array of array) nicht weiter. Wenn ich der Funktion einen Pointer auf den ersten Eintrag des 2D-arrays gebe, wird dieser nicht vernünftig gefüllt. Das wird wahrscheinlich daran liegen, dass bei den 2D-arrays die Werte nicht alle direkt im Speicher hintereinander stehen.
Gibt es eine Möglichkeit dieses Problem einfach zu lösen? Kann ich beispielsweise mittels GetMen einen Speicher von N*M freischaufeln, der FFT übergeben und nachher wieder einen 2D-array machen, ohne selber mit einer Schleife den Array zu füllen? Gibt es vielleicht eine Variante, in der nicht zweimal ein Speicherabbild von dem Array auf dem Hauptspeicher existiert?
Hinzu kommt das Problem, dass ich einen 2D-array von komplexen Zahlen brauche.

Grüße

igel457 8. Feb 2011 16:26

AW: Fftw 2d fft
 
Ein Delphi-2D-Array ist ja nur ein Array von Arrays, d.h. ein Array von Pointern auf Arrays. Du wirst also nicht umhinkommen den Speicher via GetMem zu besorgen. Zugreifen kannst du ja über eine eigene Funktion, die aus Einer x,y-Koordinate die entsprechende Adresse berechnet.

j0hnnie 8. Feb 2011 16:47

AW: Fftw 2d fft
 
Danke für die Antwort. Leider brauche ich einen 2D-Delphi-Array, weil die FFT in ein Modul eingebaut werden soll, was nur mit solchen arrays rechnet. Gibt es vielleicht einen effizienten Weg, die Pointer wieder in ein dynamisches Array umzuwandeln? Mein Problem ist, dass sonst immer der Speicher doppelt belegt werden muss, bevor der mit GetMen zugesicherte Speicher wieder gelöscht werden kann.

igel457 8. Feb 2011 19:03

AW: Fftw 2d fft
 
Nein, das ist nicht so einfach: Du könntest zwar das zweidimensionale Array als Array aus Pointern definieren, Problem bei einem dynamischen Array ist jedoch, dass die ersten 4 Byte die Länge des Arrays beinhalten. Dies ginge also nur, wenn du Platz für n*(n * SizeOf(TComplex) + 4) Bytes reservierst, und du fftw dazu bringst am Anfang jeder Zeile 4 Bytes Platz zu lassen. Dann könntest du in diese 4 Bytes einfach n reinschreiben.

Bei statischen Arrays ist dies jedoch kein Problem, da nur dem Compiler die Länge bekannt ist, diese aber nicht explizit mit dem Array gespeichert wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz