Kiedy syntetyzując i przetwarzając dźwięk na nowoczesnych procesorach, należy rozważyć użycie czegoś innego niż zmiennoprzecinkowy pojedynczej precyzji (32 bity)? Oczywiście dźwięk przychodzący i wychodzący do świata rzeczywistego ma 16/24 bity, więc mówię tylko o precyzji sygnałów (zarówno samego dźwięku, jak i współczynników filtrowania) w oprogramowaniu.
Zakładać, że:
- CPU / DSP ma sprzętową obsługę zmiennoprzecinkową dla pojedynczej i podwójnej precyzji
- Priorytetem jest jakość dźwięku, a nie wysoka wydajność. Na przykład podwójna precyzja byłaby brana pod uwagę, gdyby oferowała lepszą (percepcyjną) jakość.
źródło
To zależy od rodzaju wsparcia, o którym mówisz. Na x86, stosując instrukcje zmiennoprzecinkowe w stylu x87, otrzymujesz pełną 80-bitową precyzję wewnętrzną i taki sam czas przetwarzania - niezależnie od tego, czy pracujesz z pojedynczą, czy podwójną precyzją.
Ale korzystając z instrukcji SIMD, możesz wykonać dwa razy więcej pracy przy użyciu 32-bitowych liczb zmiennoprzecinkowych niż 64-bitowych liczb zmiennoprzecinkowych. To wielka sprawa.
Inną rzeczą, którą należy wziąć pod uwagę, jest pamięć - użycie podwójnej precyzji dzieli przez dwa dane, które mieszczą się w najszybszych poziomach pamięci podręcznej.
Wszystko sprowadza się do rodzaju syntezy i przetwarzania. Jeśli wiąże się to z filtrami IIR (lub bardziej ogólnie ze zmiennymi stanu i / lub sprzężeniem zwrotnym), możesz łatwiej strzelać sobie w stopę (niestabilności lub niedokładności z powodu niskiego odcięcia z powodu obcięcia współczynnika) za pomocą 32-bitów, jeśli nie za dużo myślę o tym, co robisz. Niektóre topologie filtrów działają bezbłędnie w 32-bitach.
W każdym razie jest to kwestia precyzji numerycznej - pod względem jakości nie będzie żadnej różnicy percepcyjnej. Należy pamiętać, że absurdalne jest oczekiwanie, że sprzętowy łańcuch audio ma więcej niż 20 bitów precyzji (zakładając, że płyta jest nieskazitelnie poprowadzona i wszystkie części są idealne, wciąż zbliżamy się do granicy szumu Johnsona!) - i precyzję tę w dużej mierze pokrywają pływaki o pojedynczej precyzji. Ścieżka sygnału na wysokiej klasy biurku miksującym zawiera 50s wzmacniaczy operacyjnych, które indywidualnie mają kilka rzędów wielkości więcej zniekształceń niż szum kwantyzacji operacji arytmetycznych na pływakach pojedynczej precyzji.
źródło
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.
źródło
Podwojenie precyzji w stosunku do pojedynczej precyzji ma dwie zalety: zwiększony zasięg i lepsza rozdzielczość. Byłbym bardzo zaskoczony, gdyby zwiększony zasięg miałby jakikolwiek wpływ na twoje zastosowanie. Jeśli tak, prawdopodobnie coś jest nie tak z twoim skalowaniem.
W przypadku poprawy byłoby to w rozdzielczości. Lepsza rozdzielczość oznacza mniejszy szum kwantyzacji . O ile szum kwantyzacji nie jest zbliżony do tego samego poziomu, co wszystkie inne źródła hałasu, prawdopodobnie nie zrobi to żadnej różnicy. Możesz przeprowadzić analizę poziomu szumów i sygnałów, aby dowiedzieć się, jaka część szumu pochodzi z błędu kwantyzacji, ale tak naprawdę nie wiesz na pewno, czy to zrobi różnicę, dopóki nie zaimplementujesz jej z obu zobacz, czy to robi różnicę.
źródło
Jeśli pracujesz z syntezowanym dźwiękiem, który podlega dużej obróbce między generowaniem a renderowaniem (konwersja do 16/24 bitowych liczb całkowitych), skorzystasz z pracy z najlepszą precyzją liczbową, jaką ma twoja maszyna.
Ważne jest również, aby dokonać fundamentalnego rozróżnienia między liczbami całkowitymi a liczbami zmiennoprzecinkowymi. Zmienna zmiennoprzecinkowa podwójnej precyzji (64-bitowa) różni się od 64-bitowej liczby całkowitej, a nawet w oprogramowaniu można pracować z liczbami całkowitymi o dowolnej precyzji, w zależności od używanych narzędzi programowych. Byłoby to ważne, gdybyś musiał nagrywać dźwięki zamiast je generować (o ile wiem, konwersja AD zawsze zapisuje próbkowane dźwięki w formacie liczb całkowitych).
Nie mogę być tego całkowicie pewien, ale jeśli wygenerujesz dźwięk już w zmiennoprzecinkowym, bardziej powszechne artefakty najprawdopodobniej nie będą obecne z definicji i możesz go przetwarzać ze znacznie większą „jakością dźwięku”. Być może możesz wygenerować próbki dźwięku tylko PO zastosowaniu kilku efektów do samego generatora. Jedynym momentem, w którym faktycznie wprowadzisz potencjalny artefakt, jest jego konwersja na dane wyjściowe w formacie pliku liczb całkowitych, na przykład .WAV.
W rzeczywistości, ponieważ większość maszyn ma obecnie natywną „podwójną” (64-bitową) precyzję, nie widzę już powodu, aby pracować z 32-bitowymi…
Mam nadzieję, że to pomaga!
źródło