Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT-Grundlegendes Verständnis


von Michael M. (skyscater)


Lesenswert?

Hallo, ich hab vor einen Audio Spektrum Analyzer zu bauen und steck 
gerade bei der Umsetzung von der FFT.
Ich hätt in den unteren Frequenzbereichen gerne eine Auflösung von 5Hz.
Womit ich die Werte doch 200ms aufnehmen muss oder(Ich nehm die Werte 
auf und für auf diese dann die FFT aus)?
Somit hätte ich eine Aktualisierungsrate von 5Hz. Was nun wirklich 
extrem wenig ist. Pc-Programme schaffen doch auch bei weitem mehr. Ich 
komm nur nicht drauf wo da mein Denkfehler liegt.
Würde mich freuen wenn mich jemand aufklährt.
mfg. skyscater

von Freddy (Gast)


Lesenswert?

Neee, da hast Du was noch nicht richtig verstanden.

Erstmal musst Du deine maximale Frequenz fmax wissen, denn es gibt da so 
ein Abtasttheorem: Abtastfrequenz fA > 2*fmax

Nehmen wir also einfach mal fA = 40kHz, dann ergibt sich die 
Frequenzauflösung deiner fft in Abhängigkeit der Zahl der Abtastwerte N, 
mit denen Du das Spektrum berechnest. deltaf = fS/N.

N kansnt du dir ja selber aussuchen, in meinem Beispiel mit deltaf = 5Hz 
N= fS/deltaf= 8000

von Michael M. (skyscater)


Lesenswert?

Wenn ich das N mit 8000 annehme, muss ich das Signal bei einer 
Samplingrate von 40kHz -> 8k/40k = 0,2 = 200ms lang aufnehmen. Womit wir 
wieder bei der Aktualisierungsrate von 5Hz währen. Oder hab ich da 
wieder was falsch verstanden?
mfg.skyscater

von Freddy (Gast)


Lesenswert?

Ja jetzt versteh ich deine Frage auch erst, sorry.

Dann stimmt das mit den 200ms.

von Michael M. (skyscater)


Lesenswert?

Wie wird das in den ganzen Programmen realisiert? Wenn die eine 
Auflösung von 5 Hz haben aktualisiert sich die Anzeige ja trotzdem 
schneller. Das Die Frequenz 5Hz sich nur 5mal sekündlich ändern kann ist 
mir klar, aber alle anderen (höheren) Frequenzen ändern sich ja 
schneller. Hoffe ihr vertseht was ich meine.
mfg.skyscater

von Sven H. (dsb_sven)


Lesenswert?

Ich denk mal, die nutzen so eine Art Ringbuffer.

Wenn du z.B. 200ms aufnimmst und dann die Daten auswertest, dann aber 
den Speicher nicht leer machst, sondern nur z.B. 20 weitere Werte 
einliest und in den Speicher "schiebst" so dass die 20 ältesten Werte 
raus fliegen, hast du eine höhere Aktualisierungsrate.

von Udo S. (urschmitt)


Lesenswert?

Du brauchst eine zeitliche Mindestlänge um die tiefen Frequenzen 
erfassen zu können.
Aber bei genügender Rechenpower hindert dich niemand daran alle 10 oder 
20 ms die letzten n Werte zu nehmen und zu rechnen und entsprechend oft 
deine Anzeige zu aktualisieren. Daß die Werte dann zu einem Großteil 
überlappen stört ja nicht.
Wobei das kein Ballerspiel ist. Zu schnelle Änderungen in einer Anzeige 
dienen oft nur noch zur Verwirrung.

von Robert K. (Firma: Medizintechnik) (robident)


Lesenswert?

Michael Mokricky schrieb:
> aber alle anderen (höheren) Frequenzen ändern sich ja
>
> schneller.

Nein, auch eine 5Hz-Frequenz kann die Amplitude rascher ändern. Das 
ergibt esben ein Frequenzgemisch.

Dasselbe ist es, wenn eine 10kHz-Welle langsam den Offset ändert: Ergibt 
eine eingebaute 10 Hz-Welle.

Du analysierst immer einen Signalverlauf und splittest ihn in 
Frequenzen. Die Betrachtung, dass du eine Frequenzgemisch splittest, ist 
zwar richtig, aber es ist letztlich eine 2D-2D-Abbildung, die zu keinem 
anderen Ergebnis führt.

