Что означают необработанные данные в файле .wav? - PullRequest
0 голосов
/ 08 марта 2020

Итак, я пытаюсь извлечь амплитуды различных выборок из файла .wav, чтобы иметь возможность восстановить форму волны по времени. Исследуя формат файла .wav, я нашел очень полезную информацию. Однако, я был смущен, когда дело дошло до части необработанных данных. В статье, которую я нашел, говорилось: «В случае 16-битной PCM 16-битные выборки сохраняются как целые числа без знака, дополняющие 2-х, в диапазоне от 0 до 65535». Я запутался, потому что не знаю, как файл различает положительные и отрицательные амплитуды, если он не подписан. Например, если одна амплитуда 5 представлена ​​в двоичном виде 00000000 00000101, то с использованием дополнения 2 -5 следует представить как 11111111 11111011, который равен 65531 в десятичном виде как целое число. Это заставляет меня думать, что амплитуда -5 воспринимается НАМНОГО больше, чем амплитуда +5. Очевидно, это не так, как это работает, так что я делаю не так? Кроме того, когда я сохраняю свой WAV-файл в двоичном массиве и выводю значения, я получаю отрицательные числа! Откуда взялись эти отрицательные числа, если в статье сказано, что должны храниться только значения от 0 до 65535. Просто очень смущен, действительно нужно прояснить ситуацию. Ссылка на статью, на которую я ссылался, прилагается ниже. Цитата того, что сказал автор, находится в самом низу страницы . Спасибо.

http://www.ievs.ch/projects/var/upload/Documentation%20Microsoft%20Wave%20File%20Format.pdf

1 Ответ

0 голосов
/ 10 марта 2020

Я рекомендую переносить данные .wav в Java с помощью AudioSystem методов, а не пытаться работать с необработанными байтами. После ввода, используя соответствующий AudioFormat, больше нет необходимости иметь дело с заголовком или какой-либо информацией об организации пакета для данных.

Когда я таким способом ввел данные, декодированный PCM сохраняется как подписанные шорты. Таким образом, он варьируется от -32768 до 32767. При 16-битном кодировании значения получаются из двух байтов, собранных в порядке, указанном флагом bigEndian.

https://docs.oracle.com/javase/9/docs/api/javax/sound/sampled/AudioFormat.html

Вторая проблема заключается в том, что отдельные значения PCM, вероятно, не следует рассматривать как полезное указание объема. Вместо этого объем обычно определяют, выполняя RMS (root -средн-квадрат) анализ сигнала.

Среднеквадратичное значение за все время функции periodi c равно среднеквадратическому значению одного периода функции. Среднеквадратическое значение непрерывной функции или сигнала можно аппроксимировать, взяв среднеквадратичное значение выборки, состоящей из одинаково расположенных наблюдений.

...