Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT Ergebniskontrolle


von FFT (Gast)


Lesenswert?

moin,

ich habe nun meinen 1. FFT-algorithmus fertig und würde gerne 
überprüfen, ob er richtig arbeitet.

Wie kann ich dies am schnellsten überprüfen?

Was wären geeignete Input-Daten, um die Richtigkeit zu verifizieren?


Ist ein 64er-Feld.


mfg

: Verschoben durch Admin
von Davis (Gast)


Lesenswert?

FFT schrieb:
> moin,
>
> ich habe nun meinen 1. FFT-algorithmus fertig und würde gerne
> überprüfen, ob er richtig arbeitet.
>
> Wie kann ich dies am schnellsten überprüfen?
>
> Was wären geeignete Input-Daten, um die Richtigkeit zu verifizieren?
>
>
> Ist ein 64er-Feld.
>
>
> mfg

Vorschlag: eine IFFT durchführen.

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Sinus und Cosinus einer Frequenz verwenden.

von Fritz (Gast)


Lesenswert?

FFT schrieb:
> Was wären geeignete Input-Daten, um die Richtigkeit zu verifizieren?

Rechtecksignal: 32 mal 1 und 32 mal -1 (oder 0).
Statt 1 u. -1 deiner Realisierung mit float oder integer entsprechend 
andere Werte ( 10000 -10000) verwenden.

Die FFT-Antwort zu einem Rechteck am besten bei google suchen.

von FFT (Gast)


Angehängte Dateien:

Lesenswert?

Also:

Ich habe als Input jetzt mal die Funktion:

25*Cos(2pift)+300 mit f=1,1hz und 64 Abtastpunkten gewählt.

Die Abtastpunkte sind:

325
319
305
288
277
276
287
303
318
325
320
306
289
277
276
285
302
317
325
321
308
291
278
275
284
300
316
325
322
309
292
279
275
283
298
315
324
323
311
294
280
275
282
297
313
324
323
312
295
281
275
281
295
312
323
324
313
297
282
275
280
294
311
323


Das FFT-Ergebnis ist
464
2290
79
223
45
211
233
47
52
136
117
138
316
142
175
67
53
192
234
63
63
102
234
223
901
249
56
166
778
264
393
198
463
747
149
145
51
120
178
85
37
90
78
127
445
224
403
219
2756
384
119
93
32
112
244
208
901
213
91
125
445
163
244
124


Eine Fensterfunktion habe ich nicht genutzt.
Ihr habt doch allesamt ebenfalls FFT-Algorithmen in den Schubladen.
Vielleicht mag also einer mal meine Daten zur Verifikation nachrechnen.

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Die Idee hinter der Testfunktion (sin und cos) war eine andere.
Bei einer Fouriertransformierten eines Sinus (ungerade Funktion) ist der 
Realteil Null und der Imaginärteil enthält das entsprechende 
Amplitudensignal auf der Frequenz des Sinus.  Beim Cosinus (gerade 
Funktion) ist es genau umgekehrt, der Imaginärteil ist Null und der 
Realteil enthält die Amplitude. Mache also folgenden Versuch.
Testsignal ist ein Sinus oder ein Cosinus mit EINER vollen Periode 
(keine Fensterung nötig, kein Leakage). Dann führst du die FFT durch und 
schaust dir das Ergebnis nach den obigen Kriterien an.

von Fritz (Gast)


Lesenswert?

FFT schrieb:
> Ihr habt doch allesamt ebenfalls FFT-Algorithmen in den Schubladen.
> Vielleicht mag also einer mal meine Daten zur Verifikation nachrechnen.

Etwas eigene Arbeit solltest du schon aufwenden.
Mit dem Nachrechnen ist es auch nicht so einfach, solange du uns nichts 
genaueres über die Organisation deiner Daten für Ei- und Ausgang 
angibst: Real Imaginärteil? Integer16 oder 32 bit signed unsigned oder 
float ....

von Joe G. (feinmechaniker) Benutzerseite


Angehängte Dateien:

Lesenswert?

Nachtrag zu deinen Ergebnissen.

