Pregunta

Tengo un problema. En Java Necesito leer muestras de un archivo WAV. El formato del archivo es: wav, PCM_SIGNED, firmado int de 2 bytes = 16 bits, Little Endian ... El objeto lee las muestras de audio en bytes y necesito para convertir estos dos bytes en un valor doble. He intentado utilizar esta fórmula, pero no es del todo correcta:

mono = (double)((audioBytes[k] & 0xFF) | (audioBytes[k + 1] << 8));

La comparación de los resultados con Matlab siempre notan diferencias entre el valor real en Matlab y el convertida en Java. puede alguien ayudarme por favor? Gracias, David

¿Fue útil?

Solución

no nos han dado suficiente información para saber qué está obteniendo resultados diferentes en Matlab y Java. Por lo general, se cambia la escala de los datos de canal corto [-32768..32767] a un doble en el rango [-1..1], que parece que está tratando de hacer. El resultado de su java: -3.0517578125E-5 es correcta para el corto valor -1: -1 / 32768. No sé por qué su resultado Matlab es diferente. No nos ha mostrado cómo va a llegar a sus resultados de Matlab.

Si usted tiene una gran secuencia de bytes (que yo supongo que lo hacen), y no quiere preocuparse por bigEndian vs ascendente hacia la izquierda o el paso de los bits y bytes, y mucho java cuidar de él para que:

import java.nio.*;
...
ByteBuffer buf = ByteBuffer.wrap(audioBytes);
buf.order(ByteOrder.LITTLE_ENDIAN);

while (buf.remaining() >= 2) {
    short s = buf.getShort();
    double mono = (double) s;
    double mono_norm = mono / 32768.0;
    ...
}

ByteBuffer.getShort ( ) lee los siguientes dos bytes de la memoria intermedia, se encarga de la ordenación de Little-Endian, convierte los bytes a una corta, y se posiciona para el próximo getXXX () llamada.

Otros consejos

Esta es la forma correcta:

double sampleValue = (double)(( bytes[0]<<8 ) | ( bytes[1]&0x00FF ));

(Cambio índices a poco intercambio / grande)

El canto le acaba de hacer most_significant byte * 256 + least_significant_byte y luego arrojado al doble?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top