Musisz znać wymagania liczbowe swojego algorytmu i odpowiednio wybrać precyzję.
Zróbmy tutaj matematykę: 32-bitowy zmiennoprzecinkowy ma 24-bitową mantysę i 8-bitowy wykładnik potęgi. Daje to około 150 dB stosunku sygnału do szumu w zakresie dynamicznym około 1540 dB. To wystarcza na większość rzeczy audio. Podwójna precyzja daje z grubsza dwa razy więcej.
Każdy algorytm ma pewne wymagania dotyczące precyzji numerycznej. Jeśli właściwie zaprojektowane wszystkie algorytmy audio, które znam, działają dobrze z 32-bitowym zmiennoprzecinkowym. Słowo kluczowe „odpowiednio zaprojektowane” jest tutaj. Na przykład pasmo szóstego rzędu od 40-200 Hz próbkowane przy 44,1 kHz zaimplementowane bezpośrednio z filtra II-IIR b-quad będzie miało pewne problemy z szumem przy 32-bit. Działa jednak doskonale dobrze jako transponowany formularz II lub bezpośredni filtr typu I.
Jeśli spróbujesz częściowego rozszerzenia ułamka tego samego filtru pasmowego przy użyciu na przykład funkcji residz () Matlaba, otrzymasz złe wyniki nawet z podwójną precyzją. Ponownie, wymagania liczbowe algorytmu dla tych konkretnych danych wejściowych przekraczają to, co oferuje podwójna precyzja. Kluczem do rozwiązania tego problemu nie jest zaślepienie precyzji, ale użycie lepszego algorytmu.
Na koniec spójrzmy na to, co sprawia, że luźny (32-bitowy lub 64-bitowy) jest wrażliwy: masz ogromny zakres dynamiki, tj. Możesz zmniejszyć sygnał o 200dB, wzmocnić o 500dB, ponownie zmniejszyć o 300dB i skończyć dokładnie tam, gdzie zacząłeś praktycznie bez utraty precyzji. Więc to nie to. Zmienny punkt ma problem z dodawaniem liczb, które różnią się znacznie rozmiarem. Jest taki moment, że dodanie małej liczby nie robi żadnej różnicy, tzn. Dostajesz 1 + dx = 1. Liczba „dx” wynosi około 1,2e-7 dla 32-bitowego zmiennoprzecinkowego i 2,2e-16 dla 64-bitowego. Jeśli algorytm obejmuje dodawanie lub odejmowanie liczb, które są tak daleko od siebie, możesz napotkać problemy.
Dobrym przykładem tego jest wspomniany wcześniej filtr Direct Form II: Filtr Direct From II (patrz np. Https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html ) w zasadzie oblicza zmienne stanu poprzez filtrowanie danych wejściowych najpierw z funkcją przesyłania tylko dla bieguna, a następnie filtrowaniem z zerami w celu utworzenia wyniku. Teraz, gdy bieguny znajdują się blisko koła jednostki, funkcja przenoszenia samego bieguna staje się bardzo, bardzo duża. Zatem zmienna stanu może być znacznie większa niż wartość wejściowa (80db do 100dB większa), a sumowanie zmiennych stanu z wejściem powoduje duży szum.
Rozwiązaniem jest przejście do transponowanego formularza II lub bezpośredniego filtra formularza I. Analiza pokazuje, że zmienne stanu nie mogą być większe niż wejście / wyjście, a może 12dB lub więcej, więc niedopasowanie wielkości problemu nie występuje w pierwszej kolejności.