Question

J'ai un problème. En Java, je dois lire des échantillons à partir d'un fichier wav. Le format de fichier est: wav, PCM_SIGNED, signé int de 2 octets = 16bits, little endian ... L'objet lit les échantillons audio dans BYTES et je dois convertir ces deux octets en une valeur double. J'ai essayé d'utiliser cette formule, mais ce n'est pas tout à fait correct:

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

En comparant les résultats avec Matlab je constate toujours des différences entre la valeur réelle dans Matlab et celui converti en Java. Est-ce que quelqu'un peut m'aider s'il vous plaît? Merci, Dave

Était-ce utile?

La solution

Vous nous avez pas donné suffisamment d'informations pour savoir pourquoi vous obtenez des résultats différents dans Matlab et Java. Habituellement, vous redimensionnez les données de canal court [-32768..32767] à un double dans la gamme [-1..1] qui il semble que vous essayez de faire. Votre résultat java: -3.0517578125E-5 est correct pour la valeur à court -1: -1/32768. Je ne sais pas pourquoi le résultat Matlab est différent. Vous ne nous avez pas montré comment vous arrivez à vos résultats Matlab.

Si vous avez une grande séquence d'octets (que je suppose que vous faites), et vous ne voulez pas vous soucier de big-endian vs little-endian ou le déplacement bits et d'octets, laissez java prendre soin pour vous:

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 ( ) lit les deux octets du tampon, prend en charge la commande Little-Endian, convertit les octets à un court, et se positionne pour le prochain appel getXXX ().

Autres conseils

Ceci est la façon correcte:

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

(indices Changer à peu de swap / grand)

Cant vous faites juste octet most_significant * 256 + least_significant_byte puis jeté à doubler?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top