Forum: Mikrocontroller und Digitale Elektronik Audiofrequenz ermitteln.


von Marc (Gast)


Lesenswert?

Hallo Leute,

ich möchte von 10 Mikrofonen die Audiofrequenz ermitteln. Im Prinzip ist 
die Vorgehensweise klar ..

Mic Amp -> ADC -> µC -> FFT

die FFT sollte am besten mit 1024 Werten arbeiten. Abtastrate 44kHz also 
rund 42Hz Auflösung (?)..

Ich weis nur nicht so recht welchen µC ich nutzen soll.. Erfahrung und 
Equipment habe ich für AVR (AVRstudio + JTAG), 8051 (Silabs) und ARM7/9 
(Keil). Die Daten aus der FFT brauche ich nur für die stärkste Frequenz 
rauszufinden und anzuzeigen bzw. über UART ausgeben (also z.B. Eingang 
1: 84Hz).Danach werden die Daten verworfen. Ich denke 10-20 mal / 
Sekunde sollte mehr als ausreichend sein.

Ich wollte das so machen .. 1024 Punkte messen, FFT berechnen, Ausgeben. 
In der Zwischenzeit der Berechnung werden die nächsten 1024 Punkte 
bereich angefangen zu messen. Damit hab ich zwar nur Momentaufnahmen, 
aber das reicht.

Welchen Prozessor / ADC würdet ihr dafür nutzen? Mangeln Erfahrung und 
Equipemnt mit DSPs würde ich ungern einen verwenden. Mehrere µC wären 
auch ok ..

Derzeit habe ich mir einen STR910 ausgekuckt (zumal ich auch noch paar 
hier hab davon).

Grüße & THX

von Mandrake (Gast)


Lesenswert?

Wenn du nur die stärkste Frequenz rausfinden willst brauchst du keine 
FFT.
Du musst nur deine 1024 Abtastwerte autokorrelieren. Bei der 
Grundfrequenz, die eigentlich immer die stärkste Frequenz ist, bekommst 
du ein deutlich hervortretendes Maximum. Bzw. stimmt nicht ganz. Du 
bekommst in der AKF (Autokorrelationsfunktion) bei der Periodendauer der 
Grundfrequenz ein Maximum, da die AKF ja eine Zeitdifferenzachse hat.

Die Auflösung ist korrekt: 22kHz / (0,5 x 1024) = 42Hz

Bezüglich AKF solltest du mal nach Faltungssumme und AKF suchen.

von Marc (Gast)


Lesenswert?

hmm ok .. könntest du mir das was ausführlicher erklären? Könnte ich 
damit dann auch die Lautstärke später herausfinden sofern ich das mal 
will?

Für den STR9 dachte ich, weil er Single Cycle DSP-Befehle hat, mit 96MHz 
sowieso nicht grade langsam ist und auch weil es von ST auch eine fertig 
FFT Lib gibt, die mir die Arbeit etwas erleichter g

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

"Nur" ist gut... die FFT ist viel schneller als eine Autokorrelation. 
Für den AVR sind 100 1024-Punkte-FFTs pro Sekunde wahrscheinlich zu 
viel, aber mit dem ARM geht das locker.

von Mandrake (Gast)


Lesenswert?

Mit einer FFT allein wirst du allerdings auch nicht auskommen. Deshalb 
ist die AKF-Methode am Ende vielleicht genauso aufwendig.
Bevor du nämlich eine FFT machst solltest du deinen Datenframe 
"fenstern".
Etwa mit einem Hanning-Fenster oder einem Cosinus-Roll-Off. Ansonsten 
geht dein Nutzsignal zu sehr im Spektrum des benutzten Fensters (dann in 
deinem Fall ein Rechteckfenster) unter und du siehst nur das Spektrum 
deines Rechteck-Fensters (also eine schöne si(f) Funktion).
Zudem wirst du nach der Transformation mit Sicherheit das 
Betragsspektrum oder das Betragsquadratspektrum (das ist dann das 
Leistungsdichtespektrum was wiederum die FFT der AKF ist) verwenden. 
Denn dein FFT-Spektrum ist nicht reell.

Also:
Andreas kann recht haben, dass eine FFT auf einer bestimmten CPU 
schneller zu rechnen geht als eine AKF. Da habe ich keine Erfahrung.
Sicher kann ich nur sagen, dass mit "einfach eine FFT und fetig" noch 
nicht viel gewonnen ist. Ganz im Gegenteil. Danach fängt die Arbeit 
eigentlich erst an. Das Signal muss etwa so aufbereitet werden, dass man 
die Infos die man haben möchte auch sauber herausnehmen kann.
Ich empfehle daher sich vorher etwas mit Integraltransformationen 
speziell
der Fouriertransformation sowie der diskreten Fouriertransformation zu 
beschäftigen. Trivial ist das Thema eindeutig nicht.
Ein fundiertes Wissen um die System und Signaltheorie kann hier auch 
nicht schaden.

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.