www.mikrocontroller.net

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


Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.