Kann ich mit der FFT Noten auf einem Klavier erkennen?


13

Ich möchte ein Werkzeug erstellen, das ein paar Noten erkennt (ich weiß, das Rad wird neu erfunden). Also würde ich auf einem Klavier Mittel C, D und E spielen und es sollte in der Lage sein, diese Noten zu klassifizieren. Hier ist, wie ich denke, ich sollte es angehen:

  1. Nimm ein Beispiel von mir auf, wie ich eine Note spiele
  2. Konvertieren Sie das Signal mit der schnellen Fourier-Transformation in den Frequenzbereich
  3. Finden Sie die Frequenz, die am meisten vorhanden ist (im Grunde Argmax der Frequenzdomänendaten)
  4. Nehmen Sie an, dass die Frequenz von der gespielten Note stammt, und klassifizieren Sie die Note damit

Ich habe noch nichts davon ausprobiert, weil ich nicht den falschen Weg einschlagen möchte. Theoretisch funktioniert das also?


Es wäre schön, wenn Sie den Titel genauer beschreiben könnten. Ich habe versucht, ein wenig über die Erkennung von Klavierabständen zu schreiben, aber mein (nicht-muttersprachliches) Englisch scheint mir heute nicht zu helfen.
Pipe

1
@pipe ok ich habe es geändert
michaelsnowden

1
Ihr "Sample" für das Spielen einer Note sollte bereits eine Wellenform aus Amplitude und Zeit sein. Punkt 2 ist im Wesentlichen überflüssig. Für eine relativ einfache Implementierung sollten die obigen Schritte in Ordnung sein.
user2943160

@ user2943160 Ich habe es hinzugefügt, um explizit zu sein. Sound kann in einer Vielzahl von Formaten gespeichert werden, und im Laufe der Zeit ist in der Regel etwas Mangeln erforderlich, um eine schöne Amplitude zu erreichen.
Michaelsnowden

y(t)=EINSünde(ωt)EINy(t)

Antworten:


23

Das Konzept ist gut, aber Sie werden feststellen, dass es in der Praxis nicht so einfach ist.

Tonhöhe ist nicht einfach der vorherrschende Ton, daher gibt es das Problem Nummer 1.

Die FFT-Frequenzbereiche können nicht alle (oder sogar mehrere) Töne der Musikskala gleichzeitig treffen.

Ich würde vorschlagen, mit einem Audioprogramm (z. B. Audacity) zu spielen, das einen FFT-Analysator und einen Tongenerator enthält, um ein Gefühl dafür zu bekommen, was es kann (und was nicht), bevor Sie versuchen, eine bestimmte Aufgabe mit der FFT zu implementieren.

Wenn Sie nur einige bestimmte Töne erkennen müssen, ist der Goertzel-Algorithmus möglicherweise einfacher und schneller.

Die Erkennung von Tonhöhen ist kompliziert, und auf diesem Gebiet wird noch geforscht. Die Erkennung von Tönen ist recht unkompliziert, führt jedoch möglicherweise nicht zu den gewünschten Ergebnissen.


Wenn wir mit der Annahme beginnen, dass die Samples von einem bestimmten Instrument stammen, ist das Problem möglicherweise etwas einfacher zu lösen, oder?
mkeith

Das sieht wirklich gut aus. Eine weitere Frage lautet: Kann der Goertzel-Algorithmus verwendet werden, um zwei gleichzeitig gespielte Noten zu erkennen?
Michaelsnowden

Es kann verwendet werden, um gleichzeitige Töne zu erkennen. Ob das ausreicht, um gleichzeitige Notizen zu erkennen, ist eine andere Frage, an der ich noch arbeite. Ich habe einen Gitarrennotendetektor auf Goertzel-Basis, mit dem ich seit Jahren herumalbern kann.
JRE

