Schnelle Tonhöhenerkennung


8

Ich muss die Tonhöhe erkennen (Signalfrequenz messen), während die Musiker Musik spielen, und eine Warnung geben, wenn sie verstimmt sind, aber die Musik ist für FFT (Fast Fourier Transform) etwas zu schnell.

Im Folgenden versuche ich, eine technische Beschreibung des Problems zu geben.

Musiker spielen Musik mit 90-140 Schlägen pro Minute. Dies bedeutet, dass es pro Minute 90-140 Notengruppen gibt, bis zu 8 (häufiger bis zu 4) Noten in jeder Gruppe (60/140/8 = 0,0536 Sek., 60/90/4 = 0,167 Sek.) Das heißt, Noten können sich mit einer Geschwindigkeit von 6 bis 19 Noten pro Sekunde ändern.

Die Musik verwendet eine logarithmische Skala (siehe das beigefügte Bild): Der Bereich zwischen beispielsweise 440 Hz und 880 Hz ist in 12 Noten unterteilt, von denen nur 7 für die Melodie verwendet werden. (Grundsätzlich verwenden sie nur die weißen Tasten am Klavier. Wenn sie die Startfrequenz verschieben möchten, verwenden sie einige der schwarzen Tasten und keine weißen Tasten.) Das heißt, die Frequenz jeder nächsten Note wird multipliziert um 2 ^ (1/12) = 1,05946.

Um die Sache komplizierter zu machen, kann die A (La) -Frequenz von 438 bis 446 Hz variieren. Die Saiteninstrumente können theoretisch gestimmt werden, während die Blasinstrumente von der Lufttemperatur und Luftfeuchtigkeit abhängen, sodass die Frequenz von den Musikern während des Soundchecks neu ausgehandelt wird.

Manchmal machen Musiker und Sänger Frequenzfehler, sie nennen es "verstimmt". Sie wollen ein Gerät, das sie über solche "verstimmten Fehler" informiert. Sie haben Tuner, aber die Tuner müssen ungefähr 1 Sekunde lang denselben Sound spielen, bevor sie etwas zeigen. Dies funktioniert zum Stimmen, aber nicht, während die Musik abgespielt wird.

df=1/.T.

Für A = 440 Hz beträgt der Frequenzunterschied zwischen zwei Noten 440 * 0,05946 = 26,16 Hz. Um diese Frequenzauflösung zu erhalten, muss eine Erfassungszeit von 0,038 Sekunden verwendet werden, dh bei Tempo = 196 bpm kann FFT nur zwei unterscheiden stellt fest, dass bei 98 Schlägen pro Minute ein 50% iger Verstimmungsfehler festgestellt werden kann, vorausgesetzt, die Erfassung beginnt in dem Moment, in dem sich die Tonhöhe ändert. Wenn wir die Tonhöhenänderung im Verlauf einer Erfassungsperiode zulassen, erhalten wir 49 Schläge pro Minute, was einfach zu langsam ist. Darüber hinaus ist es sehr wünschenswert, die Frequenz genauer zu bestimmen, beispielsweise einen Fehler von 25% oder 12% zu erkennen.

Gibt es eine Möglichkeit, die Frequenz (Tonhöhenerkennung) besser als die FFT zu messen, dh mit einer besseren Auflösung in kürzerer Erfassungszeit? (Mindestens 2-mal besser, idealerweise 8-16-mal besser.) Im Gegenzug muss ich nicht zwischen Noten unterschiedlicher Oktaven unterscheiden, z. B. können sowohl 440 als auch 880 als A erkannt werden. Ich brauche die Linearität von FFT nicht Ausgabe wäre eine logarithmische Skala besser. (Wahrscheinlich sind weitere Kompromisse möglich, mir fällt gerade nichts anderes ein.)

Hier ist eine wirklich gute Zeichnung:

Beachten Sie die aus Wikipedia verknüpften Frequenzen


schöne Zeichnung. Sie sollten es auf den Kopf stellen, damit die Schlüsselsymbole (und der musikalische Stab) richtig herum sind. aber dann wären alle Frequenz- und Perioden- und MIDI-Nummern auf dem Kopf.
Robert Bristow-Johnson

Dies klingt so, als ob Sie eine polyphone Tonhöhenerkennung anstelle einer monophonen (dh jeweils einer Note) Erkennung benötigen. Ist das korrekt?
Jazzmaniac

@Jazzmaniac Polyphonic wäre definitiv ein Plus, das heißt, monophon wäre eine Einschränkung. Wenn ich FFT verwenden könnte, würde ich mehrere Peaks in einem 2D-Frequenz-Zeit-Diagramm anzeigen. Wenn ich das richtig verstehe, sind die Blasinstrumente dagegen monophon, und die Geige ist dem ziemlich nahe.
18446744073709551615

Blasinstrumente arbeiten definitiv mit monophonen Erkennungsalgorithmen. Saiteninstrumente (mit mehr als einer Saite) sind jedoch schwierig, und die meisten, wenn nicht alle monophonen Detektoren erzeugen unzuverlässige oder sogar unbrauchbare Ergebnisse, wenn abklingende Töne von nicht perfekt gedämpften Saiten, offenen Saiten, die mitschwingen oder nur vom Mikrofon übersprechen. Die polyphone Erkennung ist jedoch schwierig. Da Sie jedoch keine genaue Notenerkennung benötigen, sondern nur eine genaue In-Tune-Erkennung, finden Sie möglicherweise einen geeigneten Algorithmus. Es wird jedoch kein monophoner Pitch-Detektor sein.
Jazzmaniac

