LW IT Solutions logo LW IT Solutions logo LW IT Solutions
« Przegląd bloga /Music Production / Dither przy eksporcie do 16 bitów: zniekształcenia,...
Ten artykuł w innych językach:

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

Dither przy eksporcie do 16 bitów: zniekształcenia, modulacja szumu i noise shaping, pomiar
Spis treści
  1. Jak wykonano pomiar
  2. Bez ditheringu: błąd zależy od sygnału
  3. RPDF i TPDF: zniekształcenia usunięte, równomierny szum tylko z TPDF
  4. Noise shaping: mniej szumu poniżej 4 kHz, więcej szumu łącznie
  5. Dwukrotny dithering: każdy przebieg dodaje szum
  6. Co z tego wynika dla eksportu
  7. Kontekst i ograniczenia
  8. Pytania i odpowiedzi
  9. Ź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.

Dwa wykresy liniowe w funkcji wartości wejściowej od 0 do 2 LSB. Po lewej średni błąd: bez ditheringu piła między −0,5 a +0,5 LSB, z RPDF i TPDF płaska linia na 0. Po prawej rozrzut: bez ditheringu 0, z RPDF łuki od 0 przy całkowitych do 0,5 LSB przy połówkowych wartościach wejściowych, z TPDF stałe 0,5 LSB. Poniżej cztery wskaźniki: −3,7 dB tonu podstawowego przy −96 dBFS bez ditheringu, rozrzut od 0 do 0,50 LSB z RPDF, 0,50 LSB z TPDF i −17 dB szumu poniżej 4 kHz z noise shapingiem Lipshitz
Średni błąd i rozrzut przy konwersji do 16 bitów, bez ditheringu, z RPDF i z TPDF.

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 pozwala zmniejszyć szum poniżej 4 kHz kosztem zwiększenia szumu łącznego. W pomiarze wzrost wyniósł 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=triangular włą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.

Lukas Wójcik

Lukas Wójcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Kontakt

Masz pytanie lub pomysł na projekt internetowy? Napisz krótko, o co chodzi. Formularz korzysta z reCAPTCHA do ochrony przed spamem.

Napisanie komentarza

Doświadczenia z innymi programami DAW i wtyczkami, odmienne wyniki pomiarów oraz pytania są tu mile widziane.

Adres e-mail nie jest publikowany. Pola obowiązkowe oznaczono gwiazdką.