Про Float в аудио популярно

  • Автор темы Автор темы Entrase
  • Дата начала Дата начала

Entrase

Егор
1 Ноя 2008
366
93
0
Поделюсь тем, что знаю :)

Сразу прошу прощения за разговоры про «плавную волну». При всём своём новичковском звучании такие изъяснения легко визуализируются в мыслях. В дебри программирования и математики лазить не буду, рассказываю для всех.

Про Float в аудио популярно

Где нам только не попадается надпись вроде «32 bit float» — в спецификациях, обзорах, руководствах. К сожалению, последний элемент этой надписи часто недооценивается или вовсе игнорируется, и формат ставится в один ряд с привычными нам 16- или 24-битными. То есть многие просто не осведомлены о преимуществах представления с плавающей запятой («float» — плавающий). Потому распространены суждения в духе «зачем 32, если мне и 24 достаточно». Разберёмся, зачем и где это всё-таки нужно.

Когда речь идёт о 16, 20, 24 или 48 битах, то обычно под этим подразумевается противоположность плавающей запятой — фиксированная запятая. Подписывается это как «int», то есть integer — целочисленный, т.к. в этом виде удобно представлять целые числа. Именно о представлении с фиксированной запятой считает своим долгом рассказать любой автор, пишущий об основах цифрового звука. Поэтому не будем вдаваться подробности, а лишь вспомним, что 00 = 0, 01 = 1, 10 = 2, 11 = 3 и т.д., но только с соответствующим числом разрядов (разряды и биты — одно и то же в данном контексте, если что :) Правда, один бит отдаётся под знак — так удобнее представлять «цифровую волну», которая колеблется в обе стороны относительно нуля. С разным количеством бит получается разный диапазон чисел, но самое большое по модулю число в этом диапазоне всё равно соответствует 0 дБ. Это пресловутый Full Scale, выше которого не прыгнешь, т.к. все биты уже единицы. Но иногда прыгнуть нужно.

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

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

Как же float позволяет нам прыгнуть выше 0 дБ? По правде говоря, помогает не float, а тот факт, что 0 дБ в данном случае соответствует не максимальному числу с плавающей запятой, а намного меньшему. То же самое можно сделать и в целых числах. Взять, скажем, в 16-битном диапазоне за ноль не 32768, а раза в два меньше. Но разве для сильных перепадов нам достаточно такого запаса? Нет. Хорошо, float мы обычно видим в 32-битном исполнении. Возьмём тогда и для целого числа 32 бита. Поставим ноль посередине. Запас будет куда больше. Но для сильных многократных изменений этого всё равно может оказаться недостаточно. А если и хватит (работать и обрабатывать можно по-разному), то это лишняя головная боль программистам: необходимо отслеживать переполнения (когда все единицы и дальше некуда) и потери значимости (когда все нули). А наткнуться на эти эффекты при фиксированном формате куда проще, чем с плавающей запятой.

Почему? Потому что числа кодируются нулями и единицами иначе. Если в целочисленных форматах мы имели подход «в лоб» с переключением нулей на единички по порядку в одном большом поле (бит под знак сути не меняет), то здесь уже имеются два поля: мантисса и показатель степени. По стандарту IEEE754 число одинарной точности имеет 8-битный показатель и 23-битную мантиссу (1 бит под знак). Более глубоко тема раскрывается в энциклопедиях. Это называется экспоненциальной записью, и все её знают. В школе на физике и математике рассказывают, что число 1 536 000 можно записать как 1,536 × 10^6. 6 — показатель степени, 1,536 — мантисса. Не слишком напрягаясь можно манипулировать порядком числа — достаточно изменять показатель (1,536 × 10^−6). Довольно школьного материала, всё есть в учебниках и справочниках в достаточно сжатом виде. Вывод прост: волна будет оставаться плавной на самых разных уровнях, причём куда более разных, чем при обычной нотации. То есть звук не будет терять качество даже при очень серьёзных «регулировках громкости».

За 0 дБ в «плавающих форматах» берётся единица (1,00000…). Форматы эти имеют знак, как и целочисленные. Например, в 16 битах имеем числовой диапазон от −32768 до 32767. Вот эти пределы по децибелам и соответствуют промежутку −1,00—1,00 в плавающем виде. Но пределы самого плавающего вида куда шире диапазона от −1,00 до 1,00. Больше настолько, что уже в 32-битном представлении с плавающей запятой без ущерба для звука можно делать регулировки на сотни децибел! Вот так.

Почти панацея для программистов и серьёзное упрощение рабочего процесса для звукоинженеров. Почему почти? Потому что не всегда была и не всегда есть возможность применить соответствующие процессоры или снабдить процессор устройством для вычислений с плавающей запятой. Причём раньше проблема проявляла себя сильнее. Те стандарты и решения, которые становились давно по меркам вычислительной техники, завязаны на целых числах. По мере обновления техники вычисления с плавающей запятой задействуются шире. Например, новая звуковая подсистема ОС Windows Vista построена полностью на float-формате. Ещё программистам фирма Intel подарила ложку дёгтя в виде жутких тормозов своих процессоров при работе с очень мелкими числами. Впрочем, пользователей данная проблема не касается, т.к. программисты успешно обходят этот баг. На звук это не влияет, т.к. речь о действительно мелких числах. Не спешите погружаться в негодование и бежать за другими процессорами к другим фирмам. Особенность эта очень старая и присуща всем совместимым камням.

При всех положительных сторонах не везде целесообразно применять вычисления с плавающей запятой. На сегодняшний день не существует АЦП/ЦАП, способных полностью покрыть даже 24 бита, не говоря уже о чём-то большем. А значит, и нет смысла выбирать плавающие форматы для конечного продукта. Их предназначение — промежуточные результаты хоть в виде файлов, хоть внутри микшера виртуальной студии. Вне компьютера вычисления с плавающей запятой пока что распространения не получили. Конечно, они используются, например, в декодерах, а есть и вовсе отдельный класс процессоров — сигнальные. Но это закрытые для пользователя системы, и ему плевать, как там внутри его проигрывателя реализовано декодирование MP3. Студийные железки через AES3 передают звук целыми числами. А в бытовой технике поддержка огромного диапазона внешними интерфейсами совсем не нужна. Наверное, такой изолированностью и можно объяснить отсутствие 16-, 20-, 24- и прочих разрядностей, частых для фиксированных представлений.

Вот и всё, что могу на данный момент сказать, не погружаясь куда попало. Может, позже что-то добавлю. Или вы добавите. Спасибо за внимание.
 
А наткнуться на эти эффекты при фиксированном формате куда проще, чем с плавающей запятой.
Не совсем так.
http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

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

Целочисленный формат в этом отношении более дубовый.
 

Сейчас просматривают