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
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 ;)
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.
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
Uuhps, peinlich, ich habe eine 0 vergexssen :) es sind natürlich 2kHz, nicht200 Hz.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.