Du hast 2 Probleme:
Delphi-Quellcode:
plan := fftwf_plan_dft_1d(n, @In_[0], @Out_[0], FFTW_FORWARD, FFTW_ESTIMATE);
With canvas Do Begin
fftwf_execute(plan);
plan := fftwf_plan_dft_1d(n, @Out_[0], @in_[0],
FFTW_Backward, FFTW_ESTIMATE);
fftwf_destroy_plan(plan);
Nimmt man den ganzen Zeichenkram mal weg sieht man schon mal: Du erstellst einen Plan, führst ihn aus, erstellst einen neuen (ohne den alten zu löschen), löscht aber den neuen zum Schluss. Folge: Speicherloch.
Zumal das Einschließen des Executes und das Erzeugen den 2. Plans in das with hier zur Unübersichtlichkeit beitragen.
Was aber letztlich vermute ich das Problem ist, ist dass die FFTW beim Erstellen eines Plans (wenn man es nicht explizit angibt) nicht dafür garantiert, dass die Werte in den Arrays beibehalten werden! Der Plan kann aber auch problemlos mit 0-besetzten Arrays gemacht werden, und das Füllen nachher. Es geht eh nur um die Samplemenge. Für die Rücktransformation müsstest du dir entweder das Array selbst zwischenspeichern, oder aber schauen wie man der FFTW sagen kann, dass es die Arrays in Ruhe lassen soll (ich meine das ging, weiss aber gerade nicht mehr wie).
Zum Schluss
könnte dir das Alignment noch ans Bein pullern. Mach aus den Arrays mal
packed Arrays.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)