Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT - brauchbar?


von Randalf (Gast)


Lesenswert?

Hallo,
ich möchte auf meinem Mikrocontroller (ein LPC2148) gerne eine kleine 
FFT zur Darstellung eines Audiosignals machen. Das ganze muss nicht 
wirklich genau sein, nur möglichst schnell, da der Prozessor noch andere 
Dinge tun soll.
Ich würde gerne sagen wir mal 10 Frequenzbänder auf meinem Display 
anzeigen lassen von 0-20 kHz. Ergibt also 200 Hz pro Frequenzband. Der 
ADC hat 10 Bits. Nun habe ich mir mal die fix_fft runtergeladen und in 
Visual Studio zum Laufen gebracht, um das ganze zu testen 
(http://jjj.de/fft/fftpage.html).

Frage 1:
Wie muss ich jetzt weiter vorgehen, um brauchbare Resultate zu erhalten? 
Ich muss ja mittels Timer und ADC das Signal periodisch abtasten, und 
ich möchte 200 Hz breite Frequenzbänder. Wie gehe ich jetzt vor?

Frage 2:
ich habe beim Test in Visual Studio ein Array mit Daten gefüttert (z.B. 
ein Sinus, oder ein Rechtecksignal) und die FFT darüber laufen lassen 
(fix_fftr, da es sich um reelle Daten handelt). Ich erhalte auch ein 
Ausgangsspektrum. Sind das nun direkt die Amplituden der einzelnen 
Komponenten, oder was ist das? Es sind nämlich viele negative Werte 
dabei, und das kann ja eigentlich nicht sein. Was soll ich mit den 
negativen Werten machen? Ich kann die schlecht auf das Spektrum-Display 
ausgeben....

: Verschoben durch Admin
von Finsbury (Gast)


Lesenswert?

du solltest dich dringend mal mit Fourierreihen/der 
Fouriertransformation allgemein vertraut machen. Da ist nichts 
mystisches bei und dann wirst du auch verstehen wie und warum ein 
Spektrum bei diskreter Abtastung so und so aussieht und woher die 
"negativen" Amplituden kommen ;)

von moe (Gast)


Lesenswert?

Spricht etwas gegen eine Filterbank mit 10 Bandpässen, deren 
Grenzfrequenzen aneinander liegen? Ist einfach zu dimensionieren 
(Matlab/Octave/Scipy) und im µC zu implementieren. Außerdem kommt als 
Ergebnis direkt ein einzelner Wert für jedes Band heraus. Auch der 
Rechenaufwand dürfte deutlich niedriger liegen als bei einer FT.

Im Elektor-Sonderheft "Mikrocontroller 1" von Nov. 2006 wurde das am 
Beispiel des ATMega8 behandelt.

Falls du trotzdem eine FT einsetzen möchtest, kannst du dir auch die 
Kosinus-Transformation (Stichwort DCT) anschauen, die ist für relle 
Eingangswerte schneller und kompakter.

Je nach Anspruch an das Ergebnis sollte man auch die Randbedingungen 
einer FT beachten, siehe "Zero-Padding", "Windowing" und "Overlap" 
(Overlap-Add oder Overlap-Save).

Das Buch "Fouriertransformation für Fußgänger" von Tilman Butz bietet 
einen guten Einstieg in die Grundzüge der FT. Sollte in der 
Uni-Bibliothek vorhanden sein.

von Jobst M. (jobstens-de)


Lesenswert?

Randalf schrieb:
> Ich würde gerne sagen wir mal 10 Frequenzbänder auf meinem Display
> anzeigen lassen von 0-20 kHz. Ergibt also 200 Hz pro Frequenzband.

Nochmal nachrechnen bitte ... :-)


Gruß

Jobst

von Randalf (Gast)


Lesenswert?

Uuhps, peinlich, ich habe eine 0 vergexssen :)
es sind natürlich 2kHz, nicht200 Hz.

von Andreas F. (aferber)


Lesenswert?

Randalf schrieb:
> Uuhps, peinlich, ich habe eine 0 vergexssen :)
> es sind natürlich 2kHz, nicht200 Hz.

Sinnvoller ist allerdings eine logarithmische Aufteilung, da das mehr 
dem Tonhöhenempfinden des Gehörs entspricht. Eine Oktave bedeutet eine 
Verdoppelung der Frequenz. Siehe dazu auch die üblicherweise bei 
Equalizern zu findende Aufteilung.

Bei linearer Aufteilung in 2kHz-Schritten spielt sich Musik oder Sprache 
dann zum grössten Teil nur im untersten Band ab, im Rest siehst du fast 
nur noch Oberwellen.

Andreas

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.