Wenn Du einzelene Frequenzen betrachtest, dann darf sich die Frequenz 
gar nicht ändern, denn dadurch tauchen sofort immer andere mit auf. Wenn 
du die Amplitude einer starren Frequenz erhöhst, ist das während der 
Erhöhung so, als währe die Frequenz etwas geringer. Wenn Du die Phase 
vor schiebst, ist es so, als wäre sie höher.

In den Übergängen gibt es immer zusätzliche oder geänderte Frequenzen.

von Martin Schmidlechner (Gast)


Lesenswert?

An und für sich gibt es da auch noch einen ganz anderen Ansatz. Wenn man 
das Spektrum von Audiodateien über der Zeit ansehen will hat man genau 
das gleiche Problem: entweder wählt man ein kurzes Zeitfenster, also 
hohe zeitliche Auflösung, hat dann aber keine Auflösung mehr im unteren 
Frequenzbereich. Oder man wählt ein langes Zeitfenster, hat dann zwar 
eine gute Auflösung bei den tiefen Frequenzen, jedoch keine gute 
Zeitauflösung mehr.

Hier geht man folgenden (wesentlich komplizierteren) Weg:
Man beginnt mit kurzen Zeitfenstern. Das ergibt eine gute Zeitauflösung, 
verwendet aber nur die obere Hälfte des Spektrums für die direkte 
Darstellung. Die untere Hälfte des Spektrums kombiniert man aus 2 
Zeitfenstern zu einem neuen, doppelt so langen Zeitfenster zusammen. Man 
halbiert also für die untere Hälfte die zeitliche Auflösung und 
verdoppelt dabei gleichzeitig die Frequenzauflösung. Auch davon 
verwendet man aber wieder nur die obere Hälfte des Spektrums direkt und 
kombiniert wieder von 2 aufeinanderfolgenden Spektren die untere Hälfte 
zusammen undsoweiter.

Mit jeder Oktave (von oben nach unten) halbiert sich also die zeitliche 
Auflösung und verdoppelt sich die Frequenzauflösung (die damit auf die 
logarithmisch angeordneten Töne immer gleich ist). Dies wiederholt man 
solange bis man auch im untersten sinnvollen Bereich die gewünschte 
Frequenzauflösung erreicht.

Wenn man alles richtig macht, ist das Verfahren auch umkehrbar. D.h. man 
kann das Spektrum editieren und anschließend wieder in das Zeitsignal 
zurückrechnen. Ich habe zu diesem Thema vor vielen Jahren eine 
Diplomarbeit gelesen, die ich jetzt nicht zur Hand habe, aber vl. 
herausfinden könnte wie sie heißt. Meines Wissens habe ich eine Kopie 
angefertigt und irgendwo herumliegen. Da müsste auch die Berechnung 
dokumentiert sein - kann man sich aber (wenn man den Fourier verstanden 
hat) aber sicher auch selbst überlegen.

Ein digitales Filter müsste sich auch auf diese Weise realisieren lassen 
(um gleichermaßen kurze Durchlaufzeit für hohe Frequenzen und präzise 
Bearbeitbarkeit tiefer Frequenzen im Frequenzbereich zu realisieren). 
Man erhält dabei offensichtlich unterschiedliche Durchlaufzeiten für 
hohe und tiefe Frequenzen, also auch ohne Bearbeitung nicht mehr das 
Originalsignal.

von J. S. (engineer) Benutzerseite


Lesenswert?

Jo gibt es. Das wird entweder als Oktavfilter ausgeführt oder man nutzt 
nicht eine linear verteilte FFT sondern eine logarithmisch angeordete, 
wo die Freuquenzen gleich in Audiofrequenzen messen sind.

Es bleibt aber denoch das Problem der Latenz und damit der Zuordnung der 
Frequenzen: Eine Basswelle beinhaltet Information aus einem viel 
längeren zeitlichen Bereich und kann nicht so ohne Weiteres mit einer 
hochfrequenten Welle wieder vereint werden. Selbst bei phasenlinearen 
Filtern ist das ein Erschwernis, zumal die FFT infolge des 
leakage-Effektes nie 100% arbeitet und Artefakte bringt.

Ich habe mir mal testweise eine lückenhafte FFT aufgezogen, die nur 
Audiofrequenzen kennt, die aber ihrerseits ganzzahlig in die 
Messperioden passen. Wenn man sie komplex ausführt, gelangt man in der 
Tat zu einem Ergebnis, dass wieder synthesefähig wird, also z.B. zu 
einem Equalizer, der wirklich annähernd unverzerrt wieder gibt. Ich 
benutze einen solchen EQ fürs professionelle Mastering in meiner 
FGPA-Workstation.

