Forum: Digitale Signalverarbeitung / DSP / Machine Learning Ein paar Fragen zur FFT


von Dominik (Gast)


Lesenswert?

Hallo zusammen!

Ich hoffe mal ich hab mich jetzt in der Forenauswahl nicht komplett 
verhauen - wenn doch bitte verzeihen und verrschieben :)

Und zwar habe ich ein paar allgemeinere Fragen zum Thema FFT bzw. zu 
deren Anwendung.

Ausgangsbedingungen (momentan noch in der Theorie):

Es geht um eine Art Schalldruckmessung.

Ich digitalisiere mit einem µC ein Musiksignal.
Die Auflösung beträgt 8 Bit
Hierbei sind nur Frequenzen unter 250 Hz interessant.
Als Abtastrate wählte ich 500 Hz (250*2).
Die gesammte Abtastung dauert 30 Sekunden.

Die abgetasteten Werte (15000 an der Zahl) werden auf den Computer 
übertragen und sollen dort verarbeitet werden.

Hier soll jetzt eine FFT durchgeführt werden um herauszufinden bei 
welcher Frequenz der höchste Schalldruck vorlag.

Die gewünschte / benötigte Frequenzauflösung liegt bei 1 Hz.


Wie gehe ich jetzt am besten vor?


1. Entweder ich nehme die 15000 Werte, fülle mittels zero-padding auf 
16384 auf (2er-Potenz da FFT, alternativ wäre es wohl einfacher die 
Abtastrate um ein paar Hz zu erhöhen damit ich nicht so viel auffüllen 
muss :)) und mache dann eine komplette FFT mit N=16384 Punkten.

Hierbei erhalte ich eine Frequenzauflösung von 0,033 Hz (delta F = 
Abtastrate / Anzahl der Samples).


2. Angenommen ich möchte jetzt aber während der Messung eine (mehr oder 
weniger) Realtime-Anzeige der FFT haben.

Für meine gewünschte Frequenzauflösung von 1 Hz muss ich nach obiger 
Formel mindestens eine Sekunden abtasten und könnte dann jeweils eine 
FFT mit N=512 Punkten durchführen.
Ich könnte also meine "Realtime-Anzeige" mit etwa 1Hz aktualisieren.
Soweit richtig?

Im Endeffekt würde ich nach den 30 Sekunden also mit 30 einzelnen FFTs 
dastehen.
Hier stehe ich etwas auf dem Schlauch...
Wie müsste ich diese dann aufsummieren, um das Gesamtspektrum über die 
30 Sekunden zu erhalten?


3. Ich mach das ganze "doppelt".
30 mal die 512-Punkt-FFT für die Realtime-Anzeige
+
einmal am ende die "große FFT" mit allen Samples für die endgültige 
Ausgabe.

Vor-/Nachteile? (außer der doppelten Rechnerei)


Passt das soweit oder habe ich irgendwelchen groben Denkfehler gemacht?
Wäre super wenn mir noch jemand mit den unsicheren Punkten helfen könnte 
:)

Einen schönen Mittag wünsche ich!

Grüße
Dominik

: Verschoben durch Admin
von frame (Gast)


Lesenswert?

Ein paar Antworten aus der Kalten, sprich, aus dem teilverschütteten
Gedächtnis.

Eine FFT über N Werte ergibt nur N/2 Frequenzpunkte, die restlichen
sind 'virtuell' und vom Betrag mit ersteren identisch.

Der Rechenaufwand steigt enorm mit N an (entweder quadratisch oder
exponentiell, weiß ich nicht mehr aus dem Kopf).
Je größer N, desto besser die Auflösung, und desto größer der
Aufwand. Bei 8 Bit ADC-Daten lohnt sich N=16384 m.E. nicht,
irgendwann werden ADC-Ungenauigkeit, Rechen- und Rundungsfehler
größer als deine Koeffizienten...

N muß keine Zweierpotenz sein, erlaubt aber häufig einfachere
bzw. einfacher optimierbare Algorithmen. fftw (Linux FFT-Paket) kann
beliebige N.


