mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenz über Mikrofon einlesen ATmega16 oder 32


Autor: Tobias Weiß (tobis)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Projekt:

Ich möchte von einen mit dem Mikrofon aufgenommenen Ton die Frequenz 
ermitteln und dann weiterverarbeiten mit dem ATmega8/16/32. Der Ton 
entseht beim klopfen auf die Saite eines Tennisschlägers. Im Amhang hab 
ich mal den Frequenzgang einer "Klopfaunahme" mit dem PC dargestellt. Je 
nach Schläger(und dessen Bespannug) können Töne entstehen die von 
Minimum 400Hz bis Maximum 800Hz liegen(in der angehängten Datei liegt 
der angestrebte Wert bei 576MHz). Wie man aber auf dem Spektrum erkennen 
kann sind auch andere Frequenzen aufgenommen worden. Wie schaffe ich es 
nun diese eine Frequenz zu digitalisieren(in einem ATmega8/16/32)????

Mein erster Ansatz war:

Mikrofon an Vorverstärker, das Signal filtern (bandpass von ca 400 bis 
800Hz)und das Ganze an den NE555. Dieser erzeugt eine Rechteckspannung 
welche dann an einem IO-Port gelegt wird. Nun die Zeit einer Periode 
messen (flanke zu flanke)und man sollte die Frequenz erhalten.

Ich weiß allerdings nicht ob dies auch wirklich funktioniert, vor allem 
ob man aus dem NE555 wirklich die entscheidende Frequenz ( im 
angehängten Spektrum bei 576Hz) bekommt oder ob noch diverse andre 
Freqeunzen überlagert sind am Ausgang....???

Oder gäbe es einen anderen Ansatz wie man dies bewerkstelligen könnte?

Bitte um Hilfe!

mfg tobi

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ist hier was für dich bei: 
Beitrag "Stimm / Gesangsanalyse"

In deinem Screenshot stehen eigentlich alle Infos drin um das zumindest 
grundlegend nachzuprogrammieren: Mit einem Hanningfenster (der Länge 
4096?) in die Frequenzdomäne überführen und das Maximum auswählen.

Wie schnell muss das sein (Verzögerung, Wiederholungen pro Sekunde), wie 
Genau muss das sein (1%, 10%, ...)

... und vielleicht kurz über Bildformate informieren

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mikrophon -> Verstärker -> ADC des AVRs -> FFT oder Görtzel-Filter -> 
Fertig. ?

Für FFT gibts fertige AVR-Sourcen, einfach mal in die Codesammlung 
schauen.

und für deine Frequenzen ist der AVR-Adc allemal schnell genug.

Autor: Tobias Weiß (tobis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke erstmal für die infos...

problem:

ich programmiere lediglich in assembler und das noch nicht allzulange. 
:)

für mein erstes (großes ) projekt helfen mir euro anweisungen bis jetzt 
nur bedingt...leider :)

sollte ich mich vorher lieber in c einarbeiten?
oder ist das mit assembler ohne weiteres möglich?
(für eine anfänger)
mfg

Autor: Tobias Weiß (tobis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja: schnell muss das ganze überhaupt nicht sein! man will quasi 
einen schläger testen, startet die aufnahme, klopft auf den schläger, 
und wartet auf das ergebniss. Also geschwindigkeit ist völlig egal.

Die auflösung hingegen sollte möglichst geanu sein, also eine Auflösung 
von 1Hz wäre wünschenswert!! mehr als 3 Hz dürfen esa ber nicht sein da 
sonst die weiter berabeitung nicht sinnvoll ist!!

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 400 Hz Bandbreite mit 1 Hz Auflösung wird's mit dem Speicher doch 
recht eng in einem AVR - auch in Assembler. Sollte aber gerade so 
machbar sein.

Assembler ist halt was anstrengender. Ich empfehle folgendes Vorgehen:
- Denk dir einen Algorithmus aus und prüfe, ob das von den Eckdaten 
(Speicherbedarf, Geschwindigkeit, etc.) überhaupt jemals in die 
Größenordnungen von einem AVR kommt.
- Bring den Algorithmus in einer Hochsprache deiner Wahl erstmal ans 
Laufen (ich mache das üblicher Weise mit Java oder QuickBasic). Also mit 
2 GB Speicher, double-Precision, und allem Luxus, den man sich 
vorstellen kann.
- Wenn das schon nicht klappt -> Problem verändern oder nachlernen :)
- Wenn's klappt -> Algorithmus zurechtstutzen: alles auf 
integer-Rechnung umstellen, Puffer auf das notwendige Minimum verkürzen.
- Wenn's danach immer noch nicht in einen Mikrocontroller passen würde 
-> Back to Scratch
- Wenn's passen würde: Step by Step in Assembler übersetzen und den µC 
damit füttern. Das Debuggen wird einfacher, da du einen funktionierende 
Version besitzt, mit der du abgleichen kannst.

