2010-05-27 16 views
8

Estoy usando la clase AudioRecord para analizar los bytes pcm sin procesar tal como vienen en el micrófono.Android PCM Bytes

Así que eso está funcionando muy bien. Ahora necesito convertir los bytes pcm en decibelios.

Tengo una fórmula que toma la presión del sonido en Pa en db.

dB = 20 * log10 (Pa/ref Pa)

Así que la pregunta es los bytes que estoy recibiendo de Audiorecorder de la memoria intermedia lo que es lo es la amplitud de presión de sonido Pascal o qué.

Traté de poner el valor en te fórmula, pero se vuelve con muy altura db, así que no creo que su derecho

gracias

+0

1+ Upvote a todos por su gran información. Gracias a todos. – Terrance

+0

¡Necesito ayuda con esto cuando trato de hacer lo mismo! Tengo los bytes pcm sin procesar como tú, pero cuando uso tu fórmula, aparece con infinito:/Mientras estoy grabando estoy usando los últimos 2 valores de bytes en la matriz de bytes, ¿es esto incorrecto? – Neeta

Respuesta

11

Descargo de responsabilidad: Sé poco sobre Android.

Su dispositivo probablemente esté grabando en mono a 44,100 muestras por segundo (quizás menos) utilizando dos bytes por muestra. Así que su primer paso es combinar pares de bytes en sus datos originales en enteros de dos bytes (no sé cómo se hace esto en Android).

continuación, puede calcular el valor de decibelios (en relación con el pico) de cada muestra tomando primero el valor absoluto normalizado de la muestra y que pasa a su función Db:

float Db = 20 * log10(ABS(sampleVal)/32768) 

Un valor cerca del pico (por ejemplo, +32767 o -32768) tendrá un valor de Db cercano a 0. Un valor de 3277 (0.1) tendrá un valor de Db de -20; un valor de 327 (.01) tendrá un valor Db de -40, etc.

+0

Hola Todo parece funcionar con esta fórmula. Los valores son +32767 o -32768 rango. – Pintac

+0

Una pregunta para poner mi mente en res. ¿Qué unidad de medida es el sampleValue – Pintac

+4

Estrictamente hablando, el valor de muestra representa la salida instantánea de voltaje de un micrófono (donde +32767 representa la tensión positiva máxima y -32768 representa la tensión negativa mínima). Debido a cómo funcionan los micrófonos, este voltaje está relacionado con * cambios * en la presión sonora del promedio local: cuando un micrófono graba un sonido, la presión de aire alrededor del micrófono sube y baja ligeramente, lo que mueve una membrana hacia adelante y hacia atrás produciendo una alternando voltaje positivo luego negativo. Un ADC (convertidor analógico a digital) muestrea este voltaje 44100 veces por segundo ... – MusiGenesis

1

El problema es probable que la definición de la "referencia" de presión sonora en el micrófono. No tengo idea de lo que sería o si está disponible.

La única aplicación de audio que he usado, definió 0db como "volumen completo", cuando las muestras estaban en + o - valor máximo (en 16 bits sin signo, que serían 0 y 65535). Para conseguir esto en dB probablemente haría algo como esto:

// assume input_sample is in the range 0 to 65535 
sample = (input_sample * 10.0) - 327675.0 
db = log10(sample/327675.0) 

No sé si eso es correcto, pero se siente bien al me desafió matemáticamente. A medida que el input_sample se acerca al "medio", se verá cada vez más como un infinito negativo.

Ahora que lo pienso, si quieres un SPL o algo que pueda requerir trucos diferentes como hacer una evaluación RMS entre los cruces por cero, otra vez algo que solo pude adivinar porque no tengo idea de cómo es realmente trabajos.

+1

Cerrar, excepto que las muestras PCM están * firmadas * en 16 bits (por lo que no necesita la resta de compensación). Además, al menos en mi universo, no puedes tomar el registro de un número negativo. :) – MusiGenesis

+0

Ha hah buenos puntos todos. ¿Siempre están firmados? Pensé con certeza que una vez tuve que lidiar con datos de PCM que no estaban firmados (podrían estar perdiendo el recuerdo, por supuesto). –

+0

Debería haber dicho que PCM está * generalmente * firmado: PCM de 1 byte por muestra y formatos PCM RAW (como con lo que probablemente trabajaste) no están firmados, pero son bastante raros en la naturaleza (el audio del CD está firmado) – MusiGenesis

2

La presión de referencia en los cálculos de Leq (nivel de presión sonora) es de 20 micro-Pascal (rms). Para medir niveles de Leq absolutos, necesita calibrar su micrófono con un calibrador. La mayoría de los calibradores se ajustan a cápsulas de micrófono de 1/2 "o 1/4", por lo que tengo mis dudas sobre cómo calibrar el micrófono en un teléfono Android. De forma alternativa, puede usar la sensibilidad del micrófono (Pa/mV) y luego calibrar el nivel de voltaje que entra al ADC. Se podrían obtener resultados aún menos confiables comparando los valores de Android con el nivel de sonido medido de un campo de sonido estacionario difuso usando un medidor de nivel de sonido. Tenga en cuenta que en los cálculos de Leq normalmente usa los valores RMS. El valor de una muestra individual no significa mucho.

+0

Lo que realmente quiero hacer con el DB es averiguar el volumen (carga) del audio si va más allá de un cierto volumen (carga en dB). Quiero hacer algo. tengo una tabla de referencia de db's http://en.wikipedia.org/wiki/Sound_pressure#Examples_of_sound_pressure_and_sound_pressure_levels – Pintac

+1

De una manera u otra, tendrá que calibrar el sistema. Al menos, necesitaría comparar sus valores calculados con un nivel de sonido conocido. Los valores que figuran en la entrada de Wikipedia son, con toda probabilidad, los niveles de sonido ponderados A, donde el nivel de sonido en cada banda de octava se pondera para dar como resultado un valor general. El Leq generalmente se da para cada banda de octava. – Han

+0

el valor de muestra que recibo es de +32767 a -32768 ¿qué unidad es esta amplitud? Presión de sonido voltios wats ... – Pintac

2

Sostengo mi medidor de nivel de sonido justo al lado del micrófono en mi ion de google y digo '¡Woooooo!'y notó que el recorte ocurrió alrededor de 105 db spl. Espero que esto ayude.

1

Las unidades son las unidades que se utilizan para la lectura de referencia. En la fórmula, la lectura se divide por la lectura de referencia, por lo que las unidades se cancelan y ya no importan.

En otras palabras, los decibeles son una forma de comparar dos cosas, no es una medida absoluta. Cuando ve que se usa como si fuera absoluto, entonces la comparación es con el sonido más silencioso que el humano promedio puede escuchar.

En nuestro caso, es una comparación con la lectura más alta que maneja el dispositivo (por lo tanto, cualquier otra lectura es negativa o menor que la máxima).

Cuestiones relacionadas