Hallo alle zusammen, aktuell versuche ich im Rahmen einer Fallstudie für die Uni ein Stimmgerät zu realisieren mit dem myAVR MK3 Board / ATmega2560. Ich benutze als Entwicklungsumgebung SiSy/C. Grundsätzlich funktioniert das Programm, allerdings habe ich Probleme beim auswerten der Frequenz. Bzw denke ich das ich das ganze dort einfach falsch angehe. Das sind leider meine ersten größeren Erfahrungen im Bereich MC-Programmierung. Das Signal gebe ich über einen Frequenzgenerator/ext. Verstärker auf den ADC des Boards. Auch später soll nur über Kabel gestimmt werden. Durch den Prescale 64 kann der ADC nur ein Maxima von 15 annehmen(?). Die werte des ADCs habe ich in ein Array gespeichert und die Maximas ausgelesen, gezählt und den Mittelwert einer Samplesize von 400-500 gebildet und daraus die Frequenz errechnet. Über das LCD lass ich mir dann die Werte immer anzeigen zur Kontrolle. Das stimmt dann auch abundzu mal mit einer Abweichung von ein paar Herz. Aber grundsätzlich liegt ja hier der Hund begraben. Da der ADC nur positive Werte annehmen kann(?) ist das mit den Nulldurchgängen zählen ja nicht so einfach(?). Was würdet Ihr empfehlen wenn ich den ADC weiter nutzen möchte, wie soll ich vorgehen bzw. das Eingangssignal weiter verarbeiten? Oder besser auf einen anderen IO-Port gehen? Kann ich da einfacher high und low edges zählen? Mir fehlt da ein wenig eine sinnvolle, verständliche Strukturierung des Programms. Wie zähle ich, wie behandelt ich die ISR ggf. richtig oder besser, wie arbeite ich mit den Frequenzen/Prescale ect. richtig oder besser. Auf was muss ich beim ADC oder später bei der Gitarre achten da die Frequenz ja später nicht mehr so sauber wie auf dem Frequenzgenerator ist. Ich bin Neuling, also wäre es ganz nett wenn Ihr mir ein paar Hilfreiche Anregungen und Tipps/Erklärungen geben würdet. Die gängigen Stimmgeräte die ich so im Netz finde helfen mir nicht wirklich weiter. Da oft nicht mit ADC gearbeitet wird oder wenn, dann, mit einer FFT, wobei das ja angeblich nicht notwendig ist. Zu guter letzt gibt es kaum gute Dokumentationen diese Nachzuvollziehen als Anfänger. Was mich im Verständnis nicht sehr weit gebracht hat. Schon mal vielen Dank für die Anregungen.
Das Signal AC koppeln (1uF Kondensator) und mit einem Spannungsteiler 10k/10k auf Ref/2 vorspannen.
Ich würde nicht den AD-Wandler verwenden, sondern den Komparator. Dann hat man schöne (rechteckige) Nulldurchgänge mit denen man die Frequenz bestimmen kann.
Naja, das hilft mir alles noch nicht weiter. Jespers Tuner habe ich mal auf meine Hardware angepasst. Allerdings liefert der nur bei einem konstanten Signal (Generator) ein vernünftiges Ergebnis ( Abweichung bei den niedrigen Frequenzen um 0,4Hz) Sobald ich die Gitarre anschließe habe ich keine Chance das vernünftig zu Stimmen da er auch immer wieder in die ISR springt und die LEDs dann nicht konstant bleiben sondern jenach Pegel zwischen den Frequenzen hin und her switcht. Google und Foren habe ich schon genug befragt...Also brauch ich da ein bisschen detailierter Hilfe...
Laura Meische schrieb: > Ich würde nicht den AD-Wandler verwenden, sondern den Komparator. Dann > hat man schöne (rechteckige) Nulldurchgänge mit denen man die Frequenz > bestimmen kann. ... nach einem Tiefpass, um Oberwellen und Rauschen zu killen, die den Zähler irritieren ...
Stimmgerät für Gitarre: Wenn dir schon die Tatsache Schwierigkeiten bereitet, dass ein ADC nur positive Werte ausgibt, hast du ein PROBLEM. Wenn du nicht weißt, wie ein Gitarrensignal auf dem Oszilloskop aussieht, hast du NOCH eins. Wenn du nicht weißt, was der Prescaler des ADC mit seiner Auflösung der Eingangsspannung zu tun hat, hast du ein WEITERES. Bei einem intelligenten UND lernwilligen Menschen würde ich einige Monate intensiver Arbeit ansetzen, um diese Probleme zu lösen... Ist dir klar, dass du eine von 6 Frequenzen zwischen (rund) 82 Hz und 330 Hz auf mindestens 0,06% = 600 ppm genau erfassen musst, was ein Hundertstel des Verhältnisses von einer Note zur nächsten ist? Das schafft man mit einem µC nicht zwischen zwei Nulldurchgängen. - Es ist aber mit einem µC leicht zu machen. DANN ABER: Eine Gitarrensaite schwingt vielleicht auf EINER Frequenz, mit dem Gitarrenkörper daran daran gibt es aber ein Gemisch von Schwingungen, die es schwierig machen, im Amplitudenverlauf SICHER zu erkennen, wo eine Schwingung des Grundtons beginnt bzw. wo sie endet. - Hier wird es erst richtig INTERESSANT! Gibts an der Uni keine einfacheren Fallstudien?
Ich schätze mal, dass Du dich zuerst in die Analogtechnik wurschteln musst. Dort ganz besonders in die Abteilung: Filter. Einfach Signal verstärken und ab in den A/D-Wandler verlangt sehr viel Rechenleistung. Selbst der einfachste Toni ist eine Mixtur aus allen möglichen Frequenzen. Richtig in Stimmung kommst Du aber nur auf der Grundfrequenz.
Ach leute, ich finde diese Aussagen manchmal echt doof. Die meisten Menschen in solchen Foren tuen immer so als hätten Sie die mortz Ahnung aber reden einfach nur hochgestochen von irgendwelchen Dingen die sie selber vllt garnicht können nur so zu tun als hätten sie Ahnung. An meinem MC hängt ein Oszzi, was ein Prescale ist weiß ich, wenn der allerdings nur 0-x angibt gehe ich davon aus das er nur positive Werte ausgibt. Daher die (?) ob ich damit richtig liege. Ich Spiele selber Gitarre und kenne jede Frequent auswendig. Wenn ich solche Kommentare lesen muss wird mir anderst. Nur weil ich keine Ahnung habe von der Code-technischen umsetzung bin ich nicht gleich ein Idiot. Sondern der, der denkt, er kann was schlauses schreiben. Wenn ich dann weiter von lernwillig höte wird mir schlecht, nur weil jemand neu im Thema MC ist, heißt das nicht das er nicht lernwillig ist. Ich habe eine Ausbildung als Informationselektroniker und studiere im Informations- und Eleketrotechnischen bereicht. Das ich in der Materie fremd bin hat sicher nichts mit 'lernwillig' oder sonstwas zu tun sondern einfach mit der Interesse an der Gitarre und vllt der Dummheit solch eine Fallstudie vorzuschlagen und der unerfahrenheit im Programmieren mit ASM/C-Routinen. Schenkt euch euer gefassel von wegen google und sonstwas. Assembler und MCs sind ein Thema was man in meinem Studiengang nur am Rande erfährt, rein aus Neugier und Interesse haben wir uns daran versucht. Diese unqualifizierten Kommentare von Leuten die dieses Proejekt selber noch nie gemacht haben, aber Klug daher reden kann ich mir echt schenken. Schweigt doch einfach wenn Ihr nur 'Bla Bla' machen könnt. Also, wir hatten Lust darauf, dieses Projekt umzusetzen, haben die gennante Hardware und die genannten Erfolge ( zb Jespers Tuner ) oder unsere eigene mit zählen der Nulls im Array via AD - Die Genauigkeit stimmt nicht oder ist nur mit einem Frequenzgenerrator stabil. Allso bitte, bitte redet nicht mit mir wie mit einem Idioten, sondern helft mir konstruktiv. Sich die zeit zu nehmen und 10 Zeilen zu schreiben in dennen es darum geht wie einfach es ist, ist arm. Es wäre besser jemand zu helfen und hilfreiche Tips zu geben. Als in einem Post zu sugerieren wie 'cool' man doch selber ist, aber keine Antwort auf gestellte Fragen zu geben.. Herr beschütz mich.
Und wenn ich mal davon ausgehe das ich bei einem Frequenzgenerator, mit meinem Code eine Genauigkeit von +-0,7 Hz erziehe, nur bei direkten Signalen von der Gitarre es nicht ganz klappt, dann muss ich mir echt nichts von 'google mal nach Gitarrenfrequenzen' anhören. Ich habe nicht einen Schnippsle Code gepostet. Ich frage nach Grundsätzlichen Strukturen, Tips für die besser Filterung. What Ever. Wie können manchen nur soo ignorant sein. Danke aber an die, die Versucht haben sachliche Tipps zu geben.
Hallo Mark, wenn du doch Gitarre spielst, dann kennst du auch sicher diese elektronischen Stimmgeräte. Mach doch mal eins auf und schau wie die das so aufgebaut haben. Ich hatte selbst so ein Teil und weiß, dass das nicht mal 20 Euro gekostet hat. Vielleicht bringt dich das weiter?
Mark Remark schrieb: > Ich habe nicht einen Schnippsle Code gepostet. Genau das hast du falsch gemacht, hättest du es gemacht, hättest du wohl bessere Antworten bekommen. Was Du oben geschrieben hast klingt so als wenn jemand der noch nie Auto gefahren ist morgen ein Formel 1 rennen fahren will. Wie soll man wissen was du evt weist, dein Projekt ist nicht trivial und für ein Neuling wenig geeignet. Warum hast du die Gitarrenfrequenzen nicht reingeschrieben wenn du sie weist? Wobei das nicht der eigentliche Knackpunkt war. macht es leichter für die, die mitdenken wollen aber sich mit Gitarre nicht so auskennen. Von google hast du nur geredet. Dein Schaltplan fehlt auch. Wenn du soviel gegoogelt hast, wo ist deine Ausarbeitung mit der Frequenzbestimmung? Die Frequenz vom Generator zu bestimmen ist trivial.
--nur mal so 'ne Idee! generier Dir die 4/6/12 Töne und vergleich sie analog auf "Schwebungs-Null". (Kannst ja noch für's "wohl temperierte" Stimmen von der math. Grundschwingung abweichende Frequenzen vergleichen) Grundidee: Ist der Ton(über billig-Micro aufgenommen) der Git.saite annähernd dem gewünschten, kommt es zur "Schwebung", die sich , durch eine LED(z.B.) anzeigen lässt -- Überdenk mal diesen Ansatz --
> aber reden einfach nur hochgestochen von irgendwelchen Dingen > die sie selber vllt garnicht können Dein Hauptproblem ist ganz banal. Du hast eine Annahme getroffen. Und zwar die Annahme, dass du von deiner Gitarre ein schönes Sinusssignal kriegst. Und da kann man nur sagen: Pustekuchen. Selbst wenn du es irgendwann mal hinkriegst, aus einem sauber anliegendem Sinus die Frequenz zu bestimmen, funktioniert das hinten und vorne nicht mit deiner Gitarre. Denn dort, wo dein sauberer Sinus bei 440Hz 880 Nulldurchgänge hat (oder 440 Maxima), da hat dein Gitarrensignal ein paar tausend. Einfach mal ein Mikro samt Verstärker an das Oszi anschliessen und eine Saite anzupfen. Oszi entsprechend verstärken lassen und darüber staunen, was du am Oszi siehst. Und solange du dieses 'Problem' nicht löst, ist dein Frequenzmesser zwar eine schöne Fingerübung (wie sie begabtere Amateure an einem Samstag-Nachmittag durchziehen), mehr aber auch nicht.
Danke für die Antworten. - Ich habe ein mk3Board. Kein Bausatz. Ein Stimmgerät aufzuschrauben ist glaub ich weniger Hilfreich, die Schaltpläne finde ich ja im Netz. - Ich habe keinen Code gepostet weil das nicht mein Primäres Problem ist. sondern das strukturelle, bzw. mit welcher Methode ich am besten mein Signal filter. ADC, Komparator, IO-Pin, Nulldurchgänge oder Amplitude, FFT ect. - Natürlich nehme ich zu Testzwecken erstmal ein Sinusgenerator damit ich sehe ob mein Code im Idealzustand auch funktioniert. Die Verfeinerung dessen, so dachte ich mir, kommt dann danach. - Nebenbei, mein Programm funktioniert mit einem Sinusgenerator bis auf, wie schon paar mal beschrieben, bei den niedrigen Frequenzen ( das sind bei einer Gitarre für die E und A Saite 82,41 Hz und 110,0 Hz) bis auf 0,7 Hz Abweichung genau. Mit der Gitarre per Kabel an den IO angeschlossen und einem Oszi zur Kontrolle sieht das natürlich nichtmehr sooo gut aus, da ich natürlich die Nebenschwingungen und den Amplitudenrückgang habe. Irgendwie mag mein Programm nur Eingangsspannung von 2-3V, darunter gehts nicht mehr. Da ein Signal von der E-Gtarre aber nur 20-50mV auspuckt ist das eben so ( läuft über Verstärker um die 'Ue' zu bekommen). Es geht auch nur um eine E-Gitarre mit Kabel ans Board, kein Micro. Generieren eines Referenztons ist vllt eine Idee. Muss ich mal sehen ob ich das mit der 'Schwebung' Umsetzen kann. Immo berechnet ich nur ggüber der Ref.freq. Das das ganze nicht einfach ist weiß ich ja selber, aber dann bitte seid konstruktiv wenn Ihr Ahnung habt, ansonsten vllt lieber ruhig. Beste Grüße
> Und da kann man nur sagen: Pustekuchen. > > Selbst wenn du es irgendwann mal hinkriegst, aus einem sauber > anliegendem Sinus die Frequenz zu bestimmen, funktioniert das hinten und > vorne nicht mit deiner Gitarre. Denn dort, wo dein sauberer Sinus bei > 440Hz 880 Nulldurchgänge hat (oder 440 Maxima), da hat dein > Gitarrensignal ein paar tausend. Einfach mal ein Mikro samt Verstärker > an das Oszi anschliessen und eine Saite anzupfen. Oszi entsprechend > verstärken lassen und darüber staunen, was du am Oszi siehst. Danke für die Hinweise, was ein Sinus ist weiß ich, ebenso wie ein Gitarrensignal aussieht. Hätte ich damit Probleme wäre ich auf Elektronik.net gegangen, oder ähnliches. Meine Gitarre hängt im übrigen an einem Kabel, über Verstärker, Oszi am Board...und die Fingerübung läuft fast einwandfrei. Vllt hast du eine Annahme gestellt das ich gar keine Ahnung habe: Pustekuchen. Und wenn du meinen ersten Beitrag nur einmal komplett gelesen hättest, dann hättest du unter Umständen auch folgende 'Annahme' von mir entdeckt, Herr Moderator, Vorbild und Philosoph: " Auf was muss ich beim ADC oder später bei der Gitarre achten da die Frequenz ja später nicht mehr so sauber wie auf dem Frequenzgenerator ist." ...
Eingangsverstärker, dann parallele 6 RC-Bandpässe, dann ein Schmitt-Trigger mit Hysterese, dann über einen IRQ-Eingang einen internen Zähler hochzählen und über einen Timergesteuerten Interrupt nach jeder Sekunde auslesen und zurücksetzen. Joe
"In der Akustik ist die Schwebung deutlich zu hören: Erklingen zwei Töne, deren Frequenzen sich nur wenig unterscheiden, so ist ein Ton zu hören, dessen Frequenz dem Mittelwert der Frequenzen der beiden überlagerten Töne entspricht. Dieser Ton ist moduliert, seine Lautstärke schwankt mit der sogenannten Schwebungsfrequenz, die der Differenz der Frequenzen der beiden Töne entspricht." aus: http://de.wikipedia.org/wiki/Schwebung daraus folgt: keine Differenz --> kein(oder sehr tiefer) Ton (jetzt musste den Git.-eingang nur noch an eine Verstärkerschaltung mit "normierten" Ausgangspegel legen;) dann mixen und den entstandenen Schwebe-Ton auswerten --
Warum tust du denn jetzt so arrogant? Hat dir wohl kaum jemand einen Grund gegeben. Vllt. irren sich die Leute ja, aber deine Beiträge lesen sich schon so als hättest du wenig Ahnung.. Mark Remark schrieb: > Grundsätzlich funktioniert das Programm, allerdings habe ich Probleme > beim auswerten der Frequenz. Dein Problem beginnt schon viel FRÜHER. Wenn du wirklich Mark Remark schrieb: > im Informations- und Eleketrotechnischen bereicht. studierst, dann weisst du wo du ansetzen musst, bevor du auch nur daran denkst einen Controller zu beschreiben: Filterung. Ein sehr breites Thema, wie du wahrscheinlich weisst. Also entweder Eingangsfilter-Schaltungen von existierenden Gitarrenstimmgeräten kopieren oder über die Bücher, denn einfach mal einen Bandpass nehmen und die obere und untere Grenzfrequenz ausrechnen wird wohl nicht drinsein. Gruss
--du könntest als Referenzton ja den Ton einer (gespeicherten) richtig gestimmten Saite(mit all den markanten Oberwellen einer E-Gittare) zum mixen heranziehen;
Mark Remark schrieb: > " Auf was muss ich beim ADC > oder später bei der Gitarre achten da die Frequenz ja später nicht mehr > so sauber wie auf dem Frequenzgenerator ist." Das Problem ist, dass sich diese Frage überhaupt nicht stellt, wenn du realisiert hast, dass es dir nichts bringt, das Maximum in der Kurvenform festzustellen. Denn um 'runterprügeln des Signals' bis auf die Grundfreuqenz kommst du nicht rum. Und dann brauchst du keinen ADC mehr, sondern musst dir überlegen, wie du auf analogen Wege aus dieser einen übrig gebliebenen Frequenz eine Rechteckschwingung hinkriegst. Und eine Rechteckschwingung legst du an einen digitalen Eingang und gut ists. Da liegt deines Rätsels Lösung und nicht darin, ob es bei einem ADC etwas zu beachten gibt! Dein Fisch fängt schon ganz vorne am Kopf zu stinken an. Da kannst du an der Schanzflosse drehen soviel du willst.
Hallo Mark Remark, jetzt hast du also mitbekommen, wie man angepflaumt wird, wenn man den hifswilligen Menschen hier nur zu einem Bruchteil schildert, was man möchte - und welche Voraussetzungen da sind. Falls du noch interessiert bist, könnten wir ja mal versuchen, an dein Problem ranzugehen: Fangen wir ruhig bei Adam und Eva an! Du schickst dein Tonsignal in einen ADC-Eingang des µC. 1) Der Prescaler des ADC hat nichts mit dem Signalpegel zu tun, sondern soll nur dafür sorgen, dass der ADC mit seinem geeigneten Arbeitsakt versorgt wird. Der ist 50...200 kHz und muss mit dem Prescaler vom Prozessortakt abgeleitet werden. (µC-Takt = 8 MHz, Prescaler = 64: ADC-Takt = 125 kHz - OK) 2) Damit ein Wechselspannungssignal 0 V +/- û vom ADC verarbeitet werden kann, muss es auf die halbe Referenzspannung des ADC angehoben werden. Dies erreicht man mit einem Spannungsteiler aus zwei gleichen Widerständen (z.B. 100 kOhm) zwischen Versorgungsspannung und Masse (GND), sowie der Einkopplung des Tonsignals über einen Kondensator. 3) Der 10-Bit-ADC liefert Werte von 0...1023. Hast du das Signal wie oben geschidert eingespeist, kommen ADC-Werte von etwa 512 heraus, wenn die Wechselspannug = NULL ist. Positive Spannungen liegen vor, wenn der ADC größere Werte liefert, und umgekehrt. - Falls dir das nicht klar ist: FRAGE NACH! Bis dann!
Danke Bernie, also bedeutet das, das Werte unterhalb 512 eigl den negativen Teil der Wechselspannung darstellen? Das würde mir helfen, da ich in meinem ersten Versuch via ADC immer davon ausgegangen bin das bei einem Prescale von 64, der ADC Werte von 0-15 liefert und die 0 des ADC der tatsächliche 0 ist. Was ja, wenn ich das richtig verstanden habe aber die negative Spitze des Signals darstellt? Ich habe in meinem ersten Versuch die Werte des ADCs in ein Array gepumpt und die 15 als Maxima angenommen. Mir hat das natürlich relativ gute Ergebnisse geliefert, mit Abweichungen um einige Herz. Aktuell benutze ich Referenzfrequenzen und zähle in der ISR overflow die hi-counts. Das liefert mir wie gesagt bis zu 0,7 Hz Abweichung ein genaues Ergebnis bei einer Generatorfrequenz. Mit der Gitarre allerdings nichts. Wie gehe ich am besten mit diesem Gitarren Signal um, das ja in seiner Amplitude sinkt. Ein gespeichertes Signal, einer korrekt gestimmten Tonlage erscheint mir im ersten Moment plausibel, aber nicht mit fallender Amplitude. Da müsste ich ja proportional zur fallenden Amplitude nachverstärken, oder so? Da ich über ein fertiges Board ( avrmk3 ) einspeiße weiß ich nicht wie ich das machen soll. Oder ob das überhaupt so nötig ist. Die frequenz bleibt ja die selbe, nur die Routine, der Überprüfung von Maximas unterscheidet sich ja dann im Zeitverlauf. Daher müsste ich ja eigl eher Nulldurchgänge zählen, da diese ja unabhängig von der Amplitude immer gleich bleiben sollten. Es bleibt letztlich nurnoch die Störfrequenzen, bzw unsauberer Frequenz, die ja dann die Berechnung nicht exakt werden lassen. Hilft mir da einer größere Samplerate? Mehrere Mittelwerte oder ähnliches ? Oder gibt es da einen exakteren Wert. Grüße
Achso, Immo spiele ich das Signal auf einen normalen IO/Pin. Nah angelegt ab diesen Tuner http://www.myplace.nu/avr/gtuner/ Aber wie gehabt, damit erreiche ich nur im 'Labor' mit Generator ein annehmbares Ergebnis. Mit einer E-Gitarre ist das nicht gut...Die LEDs flackern wild. Sind to high/ to low. Ich komme leider auch erst die Tage wieder dazu daran zu Arbeiten. Ich dachte auch an eine Schwelle, die niedere Amplituden nicht mehr berücksichtigen, damit ich das flackern raus bekomme. Das muss ich nocht testen. Grüße
--warum übernimmst Du nicht 1:1 den Ansatz von Jesper Hansen(2001!) 2 LUT werten die Counterimpulse zwischen 2 L/H - Flanken des Eingangssignals aus(nichts mit Nulldurchgängen). Einer bestimmt die Saite, nachder im 2. gesucht wird. Da die Werte in den LUT empirisch ermittelt wurden, ist die tatsächliche(gemessene) Frequenz ohne Bedeutung. (Es kann/wird sogar eine harmonische sein!);
Hallo, ich würde nicht die Nulldurchgänge zählen. Sondern: Vergleichston mit einer DDS erzeugen. - Geleicher Sampletakt wie ADC - Sinus und Cosinus DQ Mischer mit ADC Signal Filter mit 10 Hz? Grenzfrequenz. Phasenwinkel bestimmen. Phasenwinkel drehgeschwindigkeit bestimmen durch Differenzierung. Mfg Michael
Mark Remark schrieb: > Nur weil ich keine Ahnung habe von der > Code-technischen umsetzung bin ich nicht gleich ein Idiot. Sondern der, > der denkt, er kann was schlauses schreiben. zum einen solltest Du lernen mit Kritik umzugehen und zum anderen nicht andere als Idioten zu bezeichen. Trotzdem ein schlauer Tipp von mir: versuch es vielleicht mal mit Autokorrelation
Walter S. schrieb: > Mark Remark schrieb: >> Nur weil ich keine Ahnung habe von der >> Code-technischen umsetzung bin ich nicht gleich ein Idiot. Sondern der, >> der denkt, er kann was schlauses schreiben. > > zum einen solltest Du lernen mit Kritik umzugehen und zum anderen nicht > andere als Idioten zu bezeichen. > > Trotzdem ein schlauer Tipp von mir: versuch es vielleicht mal mit > Autokorrelation Der Goertzel-Algorithmus wäre noch eine Idee, ansonsten Autokorrelation: http://stackoverflow.com/questions/5044289/how-to-find-the-fundamental-frequency-of-a-guitar-string-sound http://en.wikipedia.org/wiki/Pitch_detection_algorithm http://en.wikipedia.org/wiki/Frequency_estimation
Arc Net schrieb: > Der Goertzel-Algorithmus wäre noch eine Idee der ist halt nicht dafür gedacht eine Frequenz zu bestimmen, sondern mehr zum Bestimmen ob eine bestimmte Frequenz vorhanden ist
Walter S. schrieb: > Arc Net schrieb: >> Der Goertzel-Algorithmus wäre noch eine Idee > > der ist halt nicht dafür gedacht eine Frequenz zu bestimmen, sondern > mehr zum Bestimmen ob eine bestimmte Frequenz vorhanden ist Das schon, aber entsprechend ausbaufähig...
vampire schrieb: > --warum übernimmst Du nicht 1:1 den Ansatz von Jesper Hansen(2001!) > 2 LUT werten die Counterimpulse zwischen 2 L/H - Flanken des > Eingangssignals aus(nichts mit Nulldurchgängen). Einer bestimmt die > Saite, nachder im 2. gesucht wird. > Da die Werte in den LUT empirisch ermittelt wurden, ist die > tatsächliche(gemessene) Frequenz ohne Bedeutung. > (Es kann/wird sogar eine harmonische sein!); Hab den so eingebunden. Aber irgendwas passt nicht wenn ich das Signal der Gitarre über einen Verstärker einspeise. Ich lass ca 2,5V an den Pin ankommen. So wie er es mit seiner Schaltung realisiert. Mit dem Generator wie gesagt sehr gut. Aber irgendwie nicht bei der Gitarre dann. Kann es sein das mir da einfach wie in seiner Schaltung ein RC Glied fehlt zum vorfiltern? Müsst ich ja bei meinem Board dann code technisch realisieren? Die Sache ist: Wenn ich die Gitarre dran hänge, dann flackern die LEDs, was denke ich durch den fallenden Pegel passiert. Vllt hilft es mir ja schon wenn ich eine Wait-Schleife drin habe, oder nur LEDs ansteuer wenn es in einem bestimmten Pegel ist. Aber ich sehe halt das er immer toHigh toLow leuchtet und sich nie richtig einstimmt, wie es bei einem konstanten Signal der Fall ist. Daher gehe ich gerade davon aus, das die Berechnung oder ähnliches mit dem unsauberen Sinus ein Problem hat.
Mark Remark schrieb: > Kann es sein das mir da einfach wie in seiner Schaltung ein RC Glied > fehlt zum vorfiltern? Dieser Tip kam schon vorgestern: amateur schrieb: > Ich schätze mal, dass Du dich zuerst in die Analogtechnik wurschteln > musst. Dort ganz besonders in die Abteilung: Filter. Und in den Posts davor gab es auch entsprechende Hinweise.
Mark Remark schrieb: > Kann es sein das mir da einfach wie in seiner Schaltung ein RC Glied > fehlt zum vorfiltern? Müsst ich ja bei meinem Board dann code technisch > realisieren? Ohje ohje ohje.
John schrieb: > Mark Remark schrieb: >> Kann es sein das mir da einfach wie in seiner Schaltung ein RC Glied >> fehlt zum vorfiltern? > > Dieser Tip kam schon vorgestern: > amateur schrieb: >> Ich schätze mal, dass Du dich zuerst in die Analogtechnik wurschteln >> musst. Dort ganz besonders in die Abteilung: Filter. > > Und in den Posts davor gab es auch entsprechende Hinweise. Wenn man halt erstmal ein paar Tage und unzählige Beiträge brauch, in denen man nur ließt man wäre nicht lernwillig, wisse nicht was ein Sinus ist und ähnliches überließt man diese allgemeinen Dinge leicht aus ärger. Aber ja, du hast Recht, Tiefpass um Oberwellen und Rauschen zu killen stand da schon dabei. Das werde ich mal probieren. Simon K. schrieb: > Mark Remark schrieb: >> Kann es sein das mir da einfach wie in seiner Schaltung ein RC Glied >> fehlt zum vorfiltern? Müsst ich ja bei meinem Board dann code technisch >> realisieren? > > Ohje ohje ohje. Du bist mein Held!
-- ein RC-Glied ist mit den Arbeitspunkt-Widerständen R1/R2 und C3 schon geg.; Es klappt aber nur, wenn Du den Timer genauso wie Jesper einstellst! (11059200Hz-Quarz - prescaler Timer 64) so das (172.8 kHz @ 11.0592 MHz) die Timerfrequ. rauskommt; Bei anderen Quarzen und IC's musst Du anpassen -- -- sonst stimmen die counts nicht(LUT); und nochwas: -ich denke die "Auswertung" sollte erst verzögert, (ohne Plektrum-klick), nach Einschwingzeit der Saite erfolgen. manuell gestartet oder zeitverzögert - delaytime nach erstem Tonereignis(ST*); ST* -Schmittrigger + monoflop
--aber, wie oben schon angemerkt: besser wären 6 Filter(anal. oder digit.) auf die jeweilige Grundfrequenz und wandeln der aktuellen sinuiden in definierte Rechteck-impulse mit genau der Periodenlänge des angelegten Tones -- dann Timertakte zählen und LUT(wie schon Jesper);
vampire schrieb: > -- ein RC-Glied ist mit den Arbeitspunkt-Widerständen R1/R2 und C3 schon > geg.; Die meinte ich, in seiner Schaltung. Aber ich hab ja ein fertig bestücktes myAVR mk3 Board. Da müsste ich ja dann in C den filter schreiben, oder halt unschön davorklemmen. > Es klappt aber nur, wenn Du den Timer genauso wie Jesper einstellst! > (11059200Hz-Quarz - prescaler Timer 64) > so das (172.8 kHz @ 11.0592 MHz) die Timerfrequ. rauskommt; Stimmt. Da habe ich angepasst. Beim Generator bekomme ich +-0,7 Hz Abweichung. Also recht annehmbar. Dann müsste ja mein Timer stimmen? Bleibt halt der fehlende Tiefpass. > und nochwas: > -ich denke die "Auswertung" sollte erst verzögert, (ohne > Plektrum-klick), nach Einschwingzeit der Saite erfolgen. > manuell gestartet oder zeitverzögert - delaytime nach erstem > Tonereignis(ST*); > ST* -Schmittrigger + monoflop Ja, das macht Sinn. Werde ich noch einbauen. Danke vampire für deinen Einsatz. Grüße
Hi, Ich denke eine freischwingende Saite hat von Natur aus nach wenigen Sekunden Einschwingzeit einen sinusoidalen Grundton, der weit genug über das Obertonspektrum hinausreicht, um mit nem einfachen Filter ausreichend gesäubert und weiterverarbeitet zu werden. So "dreckig" wie manche es darstellen, ist das Gitarrensignal nach Abklingen der Anschlag-Artefakte garnicht. Ein Vorverstärker mit AGC bzw. Sustain am Gitarrenausgang, welche die el. Ausgangsamplitude erstmal auf einige V verstärken und konstant halten, wären dabei hilfreich. Diesen Ton AC-gekoppelt auf die verbundenen Eingänge (Trigger und Threshold) eines cmos 555 geben, so dass eine Schmitttriggerfunktion mit Hysterese zwischen 1/3 und 2/3 Vcc entsteht, die am Ausgang ein sauberes Rechteck mit Vcc 5V breitstellt... ...oder gleich ein Effektmodul dazwischen hängen, welches den Grundton filtert und mit stark übersteuerten Verstärkerstufen sowohl Rechtecksignal wie auch langanhaltende Sustainfunktion erzeugt. Der Jimmy Page-Effekt... :-) Damit kann dann µC-seitig per Flankenauswertung digital weitergewurstelt werden....
Eine Frage hab ich allerdings noch. Wieso nimmt Jesper für die Strings immer das doppelte der eigl Frequenz? E_STRING - 164.8Hz, real schwingt diese Saite aber auf 82,41Hz. Werf ich 164,81 rein, zeigt die LEDs auch 'in tune' an. Änder ich die #defines in die richtige Frequenz, werfe dann zum Beispiel 82,41Hz rein, hab ich Abweichung. Liegt dann doch sicher noch am Timer, den Einstellungen der CPU Clock..hm?
Mark Remark schrieb: > Wieso nimmt Jesper für die Strings immer das doppelte der eigl Frequenz? 100n Kondensator und R1/R2 = 1. Oberwelle ?
Michael Sch. schrieb: > Diesen Ton AC-gekoppelt auf die verbundenen Eingänge (Trigger und > Threshold) eines cmos 555 geben, so dass eine Schmitttriggerfunktion mit > Hysterese zwischen 1/3 und 2/3 Vcc entsteht, die am Ausgang ein sauberes > Rechteck mit Vcc 5V breitstellt... --so ähnlixh war mein Gedankengang; -allerdings muss dann der Wert in den LUT(gezählte Timertakte) empirisch mit einer gestimmten Gitarre ermittelt und eingetragen werden (beste Lösung - denke ich!)
Simon K. schrieb: > Theoretiker? ;-) Nein jemand der solche Sachen professionel realisiert. Ist alles nur ein Stück Software und kostet nichts. Braucht aber keine aufwendigen Filter in Hardware. Lässt sich durch keinen Oberton beeinflussen. Braucht nicht für jede Frequenz eigene Filterparameter. Und ist unabhängig von der Amplitude. Messzeit ist Minimal. Einzelne Störungen werden stark unterdrückt ... Wenn man weis was mann macht ist das alles in 2-3 Stunden realisiert. Mfg Michael
Michael schrieb: > Simon K. schrieb: >> Theoretiker? ;-) > > Nein jemand der solche Sachen professionel realisiert. Ist alles nur ein > Stück Software und kostet nichts. Braucht aber keine aufwendigen Filter > in Hardware. Lässt sich durch keinen Oberton beeinflussen. Braucht nicht > für jede Frequenz eigene Filterparameter. Und ist unabhängig von der > Amplitude. Messzeit ist Minimal. Einzelne Störungen werden stark > unterdrückt ... > > Wenn man weis was mann macht ist das alles in 2-3 Stunden realisiert. Also ich hab da jetzt nicht so die Ahnung von, aber ich glaube kaumst, dass man das ohne DSP hinbekommt in Software. Und wenn doch, braucht das Ding ne ganze Stange mehr Leistung als so ein kaufbares simples Gitarrenstimmgerät.
Hallo, passt locker in einen neueren PIC. Rechnen wir mal: Höchste Frequenz 329,6 Hz. => Abtastrate 2000 Hz DDS: 1x 32bit Addition 2x Nachschlagen in Tabelle => ca. 20 Takte DQ Mischer: 2x 16bit Multiplikation => ca 10 Takte Filter: 2x IIR Biquad 2 Stufen aus LIB => ca 50 Takte Winkelbestimmung: atan2 aus Lib => ca 50 Takte Ableiten => ca 20 Takte Macht 150 mal 2000 MIPS = 300000 MIPS = 30kMIPS Abtastrate kann also noch um einiges höher gewält werden und ein Display reichts auch noch. Hardwaremultiplizierer wäre schön. Mfg Michael
@Mark Kannst Du mal darlegen, wie der Stimmvorgang Deiner Vorstellung nach in der Praxis aussehen soll. Also musikalisch/praktisch, nicht Code- oder HW-bezogen. Was soll das Gerät genau können bzw. machen (anzeigen, generieren, analysieren) und was muss der Musiker/Anwender dabei tun? Du schliesst das Teil an die Gitarre an, schlägst ein Saite an.... und dann...? ...zeigt das Display: "April, April, das war kein G, sondern G#.., sorry!" Oder wie soll das aussehen..? :-) Skizzier mal tabellarisch die Abfolge, die du dir vorstellst.
Habe mir gerade noch überlegt das auch 6 mal gleichzeitig geht. Tan und Diffenzieren geht ja in einem langsameren Takt. So könnte man immer bestimmen auf welchem Ton der größte Pegel kommt. So ist eine automatische Tonwahl sehr einfach möglich. Mfg Michael
Ich bin kein Musikus! Dein Problem stellt sich mir folgendermaßen dar: 1. Eine angepasste Eingangsstufe - wahrscheinlich umschaltbar. Es ist ein riesiger Unterschied (im wahrsten Sinne des Wortes) ob Du Dich mit dem Signal eines Pick-Up oder eines Mikrofones herumschlägst. 2. Ein Bandfilter mit möglichst großer Güte. Deine (jede) Saite hat sogenannte Obertöne. Die auf der einen Seite den eigentlichen Klang des Instruments ausmachen, auf der anderen Seite Dir das (Mess-)leben schwer machen. Bildhaft: Stell Dir einen wunderschönen, sauberen Sinus vor. Die Frequenz berechnet sich aus den Zwei Nulldurchgängen, von mir aus auch den zwei Maxima. Auf dem Sinus lümmelt eine Oberwelle rum (im Grunde der Klang). Diese bewirkt, zufällig, das die Spitzen oder Nulldurchgänge mal früher oder später erreicht werden. Da es kein starres Verhältnis der Oberwellen zur Grundwelle gibt, kann man mit diesen Fixpunkten nicht viel anfangen. Fazit: Platzverweis bzw. Filtern. 3. Eine Saite braucht, nach dem Anschlag einige Zeit "ihren" Ton zu erreichen. Auch bewirkt Dein Anschlag selber eine leichte Verstimmung. Dummerweise ist sie in diesem Moment aber fast am Lautesten und wird ab diesem Moment sehr schnell leiser. Aus diesem Grunde brauchst Du auch noch einen Verstärker der hiermit umgehen kann. Das Stichwort hierzu lautet: Variable Verstärkung. Alternativ: Verstärkung bis in die Begrenzung. Keine Ahnung, was da der bessere Weg ist. Mit Sicherheit wirst Du dass aber herausbekommen, wenn alle diesen Beitrag zerrissen haben. 4. Erst ab diesem Punkt, kannst Du das Thema A/D-Wandlung oder Vergleicher auf den Tisch bringen. Ist dein Eingang einseitig, so wirst Du wohl auch um eine Gleichrichtung nicht herumkommen. 5. Erst ab hier bist Du im Computer.
Mark Remark schrieb: > vampire schrieb: >> -- ein RC-Glied ist mit den Arbeitspunkt-Widerständen R1/R2 und C3 schon >> geg.; > > Die meinte ich, in seiner Schaltung. Aber ich hab ja ein fertig > bestücktes myAVR mk3 Board. Da müsste ich ja dann in C den filter > schreiben, oder halt unschön davorklemmen. Eine Arbeitspunkteinstellung kannst Du eben nicht in C schreiben. Das Ding MUSST Du davor setzen, denn der ADC kann keine negativen Spannungen wandeln. Das ist das, was Du nicht verstehst und was Dir die Leute die ganze Zeit versuchen zu sagen! Gruß Jobst
Jobst M. schrieb: > Mark Remark schrieb: >> vampire schrieb: >>> -- ein RC-Glied ist mit den Arbeitspunkt-Widerständen R1/R2 und C3 schon >>> geg.; >> >> Die meinte ich, in seiner Schaltung. Aber ich hab ja ein fertig >> bestücktes myAVR mk3 Board. Da müsste ich ja dann in C den filter >> schreiben, oder halt unschön davorklemmen. > > Eine Arbeitspunkteinstellung kannst Du eben nicht in C schreiben. Das > Ding MUSST Du davor setzen, denn der ADC kann keine negativen Spannungen > wandeln. Das ist das, was Du nicht verstehst und was Dir die Leute die > ganze Zeit versuchen zu sagen! Das war auch der Grund für meine Resignation ;-) Mark Remark schrieb: > Simon K. schrieb: >> Mark Remark schrieb: >>> Kann es sein das mir da einfach wie in seiner Schaltung ein RC Glied >>> fehlt zum vorfiltern? Müsst ich ja bei meinem Board dann code technisch >>> realisieren? >> >> Ohje ohje ohje. > > Du bist mein Held! Aber der Zaunpfahl war wohl immer noch nicht groß genug.
Ok - ich hoffe du hast das jetzt mit dem Prescaler richtig aufgegriffen und nachgesehen, ob der Prescaler so eingestellt ist, dass der ADC richtig arbeiten kann. Wenn du (erst mal!!!) ein Sinussignal (über den Kondensator und den Spannungsteiler) einspeist, müsstest du die Sinusperiode ordentlich messen können, indem du nach den Zeitpunkten suchst, wo das ADC-Signal von < 512 nach >= 512 wechselt (positive Nulldurchgänge). Aber nicht genau genug. Warum? - jede AD-Wandlung benötigt 13 µC-Takte, somit ist die zeitliche Auflösung zu grob. Trick: Nimm nicht die Zeit von einem zum nächsten pos. Nulldurchgang, sondern zähle, wieviel davon in z.B. 0,2 s auftreten. Dann kann die Frequenz schon um ein bis zwei Größenordnungen genauer berechnet werden! (Also 0,07 Hz...0,007 Hz statt 0,7 Hz Abweichung) Wenn du das probiert hast, gehts weiter.
Ich habe in diesem Breich keine Erfahrung, würde aber aus dem Bauch heraus erstmal folgenden Ansatz wählen: Analoger Signalpfad: Kräftiges Tiefpassfilter um unten alles loszuwerden, Regelbare Verstärkerstufe (AGC oder vo uC gesteuert) AC gekoppelt auf den ADC der DC mässig auf 1/2 des Messbereichs vorgespannt wird. ADC rennen lassen was er kann und per FFT den klingenden Ton ermitteln. Dann Abastrate in die Nähe des klingenden Tones und FFT auf die Aliasingfrequenzen. Begrenzend wird vermutlich das verfügbare RAM sein. Gibt allerdings eine ziemliche Rechenschlacht. schönen Abend Hauspapa
Ein AGC ist vermutlich nicht so wichtig. Eine einfache Emitterschaltung mit Stromgegenkopplung und überbrückenden Kondensator wirds schon tun. Ist doch egal, ob das Ding nachher rechteckig ist, wenn es sowieso digital weiterverarbeitet wird.
AGC halte ich für problematisch bei Signalen mit vielen spektralen Anteilen, genauso wie Begrenzen zum Rechtecksignal. Die AGC/Begrenzer wirkt wie ein Mischer und erzeugt damit auch Intermodulationsverzerrungen. Wenn man später z.B. mit FFT auswertet und die Auflösung zu gering ist (was bei einer FFT auf AVR wohl immer so ist), dann verschieben die Intermodulationsanteile eventuell die Hauptkeule die man detektieren will und das Stimmgerät wird ungenau. Was allerdings geht ist, die AGC zum Training kurz laufen zu lassen und den Pegel dann festhalten, das Signal wird ja mit der Zeit eher abklingen.
Hauspapa schrieb: > Analoger Signalpfad: Kräftiges Tiefpassfilter um unten alles > loszuwerden, Dann ist der Tiefpass aber falsch ... Ich würde das Signal über eine gewisse Dauer samplen und dann mit der gesuchten Frequenz mischen (Multiplikation). Auf die Ergebnisse einen Tiefpass anwenden und die Schwebung ist die Abweichung von der Sollfrequenz. Nix mit Nulldurchgängen oder FFT! Gruß Jobst
>Dann ist der Tiefpass aber falsch ... Da hast Du ganz klar Recht. >Ich würde das Signal über eine gewisse Dauer samplen und dann mit der >gesuchten Frequenz mischen (Multiplikation). Die Lösung gefällt mir. Geschickt gemacht geht das mit sehr wenig Rechenaufwand und vor allem mit sehr wenig RAM, was meiner Meinung nach schnell begrenzend wirkt. Rechenschritte kann der uC ein paar Millionen bis zum nächsten Displayupdate, RAM ist irgendwann voll wenn man z.B. für FFT einen Haufen Messwerte zwischenspeichern muss. Wobei Atmel hier mit 8k für einen 8Bitter nicht geizig war. schönen Tag Hauspapa
Jobst M. schrieb: > Hauspapa schrieb: >> Analoger Signalpfad: Kräftiges Tiefpassfilter um unten alles >> loszuwerden, > > Dann ist der Tiefpass aber falsch ... > > > Ich würde das Signal über eine gewisse Dauer samplen und dann mit der > gesuchten Frequenz mischen (Multiplikation). Auf die Ergebnisse einen > Tiefpass anwenden und die Schwebung ist die Abweichung von der > Sollfrequenz. > Nix mit Nulldurchgängen oder FFT! Wo ist der Unterschied zwischen einer FFT und einer Korrelation, so wie du sie vor hast? ;-) Außer in der Frequenzauflösung natürlich. Dieses Prinzip war oben von Michael schon erwähnt wurden und ich bin immer noch nicht so ganz im Klaren, ob man damit ne gute Anzeigefrequenz erreicht, weil das doch nicht ganz so trivial ist für einen Mikrocontroller. Immerhin muss man das ganze Prozedere mit jeder möglichen Saite durchziehen.
Die FFT liefert dir nie eine exakte Frequenz. Sie eignet sich also gar nicht zur Frequenzmessung. Beim Mischen mit der exakt richtigen Frequenz kommt die Differenzfrequenz hinten raus. DQ Mischer braucht man um das Vorzeichen zu bestimmen. Ist die Differenzfrequenz 0 (DC), dann bist du exakt auf der richtigen Frequenz. PS Mit einer FFT kann man auch messen. Dann solte die Abtastfrquenz aber ein exaktes vielfaches des Tones sein. PPL Regelkreis. So kann man auch alle Obertöne exakt erfassen. Macht man zumbeispiel bei der Analyse von Harmonischen im Energieversorgungsnetz so. Ist aber auch eine ganz andere Aufgabe. Mfg Michael
Oje, danke danke für die zahlreichen Antworten. War ein paar Tage verhindert. Die Woche hab ich wieder Zeit daran zu sitzen und werden die nützlichen Hinweisen mal abarbeiten. >> Die meinte ich, in seiner Schaltung. Aber ich hab ja ein fertig >> bestücktes myAVR mk3 Board. Da müsste ich ja dann in C den filter >> schreiben, oder halt unschön davorklemmen. > > Eine Arbeitspunkteinstellung kannst Du eben nicht in C schreiben. Das > Ding MUSST Du davor setzen, denn der ADC kann keine negativen Spannungen > wandeln. Das ist das, was Du nicht verstehst und was Dir die Leute die > ganze Zeit versuchen zu sagen! Bin doch schon lange weg vom ADC ( das ist was du nicht verstanden hast und mir keiner die ganze Zeit erklärt;)). Sondern beim Input über einen normalen IO-Pin. Das man einen Tiefpass in C-Realisieren kann finde ich ja hier sogar erklärt im Forum, hatte mich aber noch nicht weiter damit beschäftigen können ob das für meinen Fall auch Sinn macht. Und da ich wie gesagt ein fertig bestücktes Board habe werde ich auch nichts anklemmen und Co. Sondern dann ggf. einen anderen, besseren Weg gehen. Scheint ja X zu geben. Ich werde das morgen alles mal hier sichten und dann werdet ihr sicher wieder von mir hören. Bis dahin, danke für die Mühe. Grüße
Mark Remark schrieb: > Bin doch schon lange weg vom ADC ( das ist was du nicht verstanden hast > und mir keiner die ganze Zeit erklärt;)) Und Du glaubst nun, dass Du das Problem damit erschlagen hättest? Du bekommst ehr mehr Probleme ... egal ... Mark Remark schrieb: > Das man einen Tiefpass in C-Realisieren kann finde ich ja hier sogar > erklärt im Forum. Stimmt, dagegen hat auch nie jemand etwas gesagt. Aber der hilft Dir nicht dabei, das Signal in den µC zu bekommen. Dafür benötigst Du Hardware. Egal, ob Du das möchtest oder nicht oder nicht verstehst oder Dich mit den Fäusten auf den Boden schlagend hinwirfst. Simon K. schrieb: > Das war auch der Grund für meine Resignation ;-) Warte, ich komme mit! Gruß Jobst
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.