Работа с 24-битными аудиосэмплами

Каков «стандартный способ» работы с 24-битным звуком? Что ж, на самом деле нет доступных 24-битных типов данных. Вот методы, которые приходят мне в голову:

  1. Представляйте 24-битные аудиосэмплы как 32-битные целые числа и игнорируйте старшие восемь бит.
  2. То же, что (1), но игнорирует младшие восемь бит.
  3. Представляйте 24-битные аудиосэмплы как 32-битные числа с плавающей запятой.
  4. Представьте образцы как структуры из 3 байтов (приемлемо для C / C ++, но плохо для Java).

Как с этим справиться?


person ezpresso    schedule 05.07.2013    source источник


Ответы (1)


Храните их как 32- или 64-битные signed int, float или double, если вы не занимаетесь пространством и не заботитесь о том, чтобы упаковать их в как можно меньшее пространство.

Аудиосэмплы часто передаются и передаются как 24-битные, поскольку это обычно разрешение ЦАП и АЦП - хотя на большинстве компьютерных устройств не удивляйтесь, обнаружив, что нижние 3 из 4 битов случайным образом отскакивают от шума.

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

Например, сумма двух 24-битных целых чисел дает результат 25 бит. После 8 таких добавлений 32-битный тип будет переполняться, и вам нужно будет повторно нормализовать, округляя и сдвигая вправо.

Поэтому, если вы используете целочисленные типы для хранения ваших выборок, используйте самые большие из возможных и начните с выборок в младших 24 битах.

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

Обычно выборки с плавающей запятой хранятся в диапазоне -1.0f < x < 1.0f.

person marko    schedule 05.07.2013
comment
Спасибо за очень вдумчивый ответ по поводу моей проблемы! На моем месте, какое представление аудиофайла вы бы предпочли использовать для обработки звука в Java, включая БПФ и эквализацию? 32-битные целые числа со знаком или 32-битные числа с плавающей запятой? - person ezpresso; 05.07.2013
comment
Я не думаю, что в данном случае у вас есть другой выбор, кроме float. БПФ в целочисленной арифметике - очень и очень тяжелая работа. - person marko; 05.07.2013
comment
Большое спасибо! Надо писать код! - person ezpresso; 05.07.2013
comment
Предлагаемое редактирование: перенормировать вместо денормализации. denormal - это совсем другое. - person Bjorn Roche; 05.07.2013
comment
Поэтому, если вы используете целочисленные типы для хранения ваших выборок, используйте самые большие из возможных и начните с выборок в младших 24 битах. Это не обязательно так. Возможно, вы захотите сохранить точность, а не запас по высоте. Зависит от ваших операций. - person Bjorn Roche; 05.07.2013
comment
@BjornRoche Под этим я подразумеваю начало с выровненных сэмплов MSB - OP спрашивал, куда именно поместить 24-битные сэмплы в 32-битном слове. Очевидно, что для операций, которые приводят к более широким результатам, может оказаться целесообразным переместить двоичную точку, если позволяет ширина слова. - person marko; 06.07.2013