Forum: Digitale Signalverarbeitung / DSP / Machine Learning Noch mal ne kleine Frage zur FFT


von Hannes (Gast)


Lesenswert?

Ich möchte von 1024 Werte eine FFT berechnen. Mein vorgehen ist wie 
folgt. Ich sample mir 1024 Werte und speicher diese ab. Anschließend 
berechne ich die FFT. Da ich die Werte mit einem AD-Wandler 
digitalisiere habe ich nur den Realteil zur Verfügung. Aus diesem 
errechne ich dann die FFT.

Nun zu meiner Frage. Wie viele Werte hat mein Ergebnis?

1. besteht mein Ergebnis aus 512 reellen und 512 imaginären Werten? --> 
1024 Werte

2.  besteht mein Ergebnis aus (512 reellen und 512 imaginären Werten) + 
1 -->1025 Werte?

3. Wie ist das Ergebnisarray angeordnet?
3.1 y[0] = Reateil    y[1] = Imaginärteil
3.2 y[0] = bis y[511] = Realteil   y[512] bis y[1023]= Imaginärteil

4. Ist das 0 Element (y[0])des Ergebnisarrays der DC-Anteil? Besteht der 
DC-Anteil auch aus einem Realteil und Imaginärteil?

von Detlef _. (detlef_a)


Lesenswert?

>>Nun zu meiner Frage. Wie viele Werte hat mein Ergebnis?
1024 komplexe Werte

>>3. Wie ist das Ergebnisarray angeordnet?
Das hängt von der FFT ab, die Du nutzen willst.

>>4. Ist das 0 Element (y[0])des Ergebnisarrays der DC-Anteil?
ja

>>Besteht der DC-Anteil auch aus einem Realteil und Imaginärteil?
Nein, der ist rein reel, DC hat keine Phase. Der Nyquistanteil der FFT 
(Index 512 wenn man bei 0 zu zählen anfängt) ist auch rein reel.

http://de.wikipedia.org/wiki/Diskrete_Fourier-Transformation :
>>>>>
Wie bei der Fourier-Transformation gelten auch für die DFT gewisse 
Symmetriegesetze. So wird ein reelles Signal im Zeitraum zu einem 
hermiteschen Signal im Frequenzraum:
<<<<<

Die Beträge der FFT-Koeffizienten sind spiegelsymmetrisch, die Phasen 
punktsymmetrisch. Deswegen reicht es aus, von den komplexen 1024 
Ergebniswerten einer Transformation eines reellen 1024 Punkte 
Zeitsignals nur 512 Realteile und 512 Imaginärteile abzuspeichern, also 
wieder 1024 reelle Zahlen: FFT ist 'in place'.

Cheers
Detlef

von Hannes (Gast)


Lesenswert?

Also wenn ich ein reelles Siganl aus 1024 Punkte habe bekomme ich als 
Ergebnis ein Signal aus 512 Realteile und 512 Imaginärteilen.

Was ich dann nicht verstehe ist wenn der DC-Anteil nur aus einem Reateil 
besteht, dann habe ich doch eine ungerade Anzahl an Werten für die 
Betragsbildung.

z.B.
y[0] = DC-Anteil
y[1] bis y[1023] ist dann für die Betragsbildung. Dies ist aber eine 
ungerade Anzahl an Elementen.

Ich habe mal mit Labview so eine FFT simuliert. Dort habe ich mir ein 
Sinussignal erzeugt. Die FFT zeigt mir nun einen schönen Peak im 
Spektrum. Auf dem Mikrokontroller mache ich das gleiche. Nun 
unterscheiden sich die Amplituden jedoch.

Amplitude_1: 6979,44
Amplitude_2: 13,6317

Amplitude_1/Amplitude_2 = 0,00195313

Ich habe bereits versucht die Amplitude_1 mit 1/wurzel(N) wobei N = 1024 
ist zu multiplizieren. Jedoch sind meine beiden Amplituden nicht gleich. 
Die Frequenzen sind jedoch identisch.

von Detlef _. (detlef_a)


Lesenswert?

1/0,00195313=512, die Amplituden der beiden FFTs sind mit 512 skaliert. 
Der Skalierungsfaktor ist ne Frage der Konvention, machen die einen so, 
die anderen anders.

Wie ich schon sagte:

>>>3. Wie ist das Ergebnisarray angeordnet?
>>Das hängt von der FFT ab, die Du nutzen willst.

gerne mal wirds so gemacht:
y[0] ist der DC Anteil, rein reel, y[1] ist der Nyquistanteil, rein 
reel, die y[2]-y [1023] sind paarweise die real/imag Komponenten der 511 
Frequenzen. Muß Du kucken, was labview oder der uController 
zurückliefert.

Cheers
Detlef

von Hannes (Gast)


Lesenswert?

Also kann ich y[0] und y[1] so lassen wie sie sind?

Warum skalliert denn jeder seine FFT unterschiedlich. Ich dachte immer 
das ist 1/Wurzel(N) oder Wurzel(N).

Diesmal scheint es ja 1/(N/2) zu sein. Gibt es für die Skalierung feste 
Vorschriften?

Auf jedenfall schon mal vielen Dank für die super Infos

von Detlef _. (detlef_a)


Lesenswert?

>>Also kann ich y[0] und y[1] so lassen wie sie sind?

Das ist eine Vermutung, ich habe keine Ahnung wo labview und Deine uC 
Implementation die Daten hinschreiben.

Drei Tests machen:
1) eine einzige Sinuswelle in die 1024 Werte schreiben, bißchen 
pasenverschoben: sin(2*pi*(0:1023)/1024+pi/2), wo stehen die real(imag 
Komponente nach der Transformation ? (Das hast Du ja schon gemacht)

2) Reiner DC. Wo steht die Einzelkomponente?
3) Nyquist: -1,1,-1,1,-1,............... . Wo steht die nach der Trafo?

Cheers
Detlef

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.