Das Vorgehen geht die größten Probleme nacheinander an, sorgt dafür, 
dass der Ruf von Assembler erhalten bleibt und spart dir hoffentlich 
einiges an Frustration ;)

Hoffe, das hilft dir weiter.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja: Auflösung und Genauigkeit nicht verwechseln!

Autor: Tobias Weiß (tobis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm...also danke dür die hinweise..nur:

ich weiß nicht wie ich eine FFT überhaupt angehen soll, ich habe da 
einfach keine ahnung. Ich weiß lediglich dass die werte am ADC eingang 
mit einer bestimmten frequenz abgetaseet werden sollen. wie man dann 
weiter vorgeht???? keine ahnung. ich hab e bereits alle mögliche FFT 
sachen gelesen, sprich den code auch angeschaut, versteh es aber nicht.

deswegen weiß ich auch nicht wie ich da weiter vorgehen soll.

und JAVA oder so kann ich nicht programmieren. ich habe lediglich 
assembler und ein bischen c kenntnisse.

:(

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja... da es für deine Rahmenbedingungen wohl kaum fertigen Code gibt, 
wirst du dich wohl in Einiges reinarbeiten müssen - oder erstmal 
kleinere Brötchen backen.

Fang statt der FFT erstmal mit einer normalen Fourier-Analyse an. 
Einfach das Ausgangssignal mit einem Sinus der zu testenden Frequenz 
multiplizieren und das arithmetische Mittel bilden (a). Dasselbe noch 
mal mit dem Cosinus (b).
sqrt(a² + b²) liefert dir dann einen Wert, der proportional zur 
Amplitude ist.

Das machst du dann mit alle Frequenzen und suchst dir den größten Wert.

Das war jetzt die Kurzfassung ohne komplexe Zahlen, Optimierungen etc. 
in Umgangssprache :)

Ich hoffe, das hilft dir ein wenig.

Autor: Tobias Weiß (tobis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey kai...das hilft mir schon...das probiere ich jetzt erst einmal aus 
und mal sehen was ich mir in den nächsten tagen u wochen dann aneignen 
kann.

es eilt ja nicht mit dem gerät, ich mache es lediglich als hobby, möchte 
es aber sehr gerne erlernen. ;)

mfg

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

da ich auch keine richtige Ahnung von FFT usw. habe, hätte ich 
vielleicht folgende Idee:
den Spectrum.Monitor greifen von elm-chan
http://elm-chan.org/works/akilcd/report_e.html
schauen, ob die Software prinzipiell verständlich aussieht und dann den 
(die) höchsten Werte, die zum Display zur Anzegeige gereicht werden, 
rauskramen und weiter benutzen.

Hier im Forum gab es dazu auch noch was, finde ich aber gerade nicht.

Gruß aus Berlin
Michael

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Tobias Weiß (tobis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

also ich hab mir jetzt selbst einen algorythmus überlegt...müßte 
hinhauen. problem:

die auflösung von 1Hz bekomme ich damit nie hin :(

für mich ist das alles neuland, mit meiner methode beträge die aufläsung 
16Hz...

ich weiß da einfach nicht so richtig bescheid...

Schade dass ein keiin tutorial gibt bei dem man grundsätzlich lernt wie 
eine DFT und dann später einer FFT funktioniert UND vor allem wie man 
sie umsetzt zB in assembler....sich das selbst zu lernen finde ich sehr 
schwer.

:(

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Suche mal hier im DSP-Forum nach 'Schnelle FFT in Assembler'. da findest 
du etliche Hinweise.

MfG Spess

Autor: Tobias Weiß (tobis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm, eher kaum.

wie gesagt, das ganze muss nicht schnell sein. oder muss es dass
aufgrund der hohen auflösung von 1Hz? Die absoluten frequenzen könnte
man auch nur von 500Hz bis 750 Hz festlegen. also eine Bandbreite von
250Hz.

mfg

Autor: vision (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wärs wenn du einen Ram-Speicher zu deinem Projekt hinzufügst, in den 
du zunächst einfach nur die Messdaten vom ADC (schnell) reinschreibst 
und dann im Anschluss "in Ruhe" die Berechnung durchführst, also wenn 
die zeitkritische Messung bereits abgeschlossen ist? So wäre dann 
zumindest das Problem Abtastrate gelöst...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.