Когда следует учитывать двойную (64-битную) плавающую точку для аудио


12

При синтезе и обработке звука на современных процессорах, когда можно было бы использовать что-то кроме 32-битной плавающей запятой одинарной точности? Очевидно, что звук, поступающий и выходящий из реального мира, имеет 16/24 бит, поэтому я просто говорю о точности сигналов (как самого звука, так и таких, как коэффициенты фильтра) в программном обеспечении.

Предположить, что:

  • CPU / DSP имеет аппаратную поддержку с плавающей запятой для одинарной и двойной точности
  • Приоритетом является качество звука, а не высокая производительность. Например, двойная точность будет рассматриваться, если она предлагает лучшее (воспринимаемое) качество.

Ответы:


9

Синглы с плавающей точкой IEEE предоставляют только около 24 бит мантиссы. Но многие алгоритмы DSP / фильтрации (биквады IIR с полюсами / нулями около единичного круга и т. Д.) Требуют гораздо больше, чем 24 бита мантиссы для промежуточных вычислительных продуктов (аккумуляторов и т. Д.), Просто чтобы получить окончательные результаты с точностью около 16 или 24 бита Для этих типов алгоритмов 32-, 40- и 48-битные масштабированные целочисленные аккумуляторы часто использовались с DSP, которые не имели FPU.

Но во многих современных реализациях процессоров (для ПК, смартфонов и т. Д.) FPU двойной точности намного быстрее, чем попытка использовать 32- или 64-разрядное целочисленное целое число, когда вашему алгоритму нужно иметь более 24 бит промежуточного продукта.

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


Это та информация, которую я получил после. Я приму этот ответ, если вы любезно предоставите конкретный пример случая, когда для работы фильтра требуется двойная точность , т. Е. Он будет звучать плохо (или, по крайней мере, довольно обычно) с одинарной точностью, но гладко, как масло с двойной точностью.
user1849104

Кроме того, что именно вы подразумеваете под уничтожением кеша? Ты имеешь в виду, что, имея вдвое больше данных, они будут ужасно медленными?
user1849104

В качестве примера был приведен БИХ с полюсами / нулями около единичного круга. Если есть кеш, алгоритмы и рабочие наборы данных, которые помещаются в этот кеш, могут быть значительно быстрее, чем те, которые этого не делают.
hotpaw2

9

CPU / DSP имеет аппаратную поддержку с плавающей запятой для одинарной и двойной точности.

Это действительно зависит от того, о какой поддержке вы говорите. На x86 при использовании инструкций с плавающей запятой в стиле x87 вы получаете полную 80-битную внутреннюю точность и одинаковое время обработки - работаете ли вы с одинарной или двойной точностью.

Но при использовании инструкций SIMD вы можете получить вдвое больше работы с помощью 32-разрядных операций с плавающей запятой, чем с 64-разрядными операциями с плавающей запятой. Это большое дело.

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

При синтезировании и обработке звука на современных процессорах,

Это будет зависеть от того, какой синтез и обработку вы делаете. Если в нем используются БИХ-фильтры (или, в более общем случае, что-либо с переменными состояния и / или обратной связью), вы можете легче выстрелить себе в ногу (нестабильности или неточности с низким отсечением из-за усечения коэффициента) с 32-битным, если вы этого не сделаете слишком много думай о том, что ты делаешь. Некоторые топологии фильтров работают безупречно с 32-разрядными.

В любом случае, это вопрос точности чисел - с точки зрения качества не будет никакой разницы в восприятии. Имейте в виду, что довольно нелепо ожидать, что аппаратная звуковая цепь будет иметь более 20 бит точности (при условии, что плата безупречно разложена и все части идеальны, мы все еще сталкиваемся с пределом шума Джонсона!) - и эта точность в значительной степени покрывается поплавками одинарной точности. Путь сигнала на высококлассном микшерном пульте имеет 50 операционных усилителей, которые по отдельности имеют на несколько порядков больше искажений, чем шум квантования арифметических операций на поплавках одинарной точности.


Можно ли с уверенностью сказать, что использование одинарной точности с инструкциями SIMD всегда даст вам примерно вдвое большую производительность по сравнению с двойной точностью?
user1849104

Поскольку я больше не могу редактировать предыдущий комментарий: у меня никогда не было возможности (напрямую) использовать любые наборы инструкций SIMD. Можно ли просто использовать одинарную точность и получить вдвое большую производительность? Или реальность мешает?
user1849104

6

Вам нужно знать числовые требования вашего алгоритма и соответственно выбирать точность.