Problem: Man hat gewaltige Latenzen und einen ordentlichen RAM-Bedarf. 
Ein solcher Konstrukt eigent sich damit nicht für wirtschaftliche 
Produkte, ist also nicht verkäuflich.

von Unwissender (Gast)


Lesenswert?

ich hänge mich mal an die Diskussion dran, da ich eine grundlegende 
Frage habe:

Freddy schrieb:
> Nehmen wir also einfach mal fA = 40kHz, dann ergibt sich die
> Frequenzauflösung deiner fft in Abhängigkeit der Zahl der Abtastwerte N,
> mit denen Du das Spektrum berechnest. deltaf = fS/N.

Welcher Frequenz entspricht denn dann die erste und die letzte Frequenz, 
die die FFT ermittelt?

von Robert K. (Firma: Medizintechnik) (robident)


Lesenswert?

Eigentlich einfach: Es ist der Frequenzbereich 1/n  und (n-1)/n

von Johannes E. (cpt_nemo)


Lesenswert?

Robert Kuhn schrieb:
> Eigentlich einfach: Es ist der Frequenzbereich 1/n  und (n-1)/n

Der erste Wert, den die FFT ermittelt, liegt üblicherweise bei 0 Hz!
Der zweite Wert bei N/T und der letzte dann bei (N-1)/T, die Anzahl der 
Punkte ist N, T ist die Länge des Messintervalls.

Ich denke aber nicht, dass das den Fragesteller noch interessiert, die 
Frage ist schon ein paar Monate her.

von J. S. (engineer) Benutzerseite


Lesenswert?

Johannes E. schrieb:
> Der zweite Wert bei N/T
Du meintest sicher 1/T?

Die mathematische Punkte sind ja N = 0 ... 1 (n-1) und die beiden ersten 
damit (N=0)/T und (N=1)/T.

Was in dem Zusammenhang aber nochmal erwähnt werden sollte, ist der 
Umstand, dass diese sich bei der FFT real ergebenden Werte 
Repräsentanten eines Frequenzbandes sind.

Die erste FFT-Frequenz-Wert ist daher nicht die Frequenz 0 = 
Gleichstrom, sondern beinhaltet einen gehörigen Anteil an geringen 
Frequenzen, die bei der Berechnung dort hineingemappt werden.

Der echte Gleichanteil wird nur dann exakt erzielt, wenn eine unendliche 
(oder in der Praxis "genügend hohe") Zahl an Punkten verwendet wird.

von Johannes E. (cpt_nemo)


Lesenswert?

Juergen S. schrieb:
> Du meintest sicher 1/T?

Ja, da habe ich mich vertippt.

von Markus F. (Gast)


Lesenswert?

Johannes E. schrieb:
> Der erste Wert, den die FFT ermittelt, liegt üblicherweise bei 0 Hz!
> Der zweite Wert bei N/T und der letzte dann bei (N-1)/T

Meinst Du mit N die Punkte der Eingangsdaten oder der Frequenzen?

Üblicherweise gehen N Daten rein und M Daten raus, wobei N=M. Wegen der 
Spiegelfrequenzen ist die obere Hälfte identisch. Also gilt M=N/2.

Wie passt das aber damit zusammen, dass die erste Frequenz 0 ist und die 
letzte N-1? Die wären da dann nicht exakt symmetrisch zu einander, oder 
nicht?

Bei einer 16fach FFT sieht das Spektrum in etwa so aus:

.*              *.
.*              *.
.*              *.
.*      **      *.
.**     **      *.
.*** *  **  * ***.
.****************.
.0123456789abcdef.
.0123456776543210.

also voll Symmetrie. Dann kann doch die letzte nicht N-1 sein sondern N, 
oder irre ich jetzt?

von Johannes E. (cpt_nemo)


Lesenswert?

M. Fritsch schrieb:
> Meinst Du mit N die Punkte der Eingangsdaten oder der Frequenzen?
>
> Üblicherweise gehen N Daten rein und M Daten raus, wobei N=M. Wegen der
> Spiegelfrequenzen ist die obere Hälfte identisch. Also gilt M=N/2.

Wenn man N Punkte im Zeitbereich hat und davon eine DFT bzw. FFT 
berechnet, dann bekommt man auch N Punkte im Frequenzbereich.

