Existe-t-il un programme qui peut déterminer la hauteur la plus élevée dans un fichier audio?

14

Existe-t-il un programme Windows qui peut déterminer la "fréquence d'ondes sonores la plus élevée" trouvée dans un fichier audio (par exemple un fichier mp3)?

Par exemple, il devrait être en mesure d'analyser le fichier Dog-Whistle-0 et de déterminer que la fréquence la plus élevée trouvée dans le fichier est d'environ 12 000 Hz.

De plus, il devrait être capable d'analyser Piano.mp3 et de déterminer la note la plus élevée.

Pacerier
la source

Réponses:

13

R est multi-plateforme et gratuit / open source.

Chargez-le et chargez les bibliothèques tuneRet 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$centroidou s$meanpour 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.

slhck
la source
Btw au lieu de fpeaks, savez-vous s'il existe une fonction qui trace le graphique de la fréquence en fonction du temps?
Pacerier
Voir ma mise à jour. Ce n'est pas si insignifiant. Je n'ai pas beaucoup travaillé avec l'audio pour savoir s'il y a quelque chose de mieux, désolé.
slhck
8

Avez-vous essayé Audacity ? Il est un outil gratuit qui a des outils d'analyse assez sophistiqués, y compris un terrain de spectre commande accessible à partir Analyse -> Complot Spectrum ... .

Capture d'écran

Notez que vous obtenez des résultats différents avec la version MP3 du fichier par rapport à la version WAV car la compression MP3 a modifié la forme d'onde et introduit des artefacts / alias.

Edit: Ces fichiers audio que vous liez ne sont pas de bons exemples pour cela. Les fichiers à fréquence plus élevée ne sont échantillonnés qu'à 44,1 kHz, ce qui est adapté à l'audition humaine (environ 20 kHz maximum). Vous ne pouvez pas représenter les fréquences ultrasonores sans augmenter la fréquence d'échantillonnage.

James P
la source
Hmm, il ne semble pas fonctionner avec le fichier Piano.mp3 . Pour moi, cela montre 10121 Hz (D # 9) screenshoot.me/uZZ2N0 , mais cela est hautement improbable car la plus grande touche d'un piano est C8 (4186Hz). Suis-je en train de faire quelque chose de mal?
Pacerier
3
@Pacerier Non, mais vous avez un peu changé votre question. L'échantillon de sifflet de chien est facile à identifier car la fréquence avec le pic le plus élevé du spectre est également la fréquence la plus élevée et en même temps la note dominante. Pour la musique, la fréquence la plus élevée n'est pas nécessairement la note la plus élevée, car une note musicale jouée par un instrument est composée de plusieurs fréquences.
slhck
@slhck Ic, j'avais pensé que nous pourrions deviner la note si nous avions la fréquence, on dirait que ce n'est pas si simple ..
Pacerier
@Pacerier: Si vous définissez Size sur une valeur plus élevée, je pense que cela peut donner des résultats plus précis et éliminer certaines harmoniques.
James P
2
@Pacerier Non, ce n'est vraiment pas aussi simple. La détection de la hauteur vous oblige à transformer d'abord la forme d'onde en un spectre de fréquences (Fast Fourier Transform), puis à appliquer des filtres (passe-bas principalement), et encore une autre série de filtres. À moins que vous ne trouviez un outil pour suivre la hauteur dans le temps, ce que vous cherchez sera vraiment difficile. Vous pouvez examiner des outils de correction vocale comme Melodyne .
slhck