Frage

Wie können Sie mit begrenzten Ressourcen wie langsamerem CPUs, Codegröße und RAM die Tonhöhe eines musikalischen Notens am besten erkennen, ähnlich wie ein elektronischer oder Software -Tuner?

Sollte ich es benutzen:

  • Küssen fft
  • Fftw
  • Diskrete Wavelet -Transformation
  • Autokorrelation
  • Zero Crossing -Analyse
  • Oktave Filter

Sonstiges?

Kurz gesagt, ich versuche, eine einzelne musikalische Note zu erkennen, zwei Oktaven unter der Mitte der Mitte der oben genannten Oktaven, die auf einem (vernünftigen) Instrument gespielt werden. Ich würde gerne innerhalb von 20% des Semitons sein - mit anderen Worten, wenn der Benutzer zu flach oder zu scharf spielt, muss ich das unterscheiden. Ich werde jedoch nicht die für das Tuning erforderliche Genauigkeit benötigen.

War es hilfreich?

Lösung

Wenn Sie nicht so viel Genauigkeit brauchen, kann ein FFT ausreichen. Fenster Der Stück Audio, so dass Sie genau definierte Peaks erhalten, und dann den ersten signifikanten Peak finden.

Bin Breite = Stichprobenrate / FFT -Größe:

Grundlagen Bereich von 20 Hz bis 7 kHz, also würde eine Stichprobenrate von 14 kHz ausreichen. Die nächste "Standard" -Stichtrate beträgt 22050 Hz.

Die FFT -Größe wird dann durch die gewünschte Genauigkeit bestimmt. Die FFT -Ausgabe ist in der Frequenz linear, während musikalische Töne in der Frequenz logarithmisch sind, sodass die schlimmste Fallpräzision bei niedrigen Frequenzen liegt. Für 20% eines Semitons bei 20 Hz benötigen Sie eine Breite von 1,2 Hz, was eine FFT -Länge von bedeutet 18545. Die nächste Kraft von zwei ist 215 = 32768. Dies sind 1,5 Sekunden Daten und nimmt den Prozessor meines Laptops 3 ms zur Berechnung.

Dies funktioniert nicht mit Signalen, die eine haben "fehlende grundlegende", und es ist etwas schwierig, den" ersten signifikanten "Peak zu finden (seitdem Harmonische sind oft höher als die grundlegende), aber Sie können einen Weg finden, der zu Ihrer Situation passt.

Autokorrelation und harmonisches Produktspektrum sind besser darin, die wahre Grundlage für eine Welle anstelle einer der Harmonischen zu finden, aber ich glaube nicht, dass sie sich auch mit damit umgehen Inharmonizität, und die meisten Instrumente wie Klavier oder Gitarre sind inharmonisch (Harmonische sind etwas scharf von dem, was sie sein sollten). Es hängt jedoch wirklich von Ihren Umständen ab.

Außerdem können Sie noch mehr Prozessorzyklen sparen, indem Sie nur innerhalb eines bestimmten Frequenzbandes von Interesse berechnen, wobei die Chirp-Z-Transformation.

Ich habe geschrieben Einige verschiedene Methoden in Python zu Vergleichszwecken.

Andere Tipps

Wenn Sie in Echtzeit (und innerhalb von 1/100 von einem halb-ton) die Pitcherkennung durchführen möchten, ist Ihre einzige wirkliche Hoffnung der Ansatz mit Nullkreuzung. Und es ist eine schwache Hoffnung, tut mir leid zu sagen. Null-Crossing kann die Tonhöhe aus nur wenigen Wellenlängen von Daten abschätzen, und es kann mit der Verarbeitungsleistung eines Smartphones erfolgen. Es ist jedoch nicht besonders genau, da winzige Fehler bei der Messung der Wellenlängen zu großen Fehlern bei der geschätzten Frequenz führen. Geräte wie Gitarrensynthesizer (die die Tonhöhe aus einer Gitarrenfolge mit nur ein paar Wellenlängen ableiten) arbeiten, indem die Messungen an die Noten der Skala quantifiziert werden. Dies mag für Ihre Zwecke funktionieren, aber seien Sie sich bewusst, dass mit einfachen Wellenformen null Crossing hervorragend funktioniert, aber mit komplexeren Instrumentenklängen immer weniger gut funktioniert.

In meiner Anwendung (ein Software -Synthesizer, der auf Smartphones ausgeführt wird) verwende ich Aufzeichnungen von einzelnen Instrumentennoten als Rohstoff für die wellbare Synthese, und um Notizen auf einer bestimmten Tonhöhe zu produzieren Zu 1/1000 von einem halb-ton (ich brauche wirklich nur 1/100 Genauigkeit, aber ich bin OCD darüber). Der Ansatz der Nullkreuzung ist viel Zu diesem Zeitpunkt zu ungenau, und FFT-basierte Ansätze sind entweder viel zu ungenau oder viel zu langsam (oder beides).

Der beste Ansatz, den ich in diesem Fall gefunden habe, ist die Verwendung von Autokorrelation. Mit der Autokorrelation erraten Sie im Grunde die Tonhöhe und messen dann die Autokorrelation Ihrer Probe an dieser entsprechenden Wellenlänge. Durch das Durchsuchen des Bereichs der plausiblen Stellplätze (z. B. A = 55 Hz bis A = 880 Hz) semi-Tones finde ich die am meisten korrelierte Tonhöhe und mache dann einen feinkörnigen Scan in der Nachbarschaft dieser Tonhöhe, um a zu bekommen genauerer Wert.

Der Ansatz für Sie hängt ganz davon ab, wofür Sie dies verwenden möchten.

Ich bin nicht mit all den von Ihnen erwähnten Methoden vertraut, aber was Sie wählen, sollte hauptsächlich von der Art Ihrer Eingabedaten abhängen. Analysieren Sie reine Töne oder hat Ihre Eingangsquelle mehrere Notizen? Ist die Sprache eine Funktion Ihrer Eingabe? Gibt es Einschränkungen für die Zeitdauer, die Sie zur Eingabe probieren müssen? Können Sie etwas Genauigkeit gegen Geschwindigkeit einteilen?

In gewissem Maße hängt auch das, was Sie wählen, davon ab, ob Sie Ihre Berechnungen durchführen möchten Zeit oder in Frequenzraum. Konvertieren a Zeitfolgen Eine Frequenzdarstellung braucht Zeit, aber meiner Erfahrung nach liefert es bessere Ergebnisse.

Autokorrelation Vergleicht zwei Signale im Zeitbereich. Eine naive Implementierung ist einfach, aber relativ teuer zu berechnen, da sie eine paarweise Unterscheidung zwischen allen Punkten in den ursprünglichen und zeitverschobenen Signalen erfordert, gefolgt von Differenzierung, um Wendepunkte in der Autokorrelationsfunktion zu identifizieren, und dann die Auswahl des Minimums entsprechend dem entsprechend die grundlegende Häufigkeit. Es gibt alternative Methoden. Zum Beispiel, Durchschnittliche Größe Differenzierung ist eine sehr billige Form der Autokorrelation, aber Genauigkeit leidet. Alle Autokorrelationstechniken führen das Risiko von Oktavfehlern aus, da in der Funktion andere Peaks als die Grundlage vorhanden sind.

Messung Nullkreuzungspunkte ist einfach und unkompliziert, stößt aber auf Probleme, wenn im Signal mehrere Wellenformen vorhanden sind.

Im Frequenzraum, Techniken basierend auf Fft Kann für Ihre Zwecke effizient genug sein. Ein Beispiel ist die Harmonic -Produktspektrum -Technik, die das Leistungsspektrum des Signals mit Downget Sampled -Versionen bei jedem Harmonischen vergleicht und die Tonhöhe identifiziert, indem die Spektren miteinander multiplizieren, um einen klaren Peak zu erzeugen.

Wie immer gibt es keinen Ersatz für das Testen und Profilieren verschiedener Techniken, um empirisch zu bestimmen, was für Ihr Problem und Ihre Einschränkungen am besten geeignet ist.

Eine Antwort wie diese kann nur die Oberfläche dieses Themas kratzen. Neben den früheren Links finden Sie hier einige relevante Referenzen zum weiteren Lesen.

In meinem Projekt Daunstuner, Ich nahm Code von Unverfrorenheit. Es dauerte im Wesentlichen eine FFT und fand dann die Spitzenleistung, indem es eine Kubikkurve auf die FFT legte und den Peak dieser Kurve fand. Funktioniert ziemlich gut, obwohl ich mich gegen Oktave-Jumping schützen musste.

Sehen Spectrum.cpp.

Null-Kreuzung funktioniert nicht, da ein typischer Ton viel mehr Harmonische und Null-Crossings hat als die Basisfrequenz.

Etwas, mit dem ich experimentierte (als Heimseite), war Folgendes:

  1. Probieren Sie den Sound mit ADC mit jeder Probenrate, die Sie benötigen.
  2. Erkennen Sie die Spiegel der kurzfristigen positiven und negativen Peaks der Wellenform (Gleitfenster oder ähnliches). Dh ein Umschlagdetektor.
  3. Machen Sie eine Quadratwelle, die hoch ist, wenn die Wellenform innerhalb von 90% (oder so) von der positiven Hülle geht, und niedrig, wenn die Wellenform innerhalb von 90% der negativen Hülle geht. Dh eine Tracking -Quadratwelle mit Hysterese.
  4. Messen Sie die Frequenz dieser Quadratwelle mit geradlinigen Zähl-/Zeitberechnungen und verwenden Sie so viele Proben, wie Sie die erforderliche Genauigkeit benötigen.

Ich fand jedoch, dass mit Eingaben von meiner elektronischen Tastatur für einige Instrumentengeräusche 2 × die Basisfrequenz (nächste Oktave) aufgenommen wurden. Dies war ein Nebenprojekt und ich bin nie dazu gekommen, eine Lösung zu implementieren, bevor ich zu anderen Dingen überging. Aber ich dachte, es hätte viel weniger CPU -Ladung als FFT.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top