Die obere Hälfte im Frequenzbereich ist spiegelbildlich, wenn das Signal 
im Zeitbereich reel ist. Aber trotzdem hat man M=N Punkte im 
Frequenzbereich.

> Wie passt das aber damit zusammen, dass die erste Frequenz 0 ist und die
> letzte N-1? Die wären da dann nicht exakt symmetrisch zu einander, oder
> nicht?

Ja, das ist richtig. der erste Punkt im Frequenzbereich ist 0.

Der zweite Punkt ist bei 1/T, der letzte Punkt bei (N-1)/T, diese beiden 
Punkte sind spiegelbildlich zueinander, genau so wie 2/T und (N-2)/T, 
...

Durch die Abtastung ergibt sich ein periodisches Spektrum mit Periode N, 
des Spektrum wiederholt sich also in beide Richtungen periodisch.

Das bedeutet, dass der Punkt N im Spektrum gleich dem Punkt 0 ist. Damit 
hat man auch hier wieder eine Symmetrie, genauso ist der Punkt -1/T 
gleich dem Punkt (N-1/t).

> Bei einer 16fach FFT sieht das Spektrum in etwa so aus:

Nein, so sieht das nicht aus!

Eher so:

x               x
x               x
x       x       x
x      xxx      x
xx     xxx     xx
xxx x  xxx  x xxx
xxxxxxxxxxxxxxxxx
0123456789abcdef0
01234567876543210

Ich habe 17 Punkte im Frequenzbereich gezeichnet, dadurch sieht man die 
periodische Wiederholung; die FFT liefert nur die vorderen 16 Punkte.

von Ch. M. (matoph)


Angehängte Dateien:

Lesenswert?

Hallo

Um herauszufinden, was die FFT liefert, habe ich im LabVIEW ein kleines 
Spielchen gemacht:

Die FFT erwartet einen numerischen Array der Länge 2 hoch x (x: 
natürliche Zahl). Das ergibt dann N Werte.
Die Routine liefert als Resultat einen ebensolangen komplexen Array. Wie 
wir bereits gesehen haben lässt sich der Betrag der Frequenzanteile 
mittels Pythagoras berechnen.

Die FFT hat ja keine Ahnung was beim Abtasten zeitlich geschah; sie 
interessiert sich nur für die Fensterfigur, egal ob es um ns oder 
Stunden geht.

Jetzt interessiert es mich aber, wo die FFT die Spektrallinie hinlegt, 
wenn ich mit einer Sinuskurve daher komme.

Ergebnis:

Wenn ich eine einzige Periode in den Eingangsarray gebe, landet die 
Spektrallinie im  Arrayelement 1 (Der Array beginnt bei Index 0).

Wenn ich drei Perioden in den Eingangsarray gebe, landet die 
Spektrallinie im  Arrayelement 3.
u.s.w.

Das ist unabhängig von der Arraylänge, die muss einfach 2 hoch x sein.

Jetzt kann man ja die Zeit rsp. die Frequenz ins Spiel bringen.
Wenn das Zeitfenster 1s ist, dann habe ich mit einer Periode die 
Frequenz 1Hz.
Weil ich weiss, dass im Element 1 des Spektrumarrays der Ausschlag zu 
erwarten ist, habe ich somit die Skalierung der Frequenzachse.

Gruss Matoph

von Robert K. (Firma: Medizintechnik) (robident)


Lesenswert?

Und was ist nun das Ergebnis dieser Überlegung?

von Tom W. (Gast)


Lesenswert?

Martin Schmidlechner schrieb:
> Ein digitales Filter müsste sich auch auf diese Weise
> realisieren lassen (um gleichermaßen kurze Durchlaufzeit für
> hohe Frequenzen und präzise Bearbeitbarkeit tiefer Frequenzen
> im Frequenzbereich zu realisieren).
Das ginge in Richtung Halbbandfilter oder ?

von Detlef E. (the_sugar_c)


Lesenswert?

Hey Leute habe ma eine Frage zu FFT. In einer lyrik stand, dass man die 
erfassten diskrete Werte nicht gleich fourier transformiert sondern erst 
zwischenspeichert. Warum ist das so ?


Danke im Voraus

von Markus F. (Gast)


Lesenswert?

Da keiner geantwortet hat: Die gesampelten Werten werden gfs. mehrfach 
benötigt.

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.