2
@mkeith: Irgendwie. Sie können die Noten testen und feststellen, ob die Erkennung des vorherrschenden Tons für ein bestimmtes Instrument (und möglicherweise nur für die Noten von Interesse) angemessen ist. Es gibt meines Wissens jedoch keine allgemeine Lösung, um alle Noten aller Instrumente zu erkennen.
JRE

3

Ich würde sagen, ein multimodales Beobachtungsfenster des Signals wäre besser. Etwas in der Art einer Wavelet-Zerlegung Ihres Audiosignals, mit der Sie die mehreren Obertöne in der Note identifizieren können. Ja, eigentlich Wavelets, ich würde sagen, das ist der richtige Weg.

Dies ist eine sehr verallgemeinerte Aufschlüsselung der Wavelets. Stellen Sie sich diese jedoch als ein Fenster mit mehreren Auflösungen vor, das wie eine STFT über Ihr Signal läuft. So können Sie verschiedene Sinuskurven identifizieren, die an verschiedenen zeitlichen Orten in Ihrem Signal auftreten. Dies ist auch wichtig, da die gespielte Note kein stationäres Signal ist, sondern abgespielt wird und dann mit der Zeit abfällt. Ich bin kein Musiker, aber ich glaube, dass sich die Dominanz der Töne während des Zerfalls der Note ändert.

Natürlich müssen Sie nach der Wavelet-Zerlegung Algorithmen implementieren, die Noten und periphere Töne identifizieren.

Ich denke, Wavelets adressieren wirklich die Probleme, über die die Leute in Bezug auf die Tonhöhenidentifikation geredet haben.

wenn Sie möchten , lernen , wie Wavelets arbeiten dies ein wunderbar White Paper von HP über sie veröffentlicht :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf und Einführung in die Wavelets

Für die Implementierung hat MATLAB ein Wavelet-Tool und ich bin sicher, dass es eine Vielzahl anderer Pakete für Plattformen wie R usw. gibt.


1

Ich denke, Sie denken an Noten, die in der Mitte des Klavierbereichs gespielt werden (etwa zwischen 200 und 500 Hz), aber selbst in diesem Bereich hat eine einzelne Note viele Obertöne, die keine exakten Vielfachen der Grundfrequenz sind, und auch eine erhebliche Menge an Breitbandrauschen am Anfang jeder Note und vielleicht auch am Ende.

Bei lauten Noten am unteren Ende des Notenbereichs wird festgestellt, dass sich nur sehr wenig Schallenergie (weniger als 1%) in der Grundtonhöhe der Note befindet.

Ein weiteres Problem besteht darin, dass bei einer naiven Interpretation einer FFT davon ausgegangen wird, dass das zu erkennende Signal eine konstante Amplitude aufweist. Dies gilt nicht für Pianonoten, bei denen die Amplitude tatsächlich mehreren überlagerten exponentiellen Zerfällen folgt - der anfängliche Teil des Zerfalls hat eine relativ kurze Zeitkonstante, der spätere Teil jedoch eine längere Zeitkonstante.

Möglicherweise sind Sie besser in der Lage, Fourier-Transformationsmethoden mit kurzer Zeitskala zu untersuchen, z. B. die Gabor-Transformation oder Wavelet-basierte Methoden.

Beachten Sie, dass die Grundtonhöhe aufeinanderfolgender Noten für jede Note um etwa 6% zunimmt, sodass Sie bei der Identifizierung der Frequenzen der Harmonischen im Audio nicht unbedingt eine sehr hohe Genauigkeit benötigen. Das korrekte Identifizieren von Musiknoten ist nicht das gleiche Problem wie das Bestimmen, ob die Noten genau mit einer Musikskala übereinstimmen, bei der Frequenzen möglicherweise mit einer Genauigkeit von mehr als 0,1% gemessen werden müssen.


0

Ja, darum geht es in der FFT! Geben Sie das Frequenzspektrum der von Ihnen eingegebenen Daten an. Der schwierige Teil sind die Implementierungsdetails, wie Sie bereits erwähnt haben.

