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

#5091689
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren