Потрібно знати числові вимоги свого алгоритму і відповідно вибрати точність.
Тож давайте зробимо математику тут: 32-розрядна плаваюча точка має 24-бітну мантісу та 8-бітний показник. Це дає близько 150 дБ співвідношення сигнал / шум у динамічному діапазоні близько 1540 дБ. Це багато для аудіо більшості речей. Подвійна точність дає приблизно вдвічі більше.
Кожен алгоритм має певні вимоги до числової точності. Якщо правильно розроблені всі звукові алгоритми, які я знаю, я маю на увазі 32-бітну плаваючу крапку. "правильно розроблений" - це ключове слово. Наприклад, частотний діапазон 6-го порядку від 40-200 Гц, відібраний на частоті 44,1 кГц, реалізований як прямий з II-квадратурного фільтра IIR, справді матиме проблеми із шумом при 32-бітному. Однак він прекрасно працює як транспонована форма II або фільтр прямої форми I.
Якщо ви спробуєте часткове розширення фракції одного і того ж фільтра пропускання смуги, використовуючи, наприклад, функцію залишку () Matlab, ви отримаєте погані результати навіть при подвійній точності. Знову чисельні вимоги алгоритму до цих конкретних вхідних даних перевищують подвійну точність. Ключове значення для виправлення цього полягає не у сліпому підвищенні точності, а у використанні кращого алгоритму.
Нарешті, давайте подивимось, що робить плаваючий (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 дБ або не більше, тому невідповідність величини проблеми виникає не в першу чергу.