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.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang