Dither przy eksporcie do 16 bitów: zniekształcenia, modulacja szumu i noise shaping, pomiar

Spis treści
- Jak wykonano pomiar
- Bez ditheringu: błąd zależy od sygnału
- RPDF i TPDF: zniekształcenia usunięte, równomierny szum tylko z TPDF
- Noise shaping: mniej szumu poniżej 4 kHz, więcej szumu łącznie
- Dwukrotny dithering: każdy przebieg dodaje szum
- Co z tego wynika dla eksportu
- Kontekst i ograniczenia
- Pytania i odpowiedzi
- Źródła
Mikser FL Studio liczy na 32-bitowych liczbach zmiennoprzecinkowych. Przy eksporcie do pliku 16-bitowego każda próbka musi trafić na jeden z 65 536 poziomów. Jeden poziom, czyli LSB, odpowiada 1/32 768 pełnej skali, a więc −90,3 dBFS. Im cichszy sygnał, tym większy jest błąd zaokrąglenia w stosunku do niego: przy sinusie −60 dBFS leżał 38 dB poniżej tonu, przy −96 dBFS powyżej. Podręcznik FL Studio opisuje dithering jako sposób na przełamanie przewidywalności tych błędów zaokrąglenia i stosuje go tylko przy eksporcie do 16-bitowego WAV i MP3.
Pomiar konwertuje sygnały testowe w ffmpeg z 32-bitowego formatu zmiennoprzecinkowego do 16 bitów: bez ditheringu, z ditherem o rozkładzie prostokątnym (RPDF), z ditherem o rozkładzie trójkątnym (TPDF), z TPDF po filtrze górnoprzepustowym oraz z trzema metodami noise shapingu. Teorię podsumował Robert A. Wannamaker w rozprawie doktorskiej z 1997 roku: kwantyzacja bez ditheringu może wytwarzać słyszalne zniekształcenia i modulację szumu; dither RPDF uniezależnia od sygnału średni błąd, a dither TPDF także jego moc. Poziom i szczyty mastera omawiają pomiary True peak po kodowaniu i Clipper czy limiter przed eksportem; ten pomiar dotyczy ostatniego kroku, czyli długości słowa.

Jak wykonano pomiar
- Konwersja: ffmpeg 7.1.5 z filtrem aresample i opcjami osf=s16 oraz dither_method, na wejściu 32-bitowy zmiennoprzecinkowy WAV 44,1 kHz, na wyjściu 16-bitowy PCM, następnie ponowny odczyt. Wartość domyślna dither_method to 0, czyli brak ditheringu.
- Procedury: ffmpeg działał z opcją -cpuflags 0, a więc bez procedur zoptymalizowanych pod procesor. Na komputerze ARM użytym do pomiaru te procedury przesuwały RPDF i TPDF o pół LSB; szczegóły w części o kontekście i ograniczeniach.
- Schody ze stałych wartości: 41 stałych wartości wejściowych od 0 do 2 LSB co 0,05 LSB, każda przez sekundę. Dla każdego stopnia obliczono ze środkowych 0,8 sekundy średni błąd (wyjście minus wejście) i rozrzut wyjścia jako odchylenie standardowe. Jeśli średni błąd zależy od wejścia, konwersja zniekształca; jeśli od wejścia zależy rozrzut, szum zmienia się wraz z sygnałem.
- Sinus: 1 kHz o poziomie szczytowym −60 i −96 dBFS, przez dziesięć sekund, analizowany w widmie środkowych ośmiu sekund: ton podstawowy względem wartości docelowej, wszystkie pozostałe składowe między 20 Hz a 20 kHz oraz harmoniczne od 2. do 19. względem szumu w ich otoczeniu. Dla porównania tę samą analizę wykonano dla częstotliwości leżących dokładnie między harmonicznymi.
- Cisza: dziesięć sekund cyfrowego zera. Szum podano jako wartość skuteczną względem pełnej skali, łącznie i w pięciu pasmach częstotliwości.
- Dwukrotny dithering: cisza po ditheringu została zapisana bezstratnie w 32-bitowym formacie zmiennoprzecinkowym i drugi raz przekonwertowana do 16 bitów tą samą metodą.
Bez ditheringu: błąd zależy od sygnału
Bez ditheringu konwersja zaokrąga każdą wartość do najbliższego poziomu. Średni błąd podążał więc za wejściem jak piła między −0,5 a +0,5 LSB, a rozrzut pozostał zerowy. To samo wejście dawało zawsze to samo wyjście; błąd jest stałą funkcją sygnału, a cyfrowa cisza pozostała cyfrowym zerem.
Sinus pokazuje, co to oznacza dla cichych fragmentów. Przy −60 dBFS wszystkie pozostałe składowe łącznie leżały 38,3 dB poniżej tonu podstawowego. Ponieważ układ tonu i zaokrąglenia regularnie się powtarza, tworzyły one pojedyncze linie zamiast równomiernego szumu; najsilniejsza leżała przy 17,5 kHz, 51,7 dB poniżej tonu podstawowego. Przy −96 dBFS sinus sięga tylko nieco ponad pół poziomu i zostały z niego krótkie impulsy: ton podstawowy stracił 3,7 dB, trzecia harmoniczna przy 3 kHz leżała tylko 0,9 dB poniżej niego, piąta 2,7 dB, a pozostałe składowe miały łącznie o 2,9 dB większą moc niż ton podstawowy.
RPDF i TPDF: zniekształcenia usunięte, równomierny szum tylko z TPDF
| Metoda | Średni błąd | Rozrzut | Szum w cyfrowej ciszy | Ton podstawowy przy −96 dBFS, odchylenie |
|---|---|---|---|---|
| bez ditheringu | od −0,50 do +0,50 LSB | 0 LSB | brak | −3,67 dB |
| RPDF | od −0,004 do +0,004 LSB | od 0 do 0,50 LSB | brak | +0,02 dB |
| TPDF | od −0,005 do +0,009 LSB | od 0,49 do 0,50 LSB | 0,50 LSB (−96,4 dBFS) | −0,04 dB |
| TPDF z filtrem górnoprzepustowym | od −0,009 do +0,010 LSB | od 0,48 do 0,52 LSB | 0,48 LSB (−96,6 dBFS) | −0,05 dB |
Z ditherem RPDF średni błąd przy każdej wartości wejściowej odbiegał od zera najwyżej o 0,004 LSB: zniekształcenia zniknęły. Rozrzut natomiast podążał za wejściem, od zera przy wartościach całkowitych do 0,5 LSB dokładnie między dwoma poziomami. Szum zmienia się więc wraz z sygnałem, a cyfrowa cisza pozostała całkowicie wolna od szumu. Zgadza się to z teorią: dither o rozkładzie prostokątnym uniezależnia od sygnału tylko średnią błędu, a nie jego moc.
Z ditherem TPDF rozrzut przy każdej wartości wejściowej wynosił od 0,49 do 0,50 LSB. Według Wannamakera spośród wszystkich ditherów, które pozostają w sygnale i usuwają zarówno zniekształcenia, jak i modulację szumu, dither o rozkładzie trójkątnym najmniej zwiększa moc błędu: do jednej czwartej kwadratu poziomu, co jako wartość skuteczna daje 0,5 LSB, czyli −96,3 dBFS. W ciszy zmierzono 0,50 LSB i −96,4 dBFS, równomiernie rozłożone na wszystkie częstotliwości. Wariant z filtrem górnoprzepustowym szumiał łącznie prawie tak samo, ale poniżej 4 kHz o 5,3 dB ciszej.
Na sinusie żadna metoda ditheringu nie pozostawiła harmonicznej, która wyróżniałaby się na tle szumu: przy harmonicznych poziom leżał najwyżej 4,6 dB ponad szumem otoczenia, przy częstotliwościach kontrolnych między harmonicznymi do 4,2 dB. Ton podstawowy odbiegał od wartości docelowej najwyżej o 0,05 dB, także przy −96 dBFS. Tam szum między 20 Hz a 20 kHz miał wprawdzie większą moc niż ton, ale rozkłada się na wszystkie częstotliwości, a ton leży na jednej.
Noise shaping: mniej szumu poniżej 4 kHz, więcej szumu łącznie
| Metoda | Szum łączny | od 20 Hz do 4 kHz | od 4 do 10 kHz | od 10 do 16 kHz | od 16 do 20 kHz | od 20 do 22 kHz |
|---|---|---|---|---|---|---|
| TPDF | −96,4 dBFS | −103,8 dBFS | −102,0 dBFS | −102,1 dBFS | −103,7 dBFS | −106,5 dBFS |
| TPDF z filtrem górnoprzepustowym | −96,6 dBFS | −109,2 dBFS | −105,9 dBFS | −102,0 dBFS | −101,4 dBFS | −103,6 dBFS |
| Lipshitz | −84,1 dBFS | −120,7 dBFS | −104,9 dBFS | −97,2 dBFS | −87,3 dBFS | −87,4 dBFS |
| F-weighted | −77,8 dBFS | −119,9 dBFS | −106,6 dBFS | −99,2 dBFS | −82,0 dBFS | −80,0 dBFS |
| Shibata | −72,1 dBFS | −113,6 dBFS | −116,2 dBFS | −99,8 dBFS | −73,8 dBFS | −77,0 dBFS |
Noise shaping zawraca błąd zaokrąglenia przez filtr z powrotem do konwersji i w ten sposób kształtuje jego widmo. Wannamaker wskazuje jako cel umieszczenie większości mocy błędu w wysokich pasmach częstotliwości, na które słuch jest stosunkowo mało wrażliwy. W porównaniu z TPDF trzy metody ffmpeg obniżyły szum poniżej 4 kHz o 16,8 dB (Lipshitz), 16,0 dB (F-weighted) i 9,8 dB (Shibata). W zamian szum łączny wzrósł o 12,3, 18,5 i 24,3 dB, prawie w całości powyżej 16 kHz: z metodą Shibata osiągnął między 16 a 20 kHz −73,8 dBFS, o 29,9 dB więcej niż TPDF. Średni błąd pozostał niezależny od wejścia, a rozrzut wynosił od 2,01 do 2,08 LSB (Lipshitz), od 4,11 do 4,29 LSB (F-weighted) i od 7,95 do 8,31 LSB (Shibata).
Według podręcznika także FL Studio używa kształtowanego ditheringu, który przesuwa większość szumu powyżej 10 kHz. Podręcznik nie podaje, jaki filtr za tym stoi; wartości z ffmpeg pokazują, o jaki rząd wielkości takie metody mogą się różnić.
Dwukrotny dithering: każdy przebieg dodaje szum
Według podręcznika FL Studio dithering powinien trafić do pliku 16-bitowego tylko raz, przy ostatnim renderowaniu, o ile w ogóle. Pomiar pokazuje, ile kosztuje drugi przebieg: gdy ciszę po ditheringu poddano drugiemu ditheringowi, szum z TPDF, Lipshitz i Shibata wzrósł w każdym z trzech przypadków o 3,0 dB, do −93,4, −81,1 i −69,1 dBFS. Dotyczy to niezależnej drugiej sekwencji szumu. ffmpeg zaczyna sekwencję szumu przy każdym uruchomieniu tak samo; gdy obie sekwencje nakładały się dokładnie, szum wzrósł o 6,0 dB (TPDF), 5,7 dB (Lipshitz) i 5,2 dB (Shibata).
Co z tego wynika dla eksportu
- Przy eksporcie w 24 bitach lub w 32-bitowym formacie zmiennoprzecinkowym, jak w poradniku masteringu w FL Studio, FL Studio nie stosuje ditheringu. Poziom 24-bitowy jest 256 razy mniejszy od 16-bitowego; szum TPDF leżałby tam według obliczeń przy −144,5 dBFS.
- Dla pliku 16-bitowego dither TPDF usuwa zniekształcenia i modulację szumu przy najmniejszym dodatkowym szumie, zmierzonym na poziomie −96,4 dBFS. Bez ditheringu trzecia harmoniczna przy −96 dBFS leżała tylko 0,9 dB poniżej tonu podstawowego; przy RPDF szum zmieniał się wraz z sygnałem od zera do 0,5 LSB.
- Noise shaping zamienia mniej szumu poniżej 4 kHz na więcej szumu łącznie. W pomiarze kosztowało to od 12 do 24 dB, prawie w całości powyżej 16 kHz.
- Dithering powinien pojawić się w łańcuchu tylko raz: każdy kolejny przebieg podnosił szum o 3 dB, a przy dokładnie nałożonej sekwencji szumu nawet o 6 dB.
- ffmpeg przy konwersji do 16 bitów domyślnie nie stosuje ditheringu;
aresample=osf=s16:dither_method=triangularwłącza TPDF.
Kontekst i ograniczenia
Pomiar objął konwersję w ffmpeg, a nie eksport z FL Studio; jego kształtowany dithering może dawać inne wartości. Sygnałami testowymi były stałe wartości, tony sinusoidalne i cisza; test odsłuchowy nie był częścią pomiaru. To, jak słyszalne są zniekształcenia przy −96 dBFS albo szum łączny −72 dBFS, zależy od materiału, głośności odsłuchu i toru odtwarzania. Ze zoptymalizowanymi procedurami ffmpeg metody RPDF i TPDF dawały na komputerze ARM użytym do pomiaru (aarch64) średni błąd −0,50 LSB zamiast zera, czyli składową stałą −96,3 dBFS, a z RPDF cyfrowa cisza szumiała na poziomie 0,50 LSB. Z opcją -cpuflags 0 przesunięcie zniknęło; metody z noise shapingiem dawały w obu przypadkach te same wartości.
Pytania i odpowiedzi
Czy dithering opłaca się już przy eksporcie do 24 bitów?
Raczej nie. Szum TPDF leżałby przy 24 bitach według obliczeń na poziomie −144,5 dBFS, a więc daleko poniżej szumu własnego typowych torów odtwarzania; FL Studio też nie stosuje tam ditheringu. Decydujący jest jeden krok ditheringu, gdy z tego pliku powstanie później wersja 16-bitowa.
Dlaczego RPDF sprawia kłopot właśnie przy wybrzmieniach i wyciszeniach?
Ponieważ sygnał schodzi tam w zakres kilku poziomów, w którym rozrzut przy RPDF zmienia się wraz z wejściem. W pomiarze wynosił zero przy wartościach całkowitych i 0,5 LSB dokładnie między dwoma poziomami. Powoli wybrzmiewający pogłos ciągnie więc za sobą szum, który pojawia się i znika razem z sygnałem, a gdy sygnał osiąga cyfrową ciszę, milknie także szum.
Ta modulacja szumu to dokładnie to, co usuwa TPDF: tam rozrzut przy każdej wartości wejściowej wynosił od 0,49 do 0,50 LSB, a nawet cyfrowa cisza niosła równomierny szum −96,4 dBFS. Ceną jest szum tła, który zostaje także w pauzach, a stały szum jest zwykle mniej uciążliwy niż taki, który zmienia się wraz z sygnałem.
Co oznacza zasada „dithering tylko raz”, gdy master jest potem dalej obrabiany?
Każda obróbka pliku 16-bitowego, czy to zmiana poziomu, limiter, czy zmiana częstotliwości próbkowania, wytwarza wartości leżące między poziomami i przy zapisie wymaga ponownego zaokrąglenia do 16 bitów. Ponowny dithering kładzie wtedy drugą sekwencję szumu na pierwszą; w pomiarze szum wzrósł przez to o 3,0 dB, a przy dokładnie nałożonej sekwencji w ffmpeg nawet o 6,0 dB. Rezygnacja z ditheringu przywraca natomiast zależne od sygnału błędy, które pierwszy przebieg usunął.
Zasady da się więc dotrzymać tylko wtedy, gdy wszystkie etapy pośrednie pracują z większą długością słowa:
- Miks do masteringu eksportuje się w 24 bitach lub w 32-bitowym formacie zmiennoprzecinkowym; według podręcznika FL Studio nie stosuje wtedy ditheringu.
- Wszystkie dalsze kroki wykonuje się na tym pliku.
- Dithering dodaje się dopiero w ostatnim kroku, który tworzy plik 16-bitowy, w ffmpeg na przykład przez
aresample=osf=s16:dither_method=triangular.
Jeśli pozostała już tylko wersja 16-bitowa, zostaje wybór między dwoma złami, a dodatkowe 3 dB szumu są zwykle mniejszym z nich.