Obtener volumen de una pista con RMS

15

Estoy tratando de calcular el volumen de una pista de audio que he almacenado en un búfer. El búfer contiene datos PCM de la señal y quiero saber qué tan 'alto' es usando Root Mean Squared. Supongo que puedo hacer esto en el dominio del tiempo en lugar de tener que cambiar al dominio de frecuencia. ¿Cuál sería el pseudocódigo para hacer esto?

¿Simplemente muestrearía durante un segundo (audio [0] - audio [44099], audio [44099] - audio [88199] etc.) y calcularía el RMS de esos valores? Entonces, por ejemplo, haría esto:

RMETROS=audio[0 0]2+audio[1]2+audio[2]2.....audio[44099]244100

por cada segundo?

XSL
fuente
1
Hay un soporte que falta en la expresión anterior - Yo añadiría yo mismo, pero las modificaciones tienen que tener al menos 6 caracteres aparentemente ...
Paul R
3
@PaulR: puede agregar una <!-- html comment -->para evitar la restricción de caracteres en el raro caso de que una publicación perfecta tenga un error pequeño pero muy importante. Esta necesidad ocurre muy raramente: generalmente hay más de 6 caracteres de mejora por hacer. Por ejemplo, cuando faltan paréntesis, generalmente es mejor usar las construcciones \sqrt{}y \frac{}{}en TeX.
Kevin Vermeer
1
@ Kevin: gracias por el consejo: utilizaré su sugerencia de comentario HTML en el futuro.
Paul R
@PaulR: esto se ha discutido antes: la restricción es intencional, diseñada para evitar ediciones incompletas o sin sentido (vea una defensa aquí ), pero tiene sus oponentes (vea la discusión aquí ).
Kevin Vermeer
44
Tenga en cuenta que RMS solo no le dice volumen. Las frecuencias extremadamente bajas o altas suenan con un volumen inferior a 3 kHz del mismo valor RMS. Un filtro de ponderación A le dará una estimación más precisa. gist.github.com/148112
endolith

Respuestas:

12

Otra cosa es que el valor RMS no está muy bien correlacionado con el volumen percibido. Es posible que desee considerar llamarlo nivel o volumen en su lugar. Hay algo llamado contornos de igual volumen que cuantifica cuán sensible es el oído a una frecuencia particular en comparación con otra frecuencia, vea el artículo de Wikipedia . Estas curvas dependen del nivel. Por ejemplo, el oído es muy sensible a un tono de 1 kHz en comparación con un tono de 100 Hz, como se muestra en esta imagen (el eje horizontal es la frecuencia en Hz):

contornos de igual volumen

Una de las cosas relativamente simples que puede hacer es filtrar los datos de su PCM con una curva de igual volumen invertida. O puede aplicar la ponderación A estándar, consulte el artículo Filtro de ponderación de Wikipedia . Luego puede calcular el valor RMS de la salida del filtro ponderado de igual intensidad.

niaren
fuente
No tengo claro cómo pasar del código del interrogador a esto. El ejemplo de la pregunta es sumar los cuadrados de las muestras de audio. La respuesta está hablando de aplicar el filtro a las frecuencias, por lo que parece que "filtrar los datos de su PCM con una curva de igual volumen invertido" no es suficiente. Primero tiene que tener el valor para cada frecuencia, luego puede imaginar cómo aplicar la curva ¿verdad? Pero ese es un gran paso dejado de lado.
gman
@gman La idea es preprocesar el audio con un filtro y luego usar el resultado como en la pregunta (cálculo RMS). No estoy 100% seguro de lo que quieres decir. ¿No está seguro de cómo hacer el filtrado o quizás el diseño del filtro?
niaren