Dies könnte die Ablehnung der Antwort von RBJ erklären, oder jemand könnte sich über sein etwas nicht objektives Verkaufsgespräch geärgert haben. Springen Sie auf keinen Fall zu früh auf sein Schiff. Es gibt andere Optionen für das, was Sie wollen, und möglicherweise auch bessere.
Jazzmaniac

Antworten:


9

" Gibt es eine Möglichkeit, die Frequenz (Tonhöhenerkennung) besser als die FFT zu messen, dh mit einer besseren Auflösung in kürzerer Erfassungszeit? "

ja da ist. oder sind. Es gibt mehrere bessere Möglichkeiten, die Tonhöhenerkennung in Echtzeit zu erkennen, die weitaus besser sind als das Ausführen einer FFT.

Bedenken Sie :

Average Magnitude Difference Function (AMDF)

Q.x[k]]=n|x[n]]- -x[n- -k]]|

Average Squared Difference Function (ASDF)

Q.x[k]]=n(x[n]]- -x[n- -k]])2

Autokorrelationsfunktion (AF)

R.x[k]]=nx[n]]x[n- -k]]

Beachten Sie, dass ich schnell und locker mit den Grenzen der Summierung spiele.

kx[n]]x[n- -k]]

Mein Favorit ist ASDF (und das ist ein kaum verhülltes Geschäftsgeheimnis, das ich gerade allen angekündigt habe, aber die Leute auf comp.dsp wussten das bereits). Dies sind alles Zeitbereiche, AMDF und ASDF sehen sich sehr ähnlich und ASDF sieht aus wie eine verkehrte Version von AF. Sie suchen nach Nullen in AMDF oder ASDF oder nach Spitzen in AF, die potenziellen Periodenlängen des quasi-periodischen Eingangs entsprechen würden.

Hier sind ein paar andere Tricks:

  1. N.N.k

  2. kkk

  3. k

  4. k

  5. Der ganze Trick (und dies ist die geheime Sauce, für die Geschäftsgeheimnisse und IVL-Patente gelten) besteht darin, bei mehreren Kandidaten den richtigen Peak oder Null zu wählen . Die Auswahl des falschen Peaks oder Null führt zu einem "Oktavfehler". Ich werde dir nicht sagen, wie das geht. Nutze deine Vorstellungskraft.

Senden Sie mir eine E-Mail, und wir können die Vertragsbedingungen besprechen, wenn ich Ihnen einen Kick-Ass-Pitch-Detektor entwerfen soll. viel besser als YIN, was meiner Meinung nach wie Scheiße funktioniert.


1
Ein Kommentar zum Down-Voting wäre willkommen. Wenn etwas nicht stimmt, möchte ich das wissen. Diese Antwort gibt kein Rezept, aber zumindest gibt es eine Liste, worüber man lesen kann (nun, das klingt nicht einfach zu lesen, aber es ist etwas, das besser ist als nichts). Bitte löschen Sie diese Antwort nicht.
18446744073709551615

1
Wer würde die Antwort löschen? mir?
Robert Bristow-Johnson

3

Ich habe Ihre Frage hier bereits beantwortet: /programming/33667275/fast-frequency-measurement/33678202#33678202

Zusammenfassend lässt sich sagen, dass Sie unter bestimmten Umständen ein FFT-Ergebnis auf eine feinere Auflösung als den FFT-Bin-Abstand interpolieren können, sodass Sie ein kürzeres Datenfenster für eine bessere Zeitauflösung verwenden können.

Die FFT-Frequenz ist jedoch keine Tonhöhenfrequenz. Und für einige Musikinstrumente (solche, die leicht unharmonische Obertöne erzeugen) ist auch die Frequenz der Autokorrelationsfunktion (oder ihrer Verwandten wie AMDF) nicht. Das liegt daran, dass Tonhöhe ein psychoakustisches Phänomen ist.


Zwei Anmerkungen: Wenn Sie möchten, dass Ihre Tonhöhenerkennung " schnell " ist, würde ich dies nicht im Frequenzbereich empfehlen (es sei denn, Sie machen eine Sache mit mehreren Raten mit mehreren FFTs. Der Grund dafür ist, dass Sie es sind Ich kann nicht einmal mit der FFT beginnen, bis Sie alle Samples erhalten haben. Für eine FFT mit anständiger Länge (um eine ausreichende Auflösung bei niedrigen Tonhöhen zu erhalten) haben Sie bereits gewartet, beispielsweise 0,1 Sekunden. Tonhöhe (und Lautstärke) sind psychoakustische Maßnahmen, die manchmal auftreten korrelieren gut mit physikalischen Eigenschaften wie Periode (und Kraft). Für Glocken, Toms erhalten Sie eine Tonhöhe, aber es könnte nicht das Richtige bedeuten.
Robert Bristow-Johnson

Aber ich habe gerade mein kleines Matlab-Skript für einen aufgezeichneten Tom-Hit ausgeführt und es klang für mich, dass die zurückgegebene Tonhöhe ein plausibler Notenwert wäre.
Robert Bristow-Johnson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.