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
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.
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.
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.
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 ....
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.
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.
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.
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...
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.
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...
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.
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
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
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 :-)
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?