Die Länge deines Datensatzes im Frequenzbereich (also Realteil oder 
Imaginärteil oder Betrag) darf nur die Hälfte der Abtastpunkte lang sein 
(32). Es muß genau zwei Peaks geben (einen Gleichanteil, einen auf der 
Signalfrequenz). Im Anhang das korrekte Ergebnis.

von Viktor N. (Gast)


Lesenswert?

Eine marginale Ahnung der fouriertransformation und der FFT im 
speziellen sollte man schon haben. Denn wenn man einfach irgendwas 
macht, macht man's haeufig falsch.

von Karl H. (kbuchegg)


Lesenswert?

FFT schrieb:
> Also:
>
> Ich habe als Input jetzt mal die Funktion:
>
> 25*Cos(2pift)+300 mit f=1,1hz und 64 Abtastpunkten gewählt.

Machs nicht so kompliziert.
Bei den ersten Tests (egal was), ist es immer so, dass man das korrekte 
Ergebnis schon im Vorfeld kennt, noch ehe der Code das erste mal läuft.

von jannemann (Gast)


Lesenswert?

http://www.random-science-tools.com/maths/FFT.htm
vielleicht hilft das, um deine Werte zu verifizieren.

von FFT (Gast)


Lesenswert?

danke allen, ich komme der Sache langsam auf die Spur, bei der 
Ergebnisinterpration habe ich aber doch noch ein paar Schwierigkeiten:

@Joe:
Du schreibst, dass nur die Hälfte der Datenpunkte in der Frequenz 
ausgewertet werden.

Wie muss ich denn nun meine Achse skalieren?

im obigen Bild habe ich ja erstmal alle 64 Punkte mit reingenommen.
Wie müsste ich nun einen x-Wert bezeichnen?

Ist ein x-wert nun 0,15625Hz oder ist ein x-Wert 0,078125Hz, was der 
Ferquenzauflösung delta_f bzw. der halben Frequenzauflösung delta_f/2 
entspräche...
Reichen meine X von 0 bis 9,9Hz oder von 0 bis 5Hz


Vielleicht noch etwas konkreter gefragt:

Was genau liegt in welchem "Frequenzfach"
Als Beispiel: Was würde in Fach 0 liegen, was liegt in Fach 30, 31, 32 
was liegt in Fach 63.


Ich habe ja nun eine ganze Menge Literatur zur FFT verschlungen, aber in 
keinem vorgestellten Algorithmus wird nach der Hälfte der Berechnung 
abgebrochen... Ich kann mir also nicht vorstellen, dass ich die 
Frequenzwerte "der zweiten Hälfte" einfach wegschmeißen könnte...

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Joe G. schrieb:
> Die Länge deines Datensatzes im Frequenzbereich (also Realteil oder
> Imaginärteil oder Betrag)...

Also nochmals ganz von vorne;
Dein Datensatz im Zeitbereich beinhaltet N Werte einer Zeitfunktion 
y(t)=f(t). Ist N ein Vielfaches einer Zweierpotenz, so kann statt der 
Fouriertransformation ein vereinfachter Algorithmus verwendet werden. 
Diesen nennt man dann FFT. Das Ergebnis der FFT ist eine Funktion im 
Frequenzbereich  Y(s)=f(s). Aufgrund der speziellen 
Transformationseigenschaften der Fouriertransformation ist das Ergebnis 
der FFT im allgemeinen eine komplexe Zahl bestehend aus einem Realteil 
Re(Y) und einem Imaginärteil Im(Y). Jede dieser beiden Funktionen 
beinhaltet somit nur noch N/2 Werte. Wenn du das Ergebnis nun darstellt, 
so kann es also nur noch N/2 Werte beinhalten. In deinem konkreten 
Beispiel also y(t) hat 64 Werte dann ist Y(s) komplex und hat 32 Werte 
für den Realteil und 32 Werte für den Imaginärteil. Selbstverständlich 
kannst du Re und Im auch in Betrag und Phase umrechnen. Dann hat der 
Betrag 32 Werte und die Phase 32 Werte.

von FFT (Gast)


Lesenswert?

Das ist doch nicht richtig was du da schreibst...

Die FFT geht doch auf die Butterfly-Operation zurück, also die paarweise 
Verknüpfung von jeweils zwei Abtastwerten.

Wenn ich nun eine derartige 2er FFT bilde, also nur eine einzige 
Butterfly-Operation durchführe, dann habe ich

F(0) = x(0) + x(1)
F(1) = x(0) - x(1)

und dies ist unverkennbar für beide Werte rein reell.

Wenn ich größere FFTs berechne, erhalte ich z.B. bei der 8er FFT in der 
letzten Stufe die Twiddle-Faktoren:
0,5*sqrt(2)*(+/- 1 +/-j), d.h. die araus gewonnenen Werte sind ebenfalls 
komplex, sprich in den Frequenzfächern stehen Zahlen, die einen Realteil 
ungleich Null UND einen Imaginärteil ungleich Null aufweisen...

von dadada (Gast)


Lesenswert?

FFT schrieb:
> beide Werte rein reell.
>
>
> Wenn ich größere FFTs berechne, erhalte ich z.B. bei der 8er FFT in der
> letzten Stufe die Twiddle-Faktoren:
> 0,5*sqrt(2)*(+/- 1 +/-j), d.h. die araus gewonnenen Werte sind ebenfalls
> komplex,

Was denn nun? Behauptest Du nun, dass Du Komplexe Zahlen als Ergebnis 
bekommen solltest, oder das Gegenteil?

Hier ist übrigens die (ernstgemeinte) Antwort auf Deine ursprüngliche 
Frage : Du vergleichst Deine Ergebnisse mit de von Dir (vorher) 
implementierten (nicht fast-) DFT.

von FFT (Gast)


Lesenswert?

Nein, ich behaupte, dass Joe G.s Antwort nicht richtig sein kann, weil 
bei eine N-Punkt FFT eben bis zu N komplexe Werte rauskommen - nicht N/2 
Werte.

Folglich ist der Ergebnisvektor eben nicht N/2 lang, sondern N lang. Und 
nicht nur das, er nimmt sogar 2xN Speicherplatz in Anspruch, weil in 
jedem Fach eben ein Realteil und ein Imaginärteil drin steckt udn wohl 
auch stecken muss.

Das Problem scheint Joe G aber noch garnicht aufgefallen zu sein, da er 
offenbar nur fertige Algorithmen aus einer Bibliothek verwendet und sich 
über die Ergebnisinterpretation bisher keinerlei Gedanken gemacht hat...

...aber versteht mich nicht falsch:
Ich bin über jede Hilfe dankbar, außer sie ist erkennbar falsch und 
geschieht darüber hinaus in  einem nicht angebrachten 
Kindergarten-Erklärton, womit der eigentlichen Frage der 
Ergebnisinterpretation in keiner Weise geholfen wird...

@Joe G.
Nimms bitte nicht persönlich. Der von dir gezeigte Plot ist leider 
erkennbar aus einer FFT-Routine die mehr macht, als nur N Eingangswerte 
zu verarbeiten und ist für meine Fragestellung nicht zielführend.


@dadada:
Ich habe hier nur einen Mikrocontroller zur Verfügung. Der Speicher ist 
so begrenzt, dass eine "richtige" DFT von vornherein nicht in Frage 
kommt. Dort müsste ich jede Ebene komplett speichern, weil das Ergebnis 
jeder Zeile alle vorherigen Ergebnisse mit benötigt.
Bei einer FFT hingegen müssen nur zwei Ebenen zeitgleich im Speicher 
vorgehalten werden und können danach überschrieben werden.

Schön wäre es daher, wenn jemand einen 64-Testvektor (irgendeine 
Cos-Funktion) bereitstellen würde und die zugehörige FFT Ausgabe gleich 
mit.

Es würde mir schon genügen, wenn ich anhand dieser Vergleiche prüfen 
könnte, ob ich zumindest eine richtige Implementierung vorgenommen habe.

mfg

von Matthias (Gast)


Lesenswert?

Ich würde das einfach mit einem tool vergleichen, Octave, Matlab oder 
so. Excel hat eine integrierte FFT.

von Kai S. (kai1986)


Lesenswert?

Hallo,

die Idee einer Testfunktion zum Überprüfen ist ja gerade, das man das 
Ergebnis vorher kennt. Dafür bieten sich neben "passen vollständigen" 
Perioden von Sinus und Kosinus z.B. auch eine konstante Funktion an.
Wie die Sortierung des Ergebnis aussieht hängt von der Implementierung 
ab, von daher musst du schon selbst wissen, an welche Stelle du was 
schreibst. Hierbei gilt aber allgemein, das die Anzahl der Eingangspunkt 
auch gleich der Anzahl der Ausgangspunkte ist. Wenn du jetzt allerdings 
64 reelle Werte als Eingang hast nimmst du die anderen 64 imaginären 
Werte mit Null an und kannst damit dann 128 Werte als Ausgang erhalten, 
diese lassen sich aber durch die Symmetrie (Eingang nur reell) wieder 
auf 64 Werte reduzieren. Solche Darstellungen werden gerne als 
Halbkomplex bezeichnet.

Ein Buch, was das ganze sehr gut verständlich erklärt (mit den ganzen 
Dingen wir Umklappen und co) heißt
"Fouriertransformation für Fußgänger" von Tilman Butz

Darin sind auch jede Menge Beispiele, die von Hand durchgerechnet 
werden, um das ganze zu Veranschaulichen.

Gruß Kai

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

FFT schrieb:
> Nein, ich behaupte, dass Joe G.s Antwort nicht richtig sein kann, weil
> bei eine N-Punkt FFT eben bis zu N komplexe Werte rauskommen - nicht N/2
> Werte.

Wie bei der Fourier-Transformation gelten auch für die DFT gewisse 
Symmetriegesetze. So wird ein reelles Signal im Zeibereich zu einem 
hermiteschen Signal im Frequenzbereich. Das bedeutet, dass im 
Frequenzraum nur N/2 unabhängige komplexe Koeffizienten vorliegen. Diese 
Tatsache kann bei der Implementierung der DFT ausgenutzt werden, wenn 
bekannt ist, dass das Eingangssignal rein reell ist. Für die Darstellung 
des Ergebnisses sind dann keine N (wie bei der vollen DFT), sondern nur 
N/2 komplexe Zahlen nötig. Die anderen N/2 komplexen Zahlen können durch 
elementare Rechnung rekonstruiert werden.

FFT schrieb:
> Nimms bitte nicht persönlich.

Ach warum denn? Der Plot stammt ja auch nicht aus einer fertigen FFT 
Routine sondern den habe ich mit der Summenformel der DFT in Mathcad 
erzeugt :-)

von Dumdi D. (dumdidum)


Lesenswert?

FFT schrieb:
> Ich habe hier nur einen Mikrocontroller zur Verfügung.

Und der ist nicht an einem PC angeschlossen? Womit sendest Du Deine 
Beitraege ab?

von cosy (Gast)


Lesenswert?

Hallo

Ich glaube, ihr überseht einen Aspekt: die Zeile mit dem *
hier (der logik halber die ganze Überlegung
-Für eine FFT muss man 2^n Samples haben
- Die Resultatswerte einer FFT von realen sample-werten sind imaginär
- Die höchste Grenzfrequenz, die bei FFT rauskommt, ist die halbe 
Abtastfrequenz
- Das Resultat des Ergebnisvektors besteht aus n Elementen (!)
* Das Resultat stellt eine symmetrische Reihe dar: in der Mitte ist der 
DC-Anteil (=Frequenz null) und rechts und links davon je die erste 
Frequenz mit 1/T, dicht daneben folgen die beiden -1/2T und 1/2T usw.. 
bis 1/((n/2)-1)T. wobei T die Abtastzeit war.
JAHWOHL!!! FFT generiert negative Frequenzkomponenten. Da diese 
symmetrisch zu den Positiven sind, können wir die negativen 
wegschmeissen und rechnen mit den Werten DC, 1/T, 1/2T, 1/3T...bis 
1/(n_halbe-1)T.

Anmerkung:

Genau dasselbe machen wir ja auch in der Nachrichtentechnik. Schon mal 
etwas von SSB gehöhrt?

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.