Java, Matlab читает данные в Wav-файле, чем он отличается?

1

В Matlab это кажется очень легким, но как только я попытаюсь с помощью java прочитать Wav файл, я получаю неправильные данные по сравнению с Matalb

Я знаю, что из 44-байтового адреса в файле Wav это фактические данные

С Matlab я просто набираю это

[nData] = wavread("DoorBell.wav",'native')

И я говорю "133 000" Образцы Это часть от номера образца 3000 ~ 3015:

6743 5754 4200 2396 654 -1253 -3141 -4393 -5063 -5062 -4139 -2891 -1588 -193 482 

Поскольку есть 2 канала, второй канал появляется также в matlab с теми же значениями

Но я пытаюсь использовать Java-код для чтения данных. Он отличается тем, что я знаю, что WAV сохраняет данные в маленькие байты конца

В этом фрагменте я определяю, сколько байтов я должен прочитать, а затем прочитал в массиве byte [] и использовал shortBuffer и byteBuffer, чтобы сделать его похожим на образцы int16

dataBuffer = new byte[getDataBytes(subChunk2Size)];

        //get the actual data
        randAccess.seek(44);
        randAccess.read(dataBuffer);
        System.out.println(dataBuffer.length);

private static short[] bytesToShort(byte[] bytes) 
{
     short[] tempArr = new short[bytes.length/2];
     ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).asShortBuffer().get(tempArr);
     return tempArr;
}
short[] samples = bytesToShort(dataBuffer);

for (int i = 0; i < samples.length; i++) {
            out.println(samples[i]);
        }

Здесь образцы от 3000 до 3015, "Обратите внимание, что я не беру первые образцы в качестве примера, потому что он равен нулю

22298 31254 26640 23561 -29182 7163 -17421 -10258 14828 15084 -10769 -18956 -13063 16383 -7679

я трачу много часов, чтобы выяснить, что это? Не знаю !

  • 0
    Если вы знаете, что WAV сохраняет данные в формате с BIG_ENDIAN байтов, почему вы используете BIG_ENDIAN в своем коде?
  • 0
    6743 в гексе - это 0x1a57. 22298 в шестнадцатеричном виде - это 0x571a. хммм ...
Показать ещё 2 комментария
Теги:
audio
endianness

1 ответ

0

Формат WAV обычно составляет 16 бит на выборку - эти данные указаны в значениях заголовков, которые вы, очевидно, не разбираете! поэтому один 16-разрядный образец хранится в файлах в виде двух байтов - следовательно, необходимо правильно определить свою точность. Я бы начал с определения одной константы, скажем, в плавающей точке 0.6, затем преобразует ее в ваше 16-битное целое число с использованием обоих языков. Подтвердите, что он работает, снова вернувшись в поплавок, чтобы убедиться, что вы получаете свой первоначальный 0,6 плавающий. После того, как я освоил, эта сторона упражнений очень полезна.

  • 0
    Я сделал, я знаю, что мой конкретный файл Bits per Sample является int16, и я начал читать фактические данные с адреса 44 байта, с которого начинаются данные

Ещё вопросы

Сообщество Overcoder
Наверх
Меню