¿Hay algún programa que pueda determinar el tono más alto dentro de un archivo de audio?

14

¿Existe un programa de Windows que pueda determinar la "frecuencia de onda de sonido más alta" encontrada dentro de un archivo de audio (por ejemplo, un archivo mp3)?

Por ejemplo, debería poder analizar el archivo Dog-Whistle-0 y determinar que la frecuencia más alta encontrada dentro del archivo es aproximadamente ~ 12000 Hz.

Además, debería poder analizar Piano.mp3 y determinar la nota más alta.

Pacerier
fuente

Respuestas:

13

R es multiplataforma y de código libre / abierto.

Cárguelo y cargue las bibliotecas tuneRy seewave(instálelas desde el administrador de paquetes si aún no está instalado).

library(tuneR)
library(seewave)

Luego, cargue su archivo MP3 o WAV:

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

Ahora, grafiquemos el espectro y sus picos:

fpeaks(meanspec(w), nmax=1)

Resultado:

Resultado numérico:

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

Lo anterior solo funciona con datos no musicales. Cuando analice las frecuencias de la música, encontrará que las frecuencias más altas siempre estarán alrededor de 12-20 kHz, dependiendo del instrumento (s) involucrado. Sin embargo, esta frecuencia más alta no le dará una estimación de la nota que se está tocando, ya que una nota musical, cuando se toca con un instrumento, estará compuesta de múltiples frecuencias.

Este es el llamado "timbre" de un instrumento, y encontrará que una A a 440 Hz por una flauta incluirá diferentes componentes de frecuencia en comparación con una A tocada por una guitarra eléctrica.

Su mejor opción es ejecutar un análisis de frecuencia dominante al observar los picos de frecuencia en las ventanas de tiempo deslizante y verificar dónde ocurre el más alto.

Sin embargo, no existe la "frecuencia en el tiempo". Solo puede trazar la frecuencia promedio (o dominante) sobre ciertas ventanas de tiempo deslizante . Seewave ofrece bastantes funciones con respecto a la selección de ventanas de tiempo, pero se vuelve bastante complicado.

Podrías usar

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

para obtener las propiedades del espectro de 10 a 11 segundos y luego llamar s$centroido s$meanpara obtener el centroide o las frecuencias medias de esa ventana de tiempo particular (aunque 1 segundo es bastante grande para el análisis de audio).

Si su archivo Wave utiliza un muestreo de 44.1 kHz, puede reducir la muestra para reducir el esfuerzo de cálculo, por ejemplo, a 16 kHz.

w = downsample(w, 16000)

Pero recuerde que según el Teorema de Nyquist , la frecuencia máxima que se puede representar ahora es de 8 kHz.

También puede buscar un software de detección de tono. Como este , que requiere MATLAB sin embargo.

slhck
fuente
Por cierto en lugar de fpeaks, ¿eres consciente de si hay una función que traza el gráfico de frecuencia contra tiempo?
Pacerier
Mira mi actualización. No es tan trivial. Sin embargo, no he trabajado tanto con el audio para saber si hay algo mejor por aquí, lo siento.
slhck
8

¿Has probado Audacity ? Es una herramienta gratuita que tiene algunas herramientas de análisis bastante sofisticadas, incluyendo un trazado del espectro de comandos se accede desde Analizar -> trazado del espectro ... .

Captura de pantalla

Tenga en cuenta que obtiene resultados diferentes con la versión MP3 del archivo en comparación con la versión WAV porque la compresión MP3 ha alterado la forma de onda e introducido artefactos / alias.

Editar: los archivos de sonido a los que se vincula no son buenos ejemplos de esto. Los archivos de frecuencia más alta solo se muestrean a 44,1 kHz, que se adapta a la audición humana (alrededor de 20 kHz como máximo). No puede representar frecuencias de ultrasonido sin aumentar la frecuencia de muestreo.

James P
fuente
Hmm, no parece funcionar con el archivo Piano.mp3 . Para mí, muestra 10121 Hz (D # 9) Screenshoot.me/uZZ2N0 , sin embargo, esto es muy poco probable porque la tecla más grande en un piano es C8 (4186Hz). ¿Estoy haciendo algo mal?
Pacerier
3
@Pacerier No, pero cambiaste un poco tu pregunta. La muestra de silbato de perro es fácil de identificar porque la frecuencia con el pico más alto en el espectro también es la frecuencia más alta y al mismo tiempo la nota dominante. Para la música, la frecuencia más alta no es necesariamente la nota más alta, ya que una nota musical tocada por un instrumento está compuesta de múltiples frecuencias.
slhck
@slhck Ic, pensé que podríamos adivinar la nota si tuviéramos la frecuencia, parece que no es tan sencillo ...
Pacerier
@Pacerier: si configuras el Tamaño en un valor más alto, creo que puede dar resultados más precisos y eliminar algunos armónicos.
James P
2
@Pacerier No, realmente no es tan sencillo. La detección de tono requiere que primero transforme la forma de onda en un espectro de frecuencia (Transformada rápida de Fourier), luego aplique filtros (paso bajo en su mayoría) y otra ronda de filtros. A menos que encuentre una herramienta que rastree el tono con el tiempo, lo que está buscando será realmente difícil. Podrías buscar herramientas de corrección vocal como Melodyne .
slhck