Итак, давайте сделаем математику здесь: 32-битная с плавающей запятой имеет 24-битную мантиссу и 8-битную экспоненту. Это дает приблизительно 150 дБ отношение сигнал / шум в динамическом диапазоне около 1540 дБ. Это достаточно для большинства вещей аудио. Двойная точность дает вам примерно вдвое больше.

Каждый алгоритм имеет определенные требования к числовой точности. Если правильно спроектировать все аудио алгоритмы, о которых я знаю, то все нормально с 32-битной плавающей точкой. «правильно разработанный» является ключевым словом здесь. Например, полоса пропускания 6-го порядка с частотой 40–200 Гц, отобранная на частоте 44,1 кГц, реализованная в виде прямого двухканального фильтра II IIR, действительно будет иметь некоторые проблемы с шумом на 32-битном уровне. Однако он отлично работает в качестве транспонированной формы II или фильтра прямой формы I.

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

Наконец, давайте посмотрим на то, что делает плавающее (32-битное или 64-битное) уязвимым: у вас огромный динамический диапазон, то есть вы можете уменьшить сигнал на 200 дБ, усилить на 500 дБ, снова уменьшить на 300 дБ, и вы окажетесь именно там, где вы начали практически без потери точности. Так что это не так. С плавающей точкой возникают проблемы с добавлением чисел, которые сильно различаются по размеру. Есть точка, в которой добавление небольшого числа просто не имеет значения, то есть вы получаете 1 + dx = 1. Это число "dx" составляет примерно 1,2e-7 для 32-разрядных чисел с плавающей запятой и 2,2e-16 для 64-разрядных. Если ваш алгоритм включает в себя сложение или вычитание чисел, которые настолько далеко друг от друга по величине, вы можете столкнуться с проблемами.

Хорошим примером этого является фильтр Direct Form II, упомянутый ранее: фильтр Direct From II (см., Например, https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html ) в основном вычисляет переменные состояния путем фильтрации входных данных. сначала передаточная функция только для полюсов, а затем фильтрация по нулям для создания выходных данных. Теперь, если полюса находятся близко к единичному кругу, передаточная функция только для полюса становится очень, очень большой. Таким образом, переменная состояния может быть намного больше, чем входная (от 80 до 100 дБ больше), а суммирование переменных состояния с входом создает много шума.

Решение здесь состоит в том, чтобы перейти к транспонированной форме II или прямому фильтру формы I. Анализ показывает, что переменные состояния не могут быть больше, чем вход / выход, тогда, может быть, 12 дБ или около того, поэтому проблема с несоответствием величины проблемы не возникает в первую очередь.


2

У двойной точности по сравнению с одинарной точностью есть два преимущества: увеличенный диапазон и лучшее разрешение. Я был бы очень удивлен, если бы увеличенный диапазон имел какое-либо значение в вашем приложении. Если это так, возможно, что-то не так с вашим масштабированием.

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


2

Если вы работаете с синтезированным звуком, который подвергается большой обработке между генерацией и рендерингом (преобразование в 16/24-битное целое число), то вы выиграете от работы с наилучшей числовой точностью, которую имеет ваша машина.

Также важно провести фундаментальное различие между целыми числами и числами с плавающей запятой. 64-разрядное число с плавающей запятой двойной точности отличается от 64-разрядного целого числа, и вы даже можете работать с целыми числами произвольной точности в программном обеспечении, в зависимости от используемых вами программных средств. Это было бы важно, если бы вам приходилось записывать звуки, а не генерировать их (насколько я знаю, AD преобразование всегда сохраняет сэмплированные звуки в целочисленном формате).

Я не могу быть полностью уверен в этом, но если вы генерируете свой звук уже с плавающей запятой, более распространенные артефакты, скорее всего, не будут присутствовать по определению, и вы сможете обработать его с гораздо более «качеством звука». Возможно, вы даже сможете генерировать звуковые сэмплы только ПОСЛЕ того, как вы уже применили некоторые эффекты к самому генератору. Единственный момент, когда вы фактически вводите какой-либо потенциальный артефакт, - это когда вы конвертируете его для вывода в некоторый целочисленный формат файла, например, .WAV.

На самом деле, поскольку в настоящее время большинство машин имеют собственную «двойную» (64-битную) точность, я больше не вижу смысла работать с 32-битными ...

Надеюсь, это поможет!


3
«Я больше не вижу смысла работать с 32 битами ...», если вы не используете SIMD!
pichenettes
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.