Thema: Delphi Problem bei FFT

Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#21

Re: Problem bei FFT

  Alt 30. Jan 2007, 07:53
Zitat:
EDIT: Heureka, es funktioniert. Ich geb euch allen ne Runde an der DP-Bar aus.
Ich nehme an, dass ich nicht mehr direkt antworten brauche.

Trotzdem noch ein paar Bemerkungen zur FFT/DFT: Da du sie anscheinend das erste Mal verwendest.

Zitat:
1. Problem: Eine FFT kann nur mit 2^m (0<=m<unendlich) Abtastungen arbeiten. Meine Lösung: Anhängen von Nullen, bis die Zahl der Abtastungen eine Zweierpotenz ist.
Mit dem Anhängen von Nullen verfälschst du das Ergebnis. Besonders der Knick an der Stelle, wo die Nullen anfangen, bringt dir Frequenzen ins Spektrum, die du so nicht hättest. Teste das mal an dem einfachen 10Hz-Sinus.
Dem kannst du mit einer DFT aus dem Weg gehen. Die ist ein bisschen einfacher zu programmieren. Und in Zeiten von 3GHz-Prozessoren dürfte der Zeitunterschied sehr gering sein.

Zitat:
2. Problem: Erhalten einer Spitze. Ich nehme hierfür einfach den Maximalwert aus dem Array.
Da weis ich nicht, warum und wofür.

Zitat:
3. Problem: Umrechnen des Wertes in eine Frequenz.
Hast du anscheinend hinbekommen. Ansonsten stehts ein paar Beiträge weiter oben.


Zitat:
Sie enthält einen Ton der länge t ms, die Abtastfrequenz ist a Hz. Damit ist die Anzahl der Abtastungen n=t*a/1000.
Die WAV-Datei enthält einen Sinuston von f Hz.
Ok, Anwendung der FFT/DFT:
Du hast einen bestimmten Zeitabschnitt eines Signals und willst wissen, welche Frequenzanteile mit welcher Amplitude und welcher Phasenlage in dem Signal sind. Erweiterung für unser obiges Bsp:
for n:=0 to 1023 do a[n]:=1+5*sin(2*pi*10*n/1000)+8*sin(2*pi*80/1000); So jetzt hast du neben den 10Hz auch noch einmal 80Hz mit Amplitude 8 und 0Hz (also Gleichanteil) von 1.
Das sollte nach der FFT auch wieder herauskommen.
In dieser Form kann man quasi jedes Signal aus seinen einzelnen Schwingungen zusammensetzen. Das kann auch ein Rechtecksignal sein, oder ein Dreieck, oder eine e-Funktion. Kannst ja mal alles testen, welches Spektrum da so herauskommt.
Zu dem Beispiel kann man noch ein Phasenlage hinzubringen (also den Sinus etwas verschieben):
for n:=0 to 1023 do a[n]:=1+5*sin(2*pi*10*n/1000+pi/2)+8*sin(2*pi*80/1000); Ich hab die 10Hz mal um 90° verschoben. Das bekommst du aus der FFT heraus, wenn du die Differenz der Werte von arctan(Im/Re) auswertest.

Dementsprechend kannst du deinen Auswertezeitraum so festlegen, dass er von der Länge her einer Zweierpotenz entspricht(z.B. 1024 Werte). Wenn da dein Sinuston mit f Hz drinn ist, solltest du den auch im Sprektrum sehen, neben vielen anderen Tönen.
Jetzt hast du zwei Möglichkeiten
-gleitende FFT: Du verschiebst dein FFT-Fenster nicht um 1024 Werte weiter für die nächste Auswertung, sondern nur um 1, 10 oder 100
-nicht gleitend: Du verschiebst es halt um 1024 Werte



Jetzt etwas Grundsätzliches:
Eine Fourieranalyse ist etwas ganz Tolles. Aber sie ist nicht der Weisheit letzter Schluss. Sie ist eigentlich nur der Einstieg in die Signalanalyse. Folgende Probleme bei der FFT fallen mir spontan ein:
1. Die FFT ist natürlich diskret (deswegen haben wir nur für bestimmte Frequenzen den richtigen Wert, alle anderen Frequenzen verteilen sich mit auf die Umliegenden (wie wir bei 10Hz und 1024 Abtastwerten ja gesehen haben)
Lösung: Du machst für Frequenzen, die du exakt haben möchtest eine eigene DFT, wo die Anzahl der Abtastwerte ein Vielfaches der zu untersuchenden Frequenz ist. (Geht natürlich nur, wenn du auf bestimmte Frequenzen testen willst/kannst.)
2. Wenn du dir aus deinem Signal die 1024 Werte nimmst, bekommst du nur gute Ergebnisse, wenn du dieses Fenster quasi x-mal aneinander hängst und danach keine Sprünge im Signal sind (an den Fenstergrenzen).
Lösung:Fensterfunktionen
3. Du wirst es nie schaffen, alle Frequenzen exakt aus dem Signal herauszubekommen (ausser es ist so sauber, wie in unserem Beispiel), dass muss dir bewusst sein. Es befassen sich x Bücher und dahinter Wissenschaftler mit diesem Thema der Signalanalyse. Die FFT ist ein Werkzeug, aber kein Perfektes. Prony-Methode ist z.B. ein anderes. die Methode geht dann über Differentialgleichungen. Und hat natürlich auch wieder Nachteile.


Edit:
-Grobe Rechtschreibfehler korrigiert
-Für die Analyse von Musik um bunte Bildchen darzustellen, à la Visualisierung in diversen Media-Playern reicht die FFT(DFT) aus.

Edit2: Hier ist auch noch ein schöner Link, um bildhaft zu zeigen, was Knicke im Signal bedeuten (deine Nullen oder falsche Fensterung)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat