Hallo, ich möchte für ein Kinderspiel eine Art musikalisches Codeschloss bauen. Eine Kiste soll sich öffnen, wenn eine bestimmte (möglichst einfache, max. 5 verschiedene Töne) Melodie auf einer Flöte gespielt wird. Für die Auswertung der Töne bin ich jetzt auf folgende Schaltung gestoßen: http://www.myplace.nu/avr/gtuner/index.htm Was meint Ihr? Könnte das damit hinhauen? In der Software könnte man ja die Hysterese deutlich größer machen um einen Ton sicher zu erkennen. Wie gesagt, keine Profianwendung, nur ein Spiel. Wenn jemand andere Vorschläge hat die nicht auf einer kompliziert FFT - Analyse beruhen, gerne her damit ;-) Bin wirklich dankbar für weitere Ideen, bevor ich mir die Teile besorge. Gruß, Bernhard
Tux schrieb: > Goetzel-Algorithmus/Filter wäre mein Vorschlag. Das wäre aber Kanonen auf Spatzen gerichtet :-) Die Fötentöne können / sollen ja durch die Grundtöne identifiziert werden und da reicht der Vergleich mit jeweils einer einzigen der jeweils bekannten 5 Frequenzen. Das funktioniert dann, wenn die Töne genügend lange gepielt werden, also z.B. 32 Phasen, was auch bei tiefen Tönen leicht übertroffen wird. Man baut eine Art AGC mit einem Opamp und einen Rechteckkomparator der mit dem Sollton gespeist wird. Müsste jeder Micki-AVR locker schaffen. Wenn bei der Koerrelation des Signals ein genügend grosser Wert erzielt wird, ist die Bedingung erfüllt und die state machine wartet das Tonende ab - hüpft in die Warteschleife für den nächste Ton. Wenn Du es Dir mit dem Triggern der Phase ganz einfach machen willst, prozessierts Du komplex (IQ) indem Du ein 90° verschobenens Rechteck ausgibt. Dann halt auf zwei Komparatoren. Der Rest ist Mathe im AVR.
Jürgen Schuhmacher schrieb: > Tux schrieb: >> Goetzel-Algorithmus/Filter wäre mein Vorschlag. > Das wäre aber Kanonen auf Spatzen gerichtet :-) Nicht wirklich. Goertzel ist doch wirklich recht einfach zu implementieren und arbeitet erheblich zuverlässiger als alles, was auf der Analyse von Nulldurchgängen beruht. Man spart sich viel Ärger, wenn man sich gleich für Goertzel entscheidet und den einmalig etwas höheren Aufwand in Kauf nimmt.
Alex Bürgel schrieb: > Guck dir mal den NE567 an, ist zwar schon alt, könnte bei deiner > Anwendung aber reichen. Leider geht der nur für eine Frequenz. Um 5 Tonhöhen auszuwerten, bräuchte man also 5 Stück und entsprechend viele Portpins. Der Gitarrentuner ist doch schon ganz gut, muss bloss erweitert werden.
Bernhard R. schrieb: > für ein Kinderspiel Jürgen Schuhmacher schrieb: > Die Fötentöne Ahh ja :D Aber im Ernst... Bevor man da irgendwelche "komplizierten" Hardwareaufbauten anfängt (OpAmps, etc.) würde ich das dann doch auch eher in Software lösen. Dann hast du auch den Vorteil, dass du leicht verschiedene Möglichkeiten testen kannst. Entweder du wandelst tatsächlich das o.g. Stimmgerät ab oder du nimmst wirklich den Goertzel :) Bernhard R. schrieb: > Wenn jemand andere Vorschläge hat die nicht auf einer kompliziert FFT - > Analyse beruhen, gerne her damit ;-) Den Algorithmus in C findet man bei Google, dann musst du eigentlich nur noch die Funktion aufrufen. Ich würde behaupten, dass das auch nicht viel komplizierter ist als die andere Option. :) Edit: http://www.embedded.com/design/configurable-systems/4024443/The-Goertzel-Algorithm
Hei, da ich das nicht softwaremäßig lösen könnte, würde ich einen billigen Gitarrentuner (<15 Euro) nehmen und dessen Anzeige mit einem analogen Eingang eines µC verheiraten. Grüße, Tom
Hallo zusammen, bin jetzt soweit, dass ich das Mikrofonsignal auf einen Pegel von ca. 50mV bekommen habe. Laut der Seite http://www.myplace.nu/avr/gtuner/index.htm passt das ja zur Auswertung. Ich habe das Ausgangssignal jetzt mal über die Soundkarte mitgeschrieben und bekomme folgendes Signal für den Kammerton A angezeigt (siehe Anhang). Leider habe ich kein richtiges Oszi um mir das Audiosignal mal genauer anzuschauen. Jetzt wo ich dieses Signal sehe, verstehe ich den C-Code nicht mehr. Wie kann ich durch zählen der Flankenübergänge auf die Grundfrequenz 440Hz kommen? Hab ich irgendwo einen Denkfehler oder kann mir jemand folgenden Code-Schnipsel erklären:
1 | for (i=0;i<32;i++) |
2 | {
|
3 | while (bit_is_set(PINB,1)) // ignore hi->lo edge transitions |
4 | if (count_hi > 80) // skip if no edge is seen within |
5 | break; // a reasonable time |
6 | |
7 | while (bit_is_clear(PINB,1)) // wait for lo->hi edge |
8 | if (count_hi > 80) // skip if no edge is seen within |
9 | break; // a reasonable time |
10 | |
11 | count += (count_hi << 8) + inp(TCNT0); // get counter value |
12 | outp(0,TCNT0); // clear counter |
13 | |
14 | if (count_hi > 80) // skip if counter has accumulated a |
15 | break; // too high value |
16 | |
17 | count_hi = 0; // clear hi count |
18 | }
|
19 | |
20 | |
21 | |
22 | |
23 | // initially turn off both leds
|
24 | sbi(PORTB,0); |
25 | sbi(PORTB,2); |
26 | |
27 | if (count_hi <= 80) // if count is reasonable |
28 | {
|
29 | |
30 | count = count >> 5; // average accumulated count by dividing with 32 |
Ich habe das so verstanden: In der If Schleife wird 32mal ein Flankenwechsel abgefragt, die verstrichene Zeit zu einer Variablen hinzugefügt und danach die Variable durch 32 geteilt um einen Durchschnittswert zu bekommen. Wenn der Abstand zwischen zwei Flanken zu lange ist, wird die Messung unterbrochen. Das passt aber nicht zu meinem aufgenommenen Signal. Kann mich mal jemand erleuchten? Ich möchte das auf einem Attiny44 oder 2323 umsetzten und den Code und die Funktionsweise verstehen.
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.