Inverse DFT in C++, was mache ich falsch?

OP #5091689
Hallo zusammen,
ich möchte die Daten eines Sensors auswerten und habe dazu Daten 
eingelesen, DFT transformiert (mit evtl. Befensterung) und möchte die 
Daten nun per inverser Fourier rücktransformieren. Code für diese 
Funktion befindet sich unten.
Funktioniert auch alles ganz gut, allerdings stimmt das Ergebnis der 
iDFT nicht. Bekomme dabei das Bild im Anhang (1. Input, 2. Platzhalter, 
3. DFT, 4. iDFT. dh Bild 4 stimmt nicht). Hier müsste ja ohne 
Befensterung die selbe Funktion erhalten werden wie auch der Input war, 
stattdessen habe ich einen merkwürdigen Phasenverschiebung und eine 
niedrigere Amplitude. Kann jemand einen Fehler erkennen?

Habe in einem Matlab-Skript das Ganze nachgebaut, da funktioniert alles 
wie es soll.

Vielen Dank im Voraus.
1
// Durchführung der inversen DFT
2
void DFT_C::do_inv_dft(void)
3
{
4
int i,k;
5
double temp_r_inv,temp_i_inv; 
6

7
if (!data_in) return;
8

9
data_out_r_inv=new double[d_length];
10
data_out_i_inv=new double[d_length];
11
data_out_b_inv=new double[d_length];
12

13
if (data_out_r_inv&&data_out_i_inv&&data_out_b_inv) data_out_flag=1;
14
else return;
15

16
for (i=0;i<d_length;i++)
17
  {
18
  temp_r_inv=0;
19
  temp_i_inv=0;
20
  for (k=0;k<d_length;k++)
21
    {
22
    temp_r_inv+=data_out_r[k]*cos(2*M_PI*k*i/d_length); //data_out kommt aus der DFT
23
    temp_i_inv+=data_out_i[k]*sin(2*M_PI*k*i/d_length);
24
    }
25
  data_out_r_inv[i]=temp_r_inv;
26
  data_out_i_inv[i]=temp_i_inv;
27
  data_out_b_inv[i]=sqrt(pow(temp_r_inv,2)+pow(temp_i_inv,2));
28
  }
29
}
Angehängte Dateien:
Gast #5092298
Hi,
Dein Codeschnipsel ist ohne weiteren Zusammenhang etwas
schwer zu durchschauen.
Ist "d_length" die Gesamtlaenge des DFT Vektors, der
von 0 ... N/2 -1 die positiven und von N/2 ... N-1
die negativen Frequenzen enthaelt (bei einer N-Punkt DFT)?
Oder hast Du ueberhaupt nur (wie Dein DFT Bild zeigt) den
positiven Anteil betrachtet?

Insgesamt sieht es so aus, als haettest Du die negativen
Frequenzen vergessen (dafuer spricht auch die halbierte
Amplitude) oder irgendwie falsch behandelt (Deine Schleife
mit dem Zaehler k erzeugt fuer k >=N/2 falsche Frequenzen).

Gruss & viel Erfolg bei der Fehlersuche
 Quarktasche
Gast #5092454
Nimm doch einfach die von fftw.org. Gibt kaum eine bessere 
Implementierung.

Es sei denn, es ist eine Übung an der Uni, dann einfach mal einen Sinus 
reingeben und im Debugger nachschauen, wo der fehler liegt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.