Forum: Digitale Signalverarbeitung / DSP / Machine Learning Autokorrelation: Digitales Stimmgerät Auflösung erhöhen


von Hannes (Gast)


Lesenswert?

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

von foobar (Gast)


Lesenswert?

Ohne den YIN-Algorithmus zu kennen, vermute ich mal, dass du das 
Verhältnis Samplerate/Samples verkleinern musst , also niedrigere 
Abtastrate oder mehr Samples.

von foobaz (Gast)


Lesenswert?

> 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.

von Horst (Gast)


Lesenswert?

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?

von Hannes (Gast)


Lesenswert?

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

von J. S. (engineer) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Hannes (Gast)


Lesenswert?

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

von eProfi (Gast)


Lesenswert?

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

von eProfi (Gast)


Lesenswert?

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.

von Nick (Gast)


Lesenswert?

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.

von J. S. (engineer) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.