Autokorrelation: Digitales Stimmgerät Auflösung erhöhen

Gast #6832338
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
Gast
Ohne den YIN-Algorithmus zu kennen, vermute ich mal, dass du das 
Verhältnis Samplerate/Samples verkleinern musst , also niedrigere 
Abtastrate oder mehr Samples.
Gast
> 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.
Gast
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?
Gast
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
Persönliche Seite
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.
Angehängte Dateien:
Gast
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
Gast
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.