Hallo, momentan fange ich an micht in die Audiotechnik mittels DSP einzuarbeiten. Als erstes Projekt wollte ich ein digitales Stimmgerät bauen. Dazu wird ein Gitarrensignal mit einer Abtastrate von 13kHz abgetastet. Es werden 1024 Samples aufgenommen. Anschließend werden die Messdaten teilweise nach dem YIN-Algorithmus ausgewertet (Bildung der Kumulativen mittleren normalisierten Differenzfunktion (Schritt 3) und bestimmung des Tiefpunkts). Dies funktioniert auch so weit, jedoch ist die Auflösung, gerade für die hohe e Saite (329,63 Hz) sehr schlecht. Es werden entweder 325 Hz oder 333 Hz ausgegeben, dazwischen liegt leider nichts. Wie lässt sich die Auflösung für die hohen Saiten nun erhöhen? Viele Grüße Hannes
Ohne den YIN-Algorithmus zu kennen, vermute ich mal, dass du das Verhältnis Samplerate/Samples verkleinern musst , also niedrigere Abtastrate oder mehr Samples.
> Ohne den YIN-Algorithmus zu kennen, vermute ich mal,
dass der dann dafuer ncihts taugt. wenn er nut 8 Hz aufloest.
Ich wuerde als Aufloesung 0.1 Hz anstreben, das entspricht
einer Schwebung von 10 s.
Also entweder die Samplingrate entsprechend anpassen, oder mit
Oversampling "passende" Zwischenwerte ausrechnen und einfuegen.
Hannes schrieb: > Es werden entweder 325 Hz oder 333 Hz ausgegeben, dazwischen liegt leider > nichts. Wie funktioniert dein Algorithmus? Selbst durch einfache gewichtete Interpolation zwischen den FFT-Werten bekommt man eigentlich Kommastellen heraus. Und sollte das Auflösungsproblem nicht bei den tiefen Saiten bestehen?
Vielen Dank für die Antworten. Leider erzielt man mit der Erhöhung der Sampleanzahl keine höhere Auflösung. Das Problem ist, dass sich die Frequenz aus dem Qutienten der Abtastfrequenz und dem jeweiligen Sample des Peaks bestimmt (fs/i). i stellt dabei einen integer dar. Dadurch kommt ergibt sich bei Abtastrate von 13kHz: i=158: 82,28 Hz i=157: 82,8 Hz i=156: 83,33 Hz Für hohe Frequenzen ist das i kleiner dadurch ergibt sich: i=38: 342,10 Hz i=39: 333,33 Hz i=40: 325 Hz
Bei einem Stimmgerät, das nur eine Saite einstellen soll, ist eine Spektralanalyse eher hinderlich. Da nimmt man besser 2,3 Zielfrequenzen, die man kontinuierlich adaptiert. Also: Frequenzschätzung, Anpassung des Abtastintervalls, Filterung mit Sinus und Neuschätzung der neuen Punkte. Bei z.B. 12 Messwerten je Welle kann man noch die 2. und 3. Oberwelle rausnehmen. Bei 3-4 Wellendurchgängen und 8-10 Adaptionsiterationen hat man auch bei einem 100Hz-Bass binnen weniger Sekunden (einmal Anzupfen) die Frequenz eingestellt. Als Beispiel die Iteration von meiner Webseite mit dem einfachsen Ansatz von nur einer Mittenfrequenz und klassischem Links-/Rechts-Entscheid zum weiterrechnen. ----------------------------- Bei entsprechender Rechenleistung geht es mit etwas Speicher auch mit mehreren Ansätzen "gleichzeitig". Mein Audio-2-MIDI-Converter prozessiert der Welle so schnell hinterher, dass auch das Vibrato auf der Saite miterfasst und in einem Frequenzwert umgewandelt wird.
Vielen Dank. Leider habe ist mir das noch nicht so ganz klar. Die Abtastrate würde ich gerne konstant halten. Wie filtere ich mit einem Sinus? Dazu müsste man das Signal im Frequenzbereich mit einem Dirac-Impuls multiplizieren oder? Leider habe ich das Problem immer noch nicht gelöst. Ich habe versucht das Hauptminimum als Grundfrequenz anzunehmen und dann über die Harmonische, welche ein deultich höheren Index hat, die genaue Frequenz zu bestimmen. Jedoch liegen andere Minimas in der umgebung, welche genauso aussehen wie das Mimimum der Harmonischen. Schönen Sonntag Hannes
Ich würde einen anderen Ansatz wählen: In meiner Kinheit stimmte ich meine Instrumente mit einem Z80 und einem Oszilloskop: Mikrophon --> Verstärker mit Kompressor (AGC) --> Y-Achse des Oszis Z80 --> Timer erzeugt Sollfrequenz --> X-Achsen-Trigger Somit sieht man: Bild steht --> Frequenz richtig Schwingungen wandern --> nachstimmen. Ein Stimmgerät, welches auf diesem Prinzip basiert (nur mit LED-Streifen statt Oszi), ist das CTS5 von TLA, das Marc Michalzik gut beschrieben hat: http://www.bymm.de/documents/25/Rittertafelakkordeon_V1_24.pdf
Mit einem Prozessor würde das so aussehen: Samples regelmäßig starten mit einem Vielfachem der Soll-Periodendauer. Entweder anzeigen oder auswerten, ob (die oder der Beginn der) Schwingung steht oder nach links oder rechts wandert. Dein Beispiel 329,63 Hz / 1024 Samples @ 13kHz: Periodendauer = 1000 ms / 329,628 Hz = 3,03373 ms Sampledauer = 1024 ms / 13 = 78,7692ms 78,769230/3,03373=25,964482 Schwingungen pro Samplereihe d.h. nach 26 (oder 27..30) * 3,03373 ms = 78,876902 ms eine neue Sampelreihe starten und prüfen, ob die Schwingungen darin wandern.
Hannes schrieb: > Dazu müsste > man das Signal im Frequenzbereich mit einem Dirac-Impuls multiplizieren > oder? Wenn du das Signal im Frequenzbereich bearbeiten willst, brauchst du in jedem Fall die FFT.
Hannes schrieb: > Die Abtastrate würde > ich gerne konstant halten. Nicht die Abtastfrequenz, sondern die Zahl der Punkte. Wenn es genau sein soll, auch gerne noch die Frequenz. > Wie filtere ich mit einem Sinus? Indem du mit ihm multiplizierst. Der im Signal enthaltene Anteil, der dazu passt, addiert sich maximal, andere Frequenzen werden gedämpft.
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.