> Hier soll jetzt eine FFT durchgeführt werden um herauszufinden bei
> welcher Frequenz der höchste Schalldruck vorlag.

Klingt, als wolltest du eigentlich die spektrale Leistungsdichte
wissen. Die FFT liefert erst einmal Real- und Imaginäranteil.
Die spektr. Leistungsdichte ist der Betrag derselben.


> Hierbei sind nur Frequenzen unter 250 Hz interessant.
>Als Abtastrate wählte ich 500 Hz (250*2).


Kommt auf die Anforderungen drauf an, aber 2 x f(max) ist etwas
wenig. Shannon besagt nur, daß du oberhalb von fs/2 --nichts-- mehr
sehen kannst.
Beispiel Audio: Die Abtastraten liegen üblicherweise bei 40...50 kHz,
z.B. CD-Format. Für das menschliche Hören ist hauptsächlich der Bereich
von 50 Hz ... 5kHz relevant, also zehnfaches Oversampling für die
relevanten Frequenzen.

von Marcel (Gast)


Lesenswert?

>>Kommt auf die Anforderungen drauf an, aber 2 x f(max) ist etwas
>>wenig. Shannon besagt nur, daß du oberhalb von fs/2 --nichts-- mehr
>>sehen kannst.

Das stimmt so auch nicht. Signale die oberhalb von fs/2 liegen, versauen 
dir natürlich noch das Signal, Stichwort: Alias-Effekt. Man kann mit 
diesen Signalanteilen natürlich nichts anfangen, als "Geister" machen 
Sie sich aber schon bemerkbar.

>>N muß keine Zweierpotenz sein, erlaubt aber häufig einfachere
>>bzw. einfacher optimierbare Algorithmen. fftw (Linux FFT-Paket) kann
>>beliebige N.

Dem würde ich auch nicht so ganz zustimmen. Afaik wird die Berechnung 
auf die gleichen Schritte/Funktionsaufrufe zurückgeführt, weswegen es 
keinen Unterschied in der Berechnungsdauer macht, ob man 300 oder 512 
Werte der FFT übergibt.

Eine Antwort auf die Fragestellung habe ich an der Stelle nun auch nicht 
direkt. Das ist aber sicherlich eine Sache, die sich experimentell sehr 
leicht überprüfen lassen sollte.

von Max G. (l0wside) Benutzerseite


Lesenswert?

frame schrieb:
> Ein paar Antworten aus der Kalten, sprich, aus dem teilverschütteten
> Gedächtnis.
Ui, da war aber schon ein leichter Hangrutsch am Werk...

> Eine FFT über N Werte ergibt nur N/2 Frequenzpunkte, die restlichen
> sind 'virtuell' und vom Betrag mit ersteren identisch.
Stimmt, die N/2 Werte sind dafür aber komplexwertig (d.h. Real- und 
Imaginärteil).


> Der Rechenaufwand steigt enorm mit N an (entweder quadratisch oder
> exponentiell, weiß ich nicht mehr aus dem Kopf).
Bei FFT mit N*log2(N), so schlimm ist es nicht.

> Je größer N, desto besser die Auflösung, und desto größer der
> Aufwand. Bei 8 Bit ADC-Daten lohnt sich N=16384 m.E. nicht,
> irgendwann werden ADC-Ungenauigkeit, Rechen- und Rundungsfehler
> größer als deine Koeffizienten...
Vorsicht. Die hinten fehlenden Bits lassen sich als Rauschen 
interpretieren (leider ist das nicht weiß). Mit der Frequenzauflösung 
hat das erst mal nichts zu tun. Wenn er irgendwo einen schmalen Peak 
sucht, muss die Wertauflösung nicht mal so toll sein, dafür ist eine 
ausreichende Frequenzauflösung notwendig.

>
> N muß keine Zweierpotenz sein, erlaubt aber häufig einfachere
> bzw. einfacher optimierbare Algorithmen. fftw (Linux FFT-Paket) kann
> beliebige N.
Eine FFT lässt sich nur für Zweierpotenzen rechnen. Mit aktueller 
PC-Rechenleistung ist der Laufzeitunterschied zur DFT aber 
vernachlässigbar, wenn es nicht gerade Echtzeitanwendungen oder große 
Datenmengen sind.

> Klingt, als wolltest du eigentlich die spektrale Leistungsdichte
> wissen. Die FFT liefert erst einmal Real- und Imaginäranteil.
> Die spektr. Leistungsdichte ist der Betrag derselben.
Nö, das Betragsquadrat.

> Kommt auf die Anforderungen drauf an, aber 2 x f(max) ist etwas
> wenig. Shannon besagt nur, daß du oberhalb von fs/2 --nichts-- mehr
> sehen kannst.
Er sagt nur, dass dort das Gleiche wieder von vorn anfängt. Der 
Ausgangswert ist mit f_s periodisch, deswegen schneidet man bei der FFT 
nach f_s/2 ab.


> Beispiel Audio: Die Abtastraten liegen üblicherweise bei 40...50 kHz,
> z.B. CD-Format. Für das menschliche Hören ist hauptsächlich der Bereich
> von 50 Hz ... 5kHz relevant, also zehnfaches Oversampling für die
> relevanten Frequenzen.

Du warst zu oft in der Disco. Der erwachsene Mensch hört bis irgendwo in 
den Bereich 15...20 kHz. 5 kHz ist nur knapp über Telefonbandbreite.

von frame (Gast)


Lesenswert?

> Vorsicht. Die hinten fehlenden Bits lassen sich als Rauschen
> interpretieren (leider ist das nicht weiß). Mit der Frequenzauflösung
> hat das erst mal nichts zu tun. Wenn er irgendwo einen schmalen Peak
Je größer N, desto größer auch die Anzahl der Operationen
(N*log2(N), wie du so schön geschrieben hast).
Wenn spektrale Leistungsanteil der meisten Koeffizienten in den Bereich
des ADC-Fehlers kommt, macht man sich genauigkeitsmäßig etwas vor.


>> Kommt auf die Anforderungen drauf an, aber 2 x f(max) ist etwas
>> wenig. Shannon besagt nur, daß du oberhalb von fs/2 --nichts-- mehr
>> sehen kannst.
> Er sagt nur, dass dort das Gleiche wieder von vorn anfängt. Der
> Ausgangswert ist mit f_s periodisch, deswegen schneidet man bei der FFT
> nach f_s/2 ab.
Wie oben erwähnt auch 'Alaising-Effekt' genannt.
"--nichts-- mehr sehen" heißt, aus dem berechneten Spektrum läßt sich
keine Aussage über Frequenzen größer fs/2 treffen.


> Du warst zu oft in der Disco. Der erwachsene Mensch hört bis irgendwo in
> den Bereich 15...20 kHz. 5 kHz ist nur knapp über Telefonbandbreite.

Du wohl eher.
Das Zauberwort heißt 'relevant'.
Weder erzeugt der Mensch bei normaler Sprache relevante Frequenzanteile
über 5 kHz (Frauen vielleicht ausgenommen), noch spielen sie für die
Sprachverständigung eine Rolle. Darum können die netten Medienkonzerne
auch ihre Watermarking-Abdrücke in dem Bereich ab ca. 8 kHz verstecken,
ohne das es wirklich den Höreindruck stört.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

frame schrieb:
> Weder erzeugt der Mensch bei normaler Sprache relevante Frequenzanteile
> über 5 kHz (Frauen vielleicht ausgenommen), noch spielen sie für die
> Sprachverständigung eine Rolle.

Für den Höreindruck bei Musik tun sie das allerdings. Mit 16 kHz 
abgetastete Musik will heutzutage niemand mehr hören.

> Darum können die netten Medienkonzerne
> auch ihre Watermarking-Abdrücke in dem Bereich ab ca. 8 kHz verstecken,
> ohne das es wirklich den Höreindruck stört.

Das hat damit nichts zu tun, die Maskierungseffekte erlauben es bei 
allen Frequenzen unhörbare Daten zu verstecken.

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.