Je nachdem, was Sie genau tun möchten, ändert sich die Antwort.

Wenn Sie nur Ihre eigene Musik analysieren möchten, gibt es bereits Software dafür. Sie können sich EQs ansehen, die die Antwort anzeigen (im Grunde genommen die FFT), oder einen "musikalischen EQ" erhalten, der auch die Tonhöhen anzeigt. Sie können Audio zu MIDI-VSTs übertragen, die das, was Sie spielen, in die richtigen MIDI-Noten umwandeln. Wenn Ihr Keyboard MIDI ist, überspringen Sie einfach die VSTs und nehmen Sie das MIDI direkt auf.

Wenn Sie sich die FFT beibringen möchten und wissen möchten, wie sie sich auf Musik bezieht, sollten Sie sich Matlab zulegen, mit dem Sie die FFT aller Daten berechnen können. Es hat die Fähigkeit, aufzunehmen und auch wiederzugeben, zusammen mit dem Lesen von WAV-Dateien und dergleichen. Diese sind dann wirklich einfach zu bedienen. Sie können das Audio grafisch darstellen und alle Arten von Analysen ziemlich schnell durchführen, wenn Sie die Syntax kennen.

Wenn Sie ein Gerät bauen wollen, das so etwas macht, dann ist es ziemlich komplex. Sie benötigen eine uC / dsp / fpga / etc, um die Berechnungen durchzuführen. Die meisten gängigen Geräte sind bereits mit FFT-Code ausgestattet, sodass Sie ihn nicht selbst codieren müssen (auch kompliziert).

Sie müssen die Schaltung und all das bauen. Es ist nicht schwierig, aber abhängig von Ihren Erfahrungen / Kenntnissen kann es einige Zeit dauern und es gibt eine steile Lernkurve. Dies hängt auch von der Qualität des Endprodukts ab.

Mathematisch gesehen besteht eine ideale Musiknote aus einer geometrischen Reihe des "Grundtons".

Angenommen, F0 ist die Grundfrequenz, dann werden die meisten Noten durch F (t) + F0 * sum (a_k e ^ (2 ^ k ) angenähert F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 +. ...

Die a_k sind nur die Stärke dieser höheren Frequenzen F_k und F_k ist nur ein Vielfaches von F0. Wenn a_k = 0 für alle k, dann haben wir eine reine Sinuskurve. Die Tonhöhe ist leicht zu erkennen. Finden Sie einfach das Maximum der FFT und diese Frequenz ist die Grundlage des Tons = der Musiknote.

Wenn Sie die FFT nehmen, erhalten Sie diese Daten und können einfach weiter rechnen. Es ist im Grunde genommen Kalkül.

Das ist alles relativ einfach.

Einige Probleme, mit denen Sie sich befassen müssen. Beachten Sie, dass nicht alle von diesen "gelöst" sind.

  1. Latenz - Wenn Sie irgendwelche Echtzeitaufgaben ausführen, kann dies zu einem Problem werden.

  2. Mehrere Noten - Es ist schwierig, die Notengruppe zu bestimmen, da alle zusätzlichen Harmonischen vorhanden sind. Wenn Sie A = 440Hz und A '= 880Hz spielen, überlappen sich die meisten Harmonischen. Sie können leicht die A = 440Hz bekommen, aber die A '= 880Hz zu bekommen ist schwieriger. Wenn Sie an Akkorde, schnelle Läufe usw. denken, kann es sehr schwierig sein, alle Informationen (Noten) präzise abzurufen. Während im Allgemeinen alles mathematisch möglich ist, weisen die Daten selbst Fehler und Aberrationen auf, und die Gleichungen sind in einigen Fällen unterdefiniert.

  3. Rauschen - Rauschen im Signal kann zu falschen Ergebnissen führen. Wenn ein Musikgeräusch auftritt, kann es Ihre Ergebnisse verfälschen. Dann wären bessere Algorithmen erforderlich = Zeit + Geld + Wissen.

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.