Вам нужно знать числовые требования вашего алгоритма и соответственно выбирать точность.
Итак, давайте сделаем математику здесь: 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 дБ или около того, поэтому проблема с несоответствием величины проблемы не возникает в первую очередь.