nivel de sonido rms

He encontrado un código para calcular el nivel de sonido del micrófono (RMS):

public int calculateRMSLevel(byte[] audioData) {
    // audioData might be buffered data read from a data line
    long lSum = 0;
    for (int i = 0; i < audioData.length; i++) {
        lSum = lSum + audioData[i];
    }

    double dAvg = lSum / audioData.length;

    double sumMeanSquare = 0d;
    for (int j = 0; j < audioData.length; j++) {
        sumMeanSquare = sumMeanSquare + Math.pow(audioData[j] - dAvg, 2d);
    }

    double averageMeanSquare = sumMeanSquare / audioData.length;
    return (int) (Math.pow(averageMeanSquare, 0.5d) + 0.5);
}

Pero solo funciona para el siguiente formato de audio:

private AudioFormat getAudioFormat() {
    float sampleRate = 8000.0F;

    int sampleSizeInBits = 8;

    int channels = 1;

    boolean signed = true;

    boolean bigEndian = true;

    return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,
            bigEndian);
}

¿Cómo extender el código para que pueda funcionar con diferente bitness? Si cambio el bitness a 16, devuelve valores de alrededor de 50 cuando se silencia donde 8 bits devuelve 1 o 2. Además, me gustaría graficar los niveles de sonido en un gráfico, ¿cómo se relacionan los valores de nivel de sonido con el tiempo?

Respuesta 1

La frecuencia de muestreo no importa, pero la profundidad de bits, la resistencia y, de manera diferente, el número de canales, sí importan.

Para ver por qué, simplemente debe notar que la función en cuestión toma una matriz de bytes como argumento y procesa cada valor de esa matriz individualmente. El tipo de datos de byte es un valor de 8 bits. Si desea algo que funcione con valores de 16 bits, debe usar un tipo de datos diferente (corto) o convertirlo desde bytes.

Una vez que haga eso, obtendrá valores diferentes para 16 bits frente a 8 bits porque el rango es diferente: 8 bits va de -128 a +127 y 16 bits va de -32768 a +32767, pero ambos miden lo mismo cosa, lo que significa que escalan los mismos valores de palabras reales a diferentes valores representados.

En cuanto a los niveles de sonido y su relación con el tiempo ... bueno, depende de su frecuencia de muestreo y del tamaño de los arreglos que entran en esta función. Por ejemplo, si su frecuencia de muestreo es de 8 kHz y tiene 2048 muestras por búfer, su función se llamará 8000/2048 o aproximadamente 3,9 veces por segundo, lo que significa que sus resultados llegarán a esa velocidad (cada 256 milisegundos).

Respuesta: 2

Estoy usando las API de Nashorn para ejecutar Javascripts usando código Java. Nashorn está en desuso terminalmente en JDK 11. Actualmente estoy en JDK 8 donde algunas de las API están en desuso. ¿Es posible rastrear ...

¿Cómo puedo obtener los detalles de un proceso en Linux? Quiero el tiempo total de ejecución, el mapa de memoria de un proceso. En este contexto, el proceso será un simple programa Java. Solo sé el nombre del archivo, no el ...

Estoy tratando de crear una migración simple de la base de datos en Intellij con algunas tablas ficticias usando flyway. Mis tablas ficticias se colocan en "recursos / db / migración" y tienen el formato de "...

Estoy en una aplicación JSF, tengo un archivo .bat que quiero iniciar al hacer clic en un botón de Comando, este script está en el directorio de contenido web de mi proyecto. El código de la acción es: Cadena pública ...