Kiedy rozważać podwójny (64-bitowy) zmiennoprzecinkowy dźwięk

12

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ść.
użytkownik1849104
źródło

Odpowiedzi:

9

IEEE float singles dostarcza tylko około 24 bitów mantysy. Ale wiele algorytmów DSP / filtrowania (bikwady IIR z biegunami / zerami w pobliżu koła jednostki itp.) Wymagają znacznie więcej niż 24 bitów mantysy dla pośrednich produktów obliczeniowych (akumulatorów itp.), Aby uzyskać ostateczne wyniki z dokładnością do około 16 lub 24 bity. W przypadku tego rodzaju algorytmów często stosowano akumulatory całkowite w skali 32, 40 i 48 bitów z procesorami DSP, które nie miały FPU.

Ale w wielu bieżących implementacjach procesorów (dla komputerów PC, smartfonów itp.) FPU z podwójną precyzją jest znacznie szybsza niż próba użycia 32 lub 64-bitowej liczby całkowitej, gdy algorytm musi mieć więcej niż 24 bity produktu pośredniego.

Aby zapobiec zniszczeniu pamięci podręcznej danych, surowe dane mogą mieć krótki format liczb całkowitych lub zmiennoprzecinkowy o pojedynczej precyzji, natomiast tylko bardziej lokalne jądro obliczeniowe może używać formatu o wyższej rozdzielczości. Ale jeśli dzielisz wyniki obliczeń pośrednich między modułami DSP, protokół wymiany między modułami może również korzystać z wyższej rozdzielczości (ponad 24-bitowej mantysy) formatu danych lub magistrali.

hotpaw2
źródło
Tego rodzaju informacji szukałem. Ja przyjmuję tę odpowiedź, jeśli można uprzejmie dostarczyć przykład beton przypadku gdy podwójna precyzja jest wymagana , aby pracę filtra, czyli będzie to brzmieć źle (lub przynajmniej dość zwyczajny) z pojedynczej precyzji, ale gładka jak masło z podwójną precyzją.
user1849104,
Co dokładnie masz na myśli, mówiąc, że kosztujesz pamięć podręczną? Czy masz na myśli, że przechodzenie przez nią dwukrotnie większej ilości danych spowoduje, że wszystko stanie się strasznie wolne?
user1849104,
Podano przykład IIR z biegunami / zerami w pobliżu koła jednostki. Jeśli istnieje pamięć podręczna, algorytmy i działające zestawy danych pasujące do tej pamięci podręcznej mogą być znacznie szybsze niż te, które jej nie mają.
hotpaw2,
9

CPU / DSP ma sprzętową obsługę zmiennoprzecinkową dla pojedynczej i podwójnej precyzji.

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.

Podczas syntezy i przetwarzania dźwięku na nowoczesnych procesorach

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.

fenenety
źródło
Czy można bezpiecznie powiedzieć, że użycie pojedynczej precyzji z instrukcjami SIMD zawsze zapewni około dwukrotnie większą wydajność niż podwójna precyzja?
user1849104,
Ponieważ nie mogę już edytować poprzedniego komentarza: nigdy nie miałem okazji (bezpośrednio) korzystać z żadnych zestawów instrukcji SIMD. Czy można po prostu użyć pojedynczej precyzji i uzyskać dwukrotnie wyższą wydajność? A może rzeczywistość przeszkadza?
user1849104,
6

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.

Hilmar
źródło
2

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ę.

Jim Clay
źródło
2

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!

heltonbiker
źródło
3
„Nie widzę już powodu, aby pracować z 32-bitowymi…”, chyba że korzystasz z SIMD!
pikenety