PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tonfrequenz zählen



Simon92
14.03.2009, 20:04
Hallo,

ich habe vor ein Stimmgerät (Instrumente) zu bauen. Da steht mir aber der steinige Weg vom Mikrofon bis zu einem Wert, der der Frequenz enstpricht bevor. Inzwischen bin ich so weit, das ich eine kleine Mikrofonkapsel mit einem ebenso kleinen Verstärker verstärkt habe. Jetzt ist meine Frage, wie ich es weiter anpacken soll. Kann ich jetzt den Verstärker am AD wandler meines Atmega 128L anschliessen und die Nulldurchgänge oder so zählen? Reicht da die Rechenleistung überhaupt aus bei einer Tonfrequenz von über 500 Herz? Oder wie löst man das Problem am besten?

vohopri
14.03.2009, 20:25
Hallo Simon,

Nulldurchgänge zählen bringt nichts. Auf alle Fälle musst du eine Hysterese implementieren. Sonst machen dir die Oberwellen deine Messung kaputt. Du musst Softwaremässig so etwas wie einen Schmitt Trigger nachbauen. Das ist aber seehr einfach.

grüsse,
Hannes

PICture
14.03.2009, 20:48
Hallo Simon92!

Dafür baut/nimmt man einen Frequenzzähler, rechnet man alle benötigten Frequenzen aus und weist dennen entsprechende Tonnamen zu.

Als Referenz wird international A = 440 Hz angenommen und alle Töne (12 Töne in einer Oktave inklusive Halbtöne) lassen sich aus hoffentlich bekannter Formel berechnen, da sie im Verhältnis zueinander wie im Code sind. Fur genaue Messung wird oft für niedrige Frequenzen die Periode (T) gemessen und in Frequenz umgerechnet F = 1 / T.

MfG

12
T1 -- ----
---- = \ / 2 ~ 1, 059463094...
T2 \/

Besserwessi
14.03.2009, 21:21
Die Töne die man zum Stimmen hat, sind in der Regel nicht besonders lang. Mit dem einfachen Zählen der Perioden kommt man da nicht unbedingt klar. Wenn man ein sauberes Signal hat, kann man die Zeiten der Nulldurchgänge messen und die Frequenz daraus berechenen. Das erlaubt auch bei kurzer Messzeit und eher niedrigern Frequenzen eine sehr hohe Auflösung.

Wenn man eher viel Hintergrundgeräusche hat, gibt es einen besseren Weg:
Das Signal wird digital aufgezeichnet und im RAM gespeichert. An das gemessene Signal wird dann per Least square Fit eine gedämpfte Siunsschwingung angepaßt. Mit einem µC hat man da aber 2 Schwierigkeiten: 1) Man hat nur recht wenig SRAM. Bei etwa 5 kHZ Datenrate und 8 Bit Auflösung reicht auch der Mega128 nur für gut 1 Sekunde. Das ist nicht viel sollte aber schon reichen.
2) Die Rechenzeit kann schon recht lang werden. Man wird also vor allem die Berechnung der Sinusfunktion umgehen müssen. Man wird sich also ein paar Gedanken machen müssen wie man das effektiv programmiert. da gibt es aber einiges was man gegen dem direkten Weg beschleunigen kann. Mit einer Rechenzeit von rund 1-10 Sekunden würde ich aber schon rechnen.

Wenn man erst man einen groben Schätzwert (ca. +-20%) der Frequenz hat geht der Feinabgleich normalerweise recht schnell. Vor allem wird man auch kaum durch Oberwellen und ähnliches gestört.

Mit eine AVR Mega128 wird das vom RAM und der Rechenzeit (vermutlich) nicht so ideal. Ein ARM Controller mit mehr RAM wäre für diese Methode die bessere Wahl.


Edit:
Es ist sicher eine gute Idee mal das Signal vom Mikrofon per Soundkarte auf dem PC aufzuzeichen. Dann kann man beurteilen, ob man mit der einfacheren Zeitmessung auskommt, oder ob man über den AD-Wandler gehen muß.

PICture
14.03.2009, 23:23
Man könnte es auch umgekehrt machen mit einem Generator von Referenztönen. In der Praxis wird z.B. in Bands meistens ein Keybord als Referenz genommen und z.B. alle Gitarren und Schlagzeug damit gestimmt.

MfG

vohopri
22.04.2009, 12:46
Hallo,

weils zum Thema passt: Zufällig habe ich in der Vorbereitung auf mein neues Projekt den besprochenen Algorithmus benötigt und am PC programmiert. Er ist sehr genau und so einfach, dass er wenig Speicherplatz braucht.

https://www.roboternetz.de/phpBB2/viewtopic.php?p=438349#438349

grüsse,
Hannes