11

Ich versuche, ANN für Tonhöhenerkennung von Noten zu verwenden. Das Netzwerk ist ein einfaches zweischichtiges MLP, dessen Eingänge im Grunde eine DFT (gemittelt und logarithmisch verteilt) sind, und 12 Ausgänge entsprechen den 12 Noten einer bestimmten Oktave.Tonhöhenerkennung mit neuronalen Netzen

Das Netzwerk wird mit mehreren Samples dieser 12 Noten, die von einem Instrument gespielt werden (eine Note nach der anderen), und einigen Beispielen von "Stille" trainiert.

Die Ergebnisse sind eigentlich gut. Das Netzwerk ist in der Lage, die von verschiedenen Instrumenten gespielten Noten präzise zu erkennen, es ist relativ unhörbar gegenüber Rauschen und verliert auch nicht vollständig, wenn ein Lied gespielt wird.

Das Ziel ist jedoch, polyphonen Klang zu erkennen. Wenn also zwei oder mehr Noten zusammen gespielt werden, werden die zwei entsprechenden Neuronen feuern. Das Überraschende ist, dass das Netzwerk dies tatsächlich schon zu einem gewissen Grad tut (nur über monophone Samples trainiert), jedoch weniger konsistent und weniger genau als für monophone Noten. Meine Frage ist, wie kann ich die Fähigkeit verbessern, polyphnischen Sound zu erkennen?

Das Problem ist, ich verstehe nicht wirklich, warum es eigentlich schon funktioniert. Die verschiedenen Noten (oder ihre DFTs) sind grundsätzlich unterschiedliche Punkte im Raum, für die das Netzwerk trainiert wird. Ich sehe also, warum es ähnliche Laute (nahe gelegene Punkte) erkennt, aber nicht, wie es die Ausgabe für eine Kombination von Noten "abschließt" (die einen entfernten Punkt von jedem der Trainingsbeispiele bilden). Genauso wie ein UND-Netzwerk, das über (0,0) (0,1) (1,0) = (0) trainiert wird, wird nicht erwartet, dass (1,1) = (1) "schließt".

Der Brute-Force-Ansatz besteht darin, das Netzwerk mit möglichst vielen polyphonen Samples zu trainieren. Da das Netzwerk jedoch die Idee aus den monophonen Samples irgendwie vage zu verstehen scheint, gibt es hier wahrscheinlich etwas Fundierenderes.

Irgendwelche Zeiger? (Entschuldigung für die Länge, BTW :).

Antwort

6

Der Grund, warum es bereits funktioniert, ist wahrscheinlich ganz einfach, dass Sie es nicht trainiert haben, nur einen einzigen Ausgang auszuwählen (zumindest nehme ich an, dass Sie es nicht getan haben). In dem einfachen Fall, in dem die Ausgabe nur ein Skalarprodukt der Eingabe und der Gewichtungen ist, würden die Gewichtungen passende Filter für die entsprechende Tonhöhe werden. Da alles linear ist, würden mehrere Ausgänge gleichzeitig aktiviert werden, wenn mehrere übereinstimmende Filter gleichzeitig gute Übereinstimmungen sehen würden (wie es bei polyphonen Noten der Fall ist). Da Ihr Netzwerk wahrscheinlich Nichtlinearitäten enthält, ist das Bild etwas komplexer, aber die Idee ist wahrscheinlich die gleiche.

In Bezug auf Möglichkeiten, es zu verbessern, ist das Training mit polyphonen Samples sicherlich eine Möglichkeit. Eine andere Möglichkeit besteht darin, zu einem linearen Filter zu wechseln. Die DFT eines polyphonen Sounds ist im Grunde die Summe der DFTs jedes einzelnen Sounds. Sie möchten eine lineare Kombination von Eingängen zu einer entsprechenden linearen Kombination von Ausgängen, so dass ein linearer Filter geeignet ist.

Übrigens, warum verwenden Sie in erster Linie ein neuronales Netzwerk? Es scheint, dass nur ein Blick auf die DFT und sagen wir, die maximale Frequenz zu nehmen, bessere Ergebnisse leichter geben würde.

+3

einfach die maximale Frequenz nehmen ist sehr unzuverlässig – finnw

2

Ich experimentierte mit der Entwicklung eines CTRNN (Continuous Time Recurrent Neural Network) beim Erkennen der Differenz zwischen zwei Sinuswellen. Ich hatte mäßigen Erfolg, hatte aber nie Zeit, mit einer Bank dieser Neuronen (dh in Cochlear-ähnlichen Gruppen) zu arbeiten.

1

Ein möglicher Ansatz wäre, Genetic Programming (GP) zu verwenden, um kurze Codeschnipsel zu generieren, die die Tonhöhe erkennen. Auf diese Weise können Sie eine Regel für die Funktionsweise der Tonhöhenerkennung erstellen, die hoffentlich für den Menschen lesbar ist.

3

Anssi Klapuri ist ein renommierter Audioforscher, der eine Methode zur Tonhöhenerkennung bei polyphonen Aufnahmen mit neuronalen Netzen veröffentlicht hat.

Vielleicht möchten Sie Klapuri's Methode zu Ihrer vergleichen. Es ist vollständig in seiner Masterarbeit beschrieben, Signalverarbeitungsverfahren für die automatische Übertragung von Musik. Sie können seine vielen Artikel online finden oder kaufen Sie sein Buch, das seinen Algorithmus und Testergebnisse erklärt. Seine Masterarbeit ist unten verlinkt.

https://www.cs.tut.fi/sgn/arg/klap/phd/klap_phd.pdf

Pitch-Erkennung bei mehrstimmigen Aufnahmen ist ein sehr schwieriges Thema und viele Kontroversen enthält - hergestellt werden viel gelesen zu tun. Der folgende Link enthält einen weiteren Ansatz zur Tonhöhenerkennung bei polyphonen Aufnahmen, den ich für eine kostenlose App namens PitchScope Player entwickelt habe. Mein C++ - Quellcode ist auf GitHub.com verfügbar und wird über den folgenden Link referenziert. Eine kostenlose ausführbare Version von PitchScope Player ist auch im Internet verfügbar und läuft unter Windows.

Real time pitch detection