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
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.
>>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.
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.
> 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.
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.