как преобразовать 3 байта в порядке с прямым порядком байтов в плавающее число от -1 до +1 - PullRequest
0 голосов
/ 22 мая 2019

У меня есть 3 байта в порядке байтов.это: Верх, Средний и Нижний (от бита 23 до бита 0) Как я могу преобразовать их в число с плавающей запятой от -1 до +1?

3 байта в младшем порядке, потому что есть строкаRIFF В формате wav, так что минимальное значение равно (0x7FFFFF), а максимальное значение равно (0x800000)

http://www.labbookpages.co.uk/audio/javaWavFiles.html

для 16-битного wav: волновые кадры находятся в двоичном дополнительном двоичном коде между -32768;0x8000 и 32767;0x7FFF)

1 Ответ

1 голос
/ 22 мая 2019

Ссылка, которую вы предоставляете, выглядит для меня неправильно. Конечно, 24-битный формат использует стандартную арифметику с двумя дополнениями . В этом случае 0x7FFFFF представляет -8388608 и 0x800000 представляет 8388607.

На этой основе вы используете эту функцию для преобразования трех байтов в целочисленное значение со знаком:

function TwosComplement24(const Bytes): Integer;
begin
  Result := 0;
  Move(Bytes, Result, 3);
  Result := (Result and $7fffff) - (Result and $800000);
end;

Если у вас есть это, вы можете преобразовать его в значение с плавающей запятой, например:

function Sample24toReal(const Bytes): Double;
begin
  Result := TwosComplement24(Bytes) / 8388608;
end;

Я использовал нетипизированный параметр для 3 байтов, но вы можете сделать это по-разному в зависимости от того, как вы читаете данные.

Кроме того, этот код написан при условии, что он работает на машине с прямым порядком байтов. Если для данных используется прямой порядок байтов, а для машины - прямой порядок байтов, то вам нужно будет перевернуть каждую группу из трех байтов.

...