R est multi-plateforme et gratuit / open source.
Chargez-le et chargez les bibliothèques tuneR
et seewave
(installez-les à partir du gestionnaire de packages s'il n'est pas encore installé).
library(tuneR)
library(seewave)
Ensuite, chargez votre fichier MP3 ou WAV:
w = readMP3("dog-whistle-0.mp3")
w = readWave("dog-whistle-0.wav")
Maintenant, tracons le spectre et ses pics:
fpeaks(meanspec(w), nmax=1)
Résultat:
Résultat numérique:
fpeaks(meanspec(w), nmax=1, plot=FALSE)
12.05859
Ce qui précède ne fonctionne qu'avec des données non musicales. Lorsque vous analysez les fréquences de la musique, vous constaterez que les fréquences les plus élevées seront toujours autour de 12-20 kHz, selon le ou les instruments impliqués. Cependant, cette fréquence la plus élevée ne vous donnera pas d'estimation de la note jouée, car une note de musique, lorsqu'elle est jouée par un instrument, sera composée de plusieurs fréquences.
C'est le soi-disant "timbre" d'un instrument, et vous constaterez qu'un A à 440 Hz par une flûte comprendra différentes composantes de fréquence par rapport à un A joué par une guitare électrique.
Votre meilleur pari est d'exécuter une analyse de fréquence dominante en examinant les pics de fréquence sur des fenêtres temporelles glissantes et de vérifier où se produit le plus élevé.
Mais la "fréquence dans le temps" n'existe pas. Vous ne pouvez tracer que la fréquence moyenne (ou dominante) sur certaines fenêtres temporelles coulissantes . Seewave offre de nombreuses fonctions concernant la sélection des fenêtres de temps, mais cela devient plutôt compliqué.
Vous pourriez utiliser
s = specprop(meanspec(w, from=10, to=11))
pour obtenir les propriétés du spectre de 10 à 11 secondes, puis appelez s$centroid
ou s$mean
pour obtenir le centroïde ou les fréquences moyennes de cette fenêtre temporelle particulière (bien qu'une seconde soit assez grande pour l'analyse audio).
Si votre fichier Wave utilise un échantillonnage à 44,1 kHz, vous pouvez le sous-échantillonner pour réduire l'effort de calcul, par exemple à 16 kHz.
w = downsample(w, 16000)
Mais rappelez-vous que selon le théorème de Nyquist , la fréquence maximale qui peut être représentée maintenant est de 8 kHz.
Vous pouvez également rechercher un logiciel de détection de hauteur. Comme celui-ci , qui nécessite MATLAB cependant.
fpeaks
, savez-vous s'il existe une fonction qui trace le graphique de la fréquence en fonction du temps?