Коли розглядати подвійну (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-бітної мантіси) або формату даних.


Це така інформація, яку я шукав. Я прийму цю відповідь, якщо ви могли б надати конкретний приклад випадку, коли для роботи фільтра потрібна подвійна точність , тобто це буде звучати погано (або хоча б досить звичайно) з однією точністю, але гладкою, як масло з подвійною точністю.
користувач1849104

Крім того, що саме ви маєте на увазі під рухом кеша? Ви маєте на увазі, що наявність у ньому вдвічі більше даних зробить справи жахливо повільними?
користувач1849104

Наведено приклад IIR з полюсами / нулями біля одиничного кола. Якщо є кеш, алгоритми та набори робочих наборів даних, які вписуються в цей кеш, можуть бути значно швидшими, ніж ті, які цього не роблять.
hotpaw2

9

CPU / DSP має апаратну підтримку з плаваючою комою як для однократної, так і для подвійної точності.

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

Але при використанні інструкцій SIMD ви можете зробити вдвічі більше роботи, використовуючи 32-бітні поплавці, ніж 64-бітні поплавці. Це велика справа.

Інша річ, яку слід врахувати, - це пам'ять - за допомогою подвійної точності ділиться на два об'єм даних, який вписується в найшвидший рівень кеш-пам'яті.

Синтезуючи та обробляючи аудіо на сучасних процесорах,

Це зводиться до того, який синтез та обробку ви робите. Якщо він включає фільтри IIR (або взагалі що-небудь із змінними стану та / або зворотним зв'язком), ви можете легше застрелити себе в ногу (нестабільності чи низькоточні неточності через урізання коефіцієнта) з 32-бітовим, якщо ви цього не зробите занадто багато думайте про те, що ви робите. Деякі топології фільтрів бездоганно працюють з 32-розрядними.

У будь-якому випадку, це числова проблема точності - з точки зору якості не буде ніякої різниці в сприйнятті. Майте на увазі, що досить смішно очікувати, що апаратний аудіо ланцюг матиме більше 20 біт точності (якщо припустити, що плата бездоганно розбита, і всі деталі ідеальні, ми все ще стикаємося з межею шуму Джонсона!) - і ця точність значною мірою охоплена одноточними поплавцями. Шлях сигналу на висококласному змішувальному столі має 50-ти підсилювачів, які окремо мають на кілька порядків більше спотворень, ніж шум квантування арифметичних операцій на одноточних поплавках.


Чи можна було б впевнено сказати, що використання однієї точності із інструкціями SIMD завжди дає вам приблизно вдвічі більшу продуктивність над подвійною точністю?
користувач1849104

Оскільки я не можу більше редагувати попередній коментар: я ніколи не мав можливості (безпосередньо) використовувати будь-які набори інструкцій SIMD. Чи можна просто використовувати одну точність і отримати подвійну продуктивність? Або реальність заважає?
користувач1849104

6

Потрібно знати числові вимоги свого алгоритму і відповідно вибрати точність.

Тож давайте зробимо математику тут: 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 дБ або не більше, тому невідповідність величини проблеми виникає не в першу чергу.


2

Існує дві переваги щодо подвійної точності порівняно з однією точністю: збільшення дальності та краща роздільна здатність. Я був би дуже здивований, якщо збільшений діапазон змінить вашу програму. Якщо це так, мабуть, щось не так з вашим масштабуванням.

Якщо буде покращення, це було б у резолюції. Краща роздільна здатність означає менший шум квантування . Якщо тільки шум квантування не наблизиться до того ж рівня, що і всі ваші інші джерела шуму, він, мабуть, не змінить. Ви можете зробити аналіз рівня шуму та сигналу, щоб отримати уявлення про те, яка частина шуму виходить від помилки квантування, але ви точно не знатимете напевно, чи зміниться він чи ні, поки ви не реалізуєте це з обома і подивіться, чи це має значення.


2

Якщо ви працюєте із синтезованим звуком, який зазнає великої кількості обробки між поколінням та рендерінгом (перетворення на 16/24 бітове ціле число), то ви отримаєте користь від роботи в найкращій цифровій точності, яку має ваша машина.

Також важливо зробити принципове розмежування між цілими числами і числами з плаваючою точкою. Плаваюча точка з подвійною точністю (64 біт) відрізняється від 64-бітного цілого числа, і ви навіть можете працювати з цілими числами довільної точності в програмному забезпеченні, залежно від програмних засобів, якими ви користуєтеся. Це було б важливо, якби вам довелося записувати звуки, а не генерувати їх (наскільки я знаю, перетворення AD завжди зберігає дискретизовані звуки у цілому форматі).

Я не можу бути в цьому повністю впевнений, але якщо ви генеруєте свій звук вже в плаваючій точці, більш поширені артефакти, швидше за все, не будуть представлені за визначенням, і ви можете обробити його набагато більшою "якістю звуку". Можливо, ви навіть можете генерувати зразки звуку лише ПІСЛЯ ви вже застосували деякі ефекти до самого генератора. Єдиний момент, коли ви насправді представляєте будь-який потенційний артефакт, це коли ви конвертуєте його для виведення у якийсь цілий формат файлу, наприклад, наприклад .WAV.

Насправді, оскільки в даний час більшість машин мають вроджену "подвійну" (64-бітну) точність, я більше не бачу причин працювати з 32-бітними ...

Сподіваюся, що це допомагає!


3
"Я більше не бачу причин працювати з 32 бітами ...", якщо ви не використовуєте SIMD!
пікенети
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.