Forum: Digitale Signalverarbeitung / DSP / Machine Learning Inverse DFT in C++, was mache ich falsch?


von Piti V. (piti)


Angehängte Dateien:

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
}

: Bearbeitet durch User
von Quarkltasche (Gast)


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

von Dieter (Gast)


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.

von Michael W. (Gast)


Lesenswert?

>Nimm doch einfach die von fftw.org.
Das ist doch eine FFT, oder?
Der TE will ja DFT.

von 2^5 (Gast)


Lesenswert?

Eine FFT ist eine mögliche Implementation einer DFT.

von Schnellhilfe (Gast)


Lesenswert?

Tipp: Lass dir aus deinem Matlab-Code den C++-Code von Matlab 
autogenerieren und schau ihn dir dann an.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.