AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Fftw 2d fft

Ein Thema von j0hnnie · begonnen am 8. Feb 2011 · letzter Beitrag vom 8. Feb 2011
Antwort Antwort
j0hnnie

Registriert seit: 25. Mai 2010
6 Beiträge
 
#1

Fftw 2d fft

  Alt 8. Feb 2011, 15:54
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

Geändert von j0hnnie ( 8. Feb 2011 um 16:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Fftw 2d fft

  Alt 8. Feb 2011, 16:26
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.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
j0hnnie

Registriert seit: 25. Mai 2010
6 Beiträge
 
#3

AW: Fftw 2d fft

  Alt 8. Feb 2011, 16:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Fftw 2d fft

  Alt 8. Feb 2011, 19:03
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.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf