Gibt es ein Programm, das die höchste Tonhöhe in einer Audiodatei bestimmen kann?

14

Gibt es ein Windows-Programm, das die "höchste Schallwellenfrequenz" in einer Audiodatei (z. B. MP3-Datei) ermitteln kann?

Beispielsweise sollte es in der Lage sein, die Datei Dog-Whistle-0 zu analysieren und festzustellen, dass die höchste in der Datei gefundene Frequenz ungefähr ~ 12000 Hz beträgt.

Außerdem sollte es in der Lage sein, Piano.mp3 zu analysieren und die höchste Note zu bestimmen.

Pacerier
quelle

Antworten:

13

R ist plattformübergreifend und frei / Open Source.

Laden Sie es, und laden Sie die tuneRund seewave-Bibliotheken (installieren Sie sie vom Paketmanager, falls noch nicht installiert).

library(tuneR)
library(seewave)

Laden Sie dann Ihre MP3- oder WAV-Datei:

w = readMP3("dog-whistle-0.mp3")
w = readWave("dog-whistle-0.wav")

Nun zeichnen wir das Spektrum und seine Peaks auf:

fpeaks(meanspec(w), nmax=1)

Ergebnis:

Zahlenergebnis:

fpeaks(meanspec(w), nmax=1, plot=FALSE)
12.05859

Das Obige funktioniert nur mit nicht-musikalischen Daten. Wenn Sie Musikfrequenzen analysieren, werden Sie feststellen, dass die höchsten Frequenzen je nach Instrument (en) immer zwischen 12 und 20 kHz liegen. Diese höchste Frequenz gibt Ihnen jedoch keine Schätzung der gespielten Note, da eine Musiknote, wenn sie von einem Instrument gespielt wird, aus mehreren Frequenzen besteht.

Dies ist das sogenannte "Timbre" eines Instruments, und Sie werden feststellen, dass ein A bei 440 Hz durch eine Flöte andere Frequenzkomponenten enthält als ein A, das von einer E-Gitarre gespielt wird.

Am besten führen Sie eine Dominant-Frequency-Analyse durch, indem Sie die Frequenzspitzen über gleitende Zeitfenster betrachten und prüfen, wo die höchste auftritt.

Es gibt jedoch keine "Frequenz über die Zeit". Sie können nur plotten den Mittelwert (oder dominant) Frequenz über bestimmte gleitenden Zeitfenster . Seewave bietet einige Funktionen zur Auswahl von Zeitfenstern, die jedoch recht kompliziert werden.

Du könntest benutzen

s = specprop(meanspec(w, from=10, to=11)) 

um die Spektrumseigenschaften von 10 bis 11 Sekunden zu erhalten und dann aufzurufen s$centroidoder s$meanum den Schwerpunkt oder die mittleren Frequenzen dieses bestimmten Zeitfensters zu erhalten (obwohl 1 Sekunde für die Audioanalyse ziemlich groß ist).

Wenn Ihre Wave-Datei eine Abtastrate von 44,1 kHz verwendet, können Sie die Abtastrate verringern, um den Rechenaufwand zu verringern, z. B. auf 16 kHz.

w = downsample(w, 16000)

Denken Sie jedoch daran, dass nach dem Nyquist-Theorem die maximale Frequenz, die jetzt dargestellt werden kann, 8 kHz beträgt.

Sie könnten auch nach einer Tonhöhenerkennungssoftware suchen. Wie dieser , der allerdings MATLAB benötigt.

slhck
quelle
Übrigens fpeaks, wissen Sie, ob es eine Funktion gibt, die die Frequenz in Abhängigkeit von der Zeit grafisch darstellt?
Pacerier
Siehe mein Update. Es ist nicht so trivial. Ich habe nicht viel mit Audio gearbeitet, um zu wissen, ob es etwas Besseres gibt, sorry.
Slhck
8

Haben Sie Audacity ausprobiert ? Es ist ein Freeware-Tool, das einige ziemlich ausgefeilte Analyse-Tools enthält, einschließlich eines Plot Spectrum- Befehls, auf den über Analysieren -> Plot Spectrum ... zugegriffen werden kann .

Bildschirmfoto

Beachten Sie, dass Sie mit der MP3-Version der Datei andere Ergebnisse erzielen als mit der WAV-Version, da die MP3-Komprimierung die Wellenform geändert und Artefakte / Aliasing eingeführt hat.

Bearbeiten: Diese Audiodateien, mit denen Sie verknüpfen, sind keine guten Beispiele dafür. Die Dateien mit höheren Frequenzen werden nur mit 44,1 kHz abgetastet, was auf das menschliche Gehör zugeschnitten ist (maximal ca. 20 kHz). Sie können Ultraschallfrequenzen nicht darstellen, ohne die Abtastrate zu erhöhen.

James P
quelle
Hmm, es scheint nicht mit der Datei Piano.mp3 zu funktionieren . Für mich zeigt es 10121 Hz (D # 9) screenshoot.me/uZZ2N0 , aber dies ist höchst unwahrscheinlich, da die größte Taste auf einem Klavier C8 (4186 Hz) ist. Mache ich etwas falsch?
Pacerier
3
@Pacerier Nein, aber Sie haben Ihre Frage ein wenig geändert. Das Hundepfeifenmuster ist leicht zu identifizieren, da die Frequenz mit dem höchsten Peak im Spektrum auch die höchste Frequenz und gleichzeitig die dominierende Note ist. Bei Musik ist die höchste Frequenz nicht unbedingt die höchste Note, da eine von einem Instrument gespielte Note aus mehreren Frequenzen besteht.
Slhck
@slhck Ic, ich dachte, wir könnten die Note erraten , wenn wir die Frequenz hätten, sieht so aus, als ob es nicht so einfach ist ..
Pacerier
@ Pacerier: Wenn Sie die Größe auf einen höheren Wert einstellen , kann dies meiner Meinung nach zu genaueren Ergebnissen führen und einige Harmonische eliminieren.
James P
2
@ Pacerier Nein, es ist wirklich nicht so einfach. Bei der Tonhöhenerkennung müssen Sie die Wellenform zuerst in ein Frequenzspektrum transformieren (schnelle Fouriertransformation), dann Filter anwenden (meistens Tiefpass) und noch eine weitere Filterrunde. Solange Sie kein Tool finden, das die Tonhöhe im Laufe der Zeit verfolgt, wird es wirklich schwierig, das zu finden, was Sie suchen. Sie könnten in Stimmkorrektur-Tools wie Melodyne suchen .
Slhck