A nie, jednak nie mówiłem…

Uściśliwszy w poprzednim odcinku pewne podstawowe informacje na temat dźwięku cyfrowego w formie  ultra fidelity quality high definition hyper techno vintage oxford abbey road resolution 3d stereo future surround ambient sound  (w wolnym tłumaczeniu: dźwięk, jaki gwarantuje sterta wysokiej klasy sprzętu studyjnego o równowartości rynkowej ceny średniej wielkości podwarszawskiej działki z ekskluzywną willą), przejdźmy do najbardziej lamerskiego spośród dostępnych na rynku rozwiązań: kompresji stratnej (analogicznie, w wolnym tłumaczeniu: prawilny bicik zapodawany w autobusie przez typowego Sebę z komóry, po nagraniu materiału z tranzystora ojca przy użyciu wbudowanego w nią dyktafonu).

Po raz kolejny zmuszeni jesteśmy podzielić naszą opowieść na oddzielne części.

Pieśnią tą wychwalać chcę niezbadane ścieżki,
Psychoakustyków hord i rzesz bezimiennych.
Grafomańskich wszak starczy poezji mej wierszy…

Jak widać, da się (epopeją w trzynastozgłoskowcu) napisać o podstawach psychoakustyki, tak, żeby było to i niezrozumiałe, i bolesne naraz.
Dokonawszy tego chwalebnego czynu przejdźmy do konkretów.

Na działanie zmysłu słuchu mają wpływ (wewnętrzny) dwa istotne elementy: budowa ludzkiego ciała (w tym zwłaszcza ucha) oraz sposób, w jaki dźwięk rozumiany jest przez mózg.
Pierwszy z elementów tej układanki ogranicza człowieka do zakresu mieszczącego się pomiędzy ~5 Hz i ~20 kHz, przy czym obie granice zależą od wzrostu i budowy wewnętrznej delikwenta.
Pewne częstotliwości i pasma  są dla nas słyszalne bardziej i skuteczniej rozpoznawalne, niż inne. I tak na przykład: dźwięki poniżej ~100 Hz, związane w naturalny sposób ze źródłami o odpowiednio większych od człowieka rozmiarach, są raczej odczuwalne, aniżeli słyszalne.

W ekstremalnych przypadkach (pogranicze infradźwięków) możliwe to jest przede wszystkim dzięki rezonansowi w jaki wpada szkielet, bądź trzewia. Nie musimy rozpoznawać wysokości dźwięku, żeby wiedzieć, że zbliża się niebezpieczeństwo. Nie musimy go nawet słyszeć – wystarczy odczuwać wibracje.
Podobnie, gdy idzie o rozpoznawanie ludzkiej mowy: okazuje się, iż zwiększone – z powodu budowy ucha wewnętrznego – wyczulenie na pasmo od 2 do 4 kHz umożliwiło rozszerzenie systemu komunikacji o wszelkiego typu spółgłoski, których główna energia skupia się właśnie na tych częstotliwościach.

W ten sposób człowiek jest w stanie odczuć dźwięki poniżej progu słyszenia (~20 Hz) lub usłyszeć (powyżej tej granicy), ale w miarę dokładne rozpoznanie ich wysokości jest dlań możliwe dopiero od circa 60 Hz. Powyżej ok. 6 kHz określenie wysokości dźwięku staje się coraz trudniejsze, aż do punktu, w którym słyszymy, że dźwięk po prostu jest (powyżej ok 12 kHz).
Na tym jednak nasza percepcja dźwięku się nie kończy, chociaż zmienia się diametralnie: powyżej ~17kHz jesteśmy w stanie raczej rozpoznać, gdy dźwięk ucichnie.

Poza skalą słyszalną zarówno ultra- jak i infradźwięki wciąż mają jednak na nas wpływ wzbudzając niebezpieczne rezonanse poszczególnych części ciała, np. serca, czy mózgoczaszki (vide: brązowa nutka).
Pewne konkretne zakresy (powyżej ~2 kHz) pozwalają człowiekowi na korzystanie, w bardzo ograniczonym zakresie, z daru echolokacji.
Sam mózg natomiast z uwagi na ogromną ilość informacji, które rejestrują zmysły, musiał wytworzyć konkretne sposoby filtrowania tego, co mniej istotne, lub oczywiste, aby w optymalny sposób reagować na zmiany zachodzące w otoczeniu.
Ten właśnie aspekt działania ludzkiego umysłu wykorzystywany jest przy jednym z istotniejszych przekształceń dźwięku opartych na psychoakustyce.

Mowa tu o maskowaniu, którego efekt opiera się na zagłuszaniu przez głośne dźwięki dźwięków cichszych (o zbliżonej częstotliwości) występujących w tym samym czasie, a także o rozpatrywaniu przez mózg dźwięków następujących po sobie w bardzo krótkim czasie, jako dźwięku jednego. Oprócz tego dochodzi jeszcze ekstrapolacja słabo słyszalnych, bądź niesłyszalnych części dźwięku w oparciu o charakter spektralny tego, co słyszymy. Ujmując rzec bardziej obrazowo:

spektrum

Jasnopomarańczowego słuchając niemal słyszymy ciemnopomarańczowe.

Tyle tytułem epopei. Czas na frontowe realia.

Działanie kompresji stratnej musi brać pod uwagę ograniczenia medium, które opisaliśmy w nieco przydługiej, pierwszej części, oprócz tego – i to jest meritum – niedoskonałości ludzkiego słuchu.

Naszym przykładem będzie standard mp3.

Aby wycisnąć możliwie dużo z połączenia tych dwóch aspektów, dźwięk zostaje poddany całemu szeregowi analiz mających ustalić gdzie, co i jak bardzo można wyciąć. W tym celu pierwotny sygnał zostaje poszatkowany na segmenty o długości około 500 sampli (~11 ms dla dźwięku w jakości CD Audio). Każdy segment cięty jest na zakładkę zarówno z poprzednim, jak i następnym. Ze względu na skutki uboczne takich cięć (pre-echo) długości segmentów mogą ulegać zmianie.

Każdy segment zostaje poddany analizie spektralnej oraz pomiarowi poziomu szumu kwantyzacji. Celem tych działań jest ustalenie, jak bardzo można zmniejszyć bitowość sygnału utrzymując jednocześnie szum kwantyzacji poniżej progu słyszalności, oraz ile informacji można usunąć z pasma częstotliwościowego maksymalnie zachowując charakter dźwięku (tu właśnie wkracza psychoakustyka). Co istotne, kolejne segmenty są rozpatrywane w ten sposób również w odniesieniu do poprzednich, bowiem aspekt psychoakustyczny dźwięku bardzo mocno uzależniony jest od kontekstu osadzonego w czasie – często wykraczający poza wspomniane 11 ms.

Tak przetworzony sygnał zostaje jeszcze poddany kompresji bezstratnej i po dodaniu informacji niezbędnych do prawidłowego odkodowania, zapisany do pliku wyjściowego. W zależności od zastosowanego schematu (layer-1, layer-2, layer-3) cały proces ulega dodatkowemu skomplikowaniu.

Również parametry właściwe dla poszczególnych typów kodeków mogą się różnić, np. segmenty mogą mieć długość 512 sampli (domyślnie dla layer-1), lub 576 sampli (layer-3) itd.

Dla zwiększenia skuteczności kodeków implementowane są w nich dodatkowe opcje, takie jak zmienna bitowość (VBR), czy tryb joint stereo polegający na wydzieleniu z sygnału wspólnej części panoramy, co pozwala pozbyć się zdublowanej części informacji (zgaduję, że sygnał jest wtedy zapisany w systemie M/S).

Jak się to wszystko ma do naszych realiów?

MP3, czyli MPEG Audio Layer-3 pozwala na kompresje sygnału o rozdzielczości 16/ 24 bit, oraz częstotliwości próbkowania 32/ 44,1/ 48 kHz (standard open-source).
Z uwagi na sposób rozwiązywania problemu szumu kwantyzacji sygnał nawet mimo ograniczenia dynamiki nie powinien być raczej wzbogacany ditheringiem. Teoria jednak nie musi się, jak mniemam, przekładać na praktykę.

Przejdźmy zatem do analizy artykułu przytoczonego na początku poprzedniej części (http://www.audiorecording.me/dithering-and-sample-rate-conversion-before-mp3-encoding-complete-study.html).

Do testów użyto jednego z kodeków Lame, które oparte są o standard dostępny na licencji open-source. Niestety nie podano która wersja kodeka została użyta. Jeśli wierzyć Bobowi Katzowi – kodeki mp3  wykonują wewnętrzne obliczenia w rozdzielczości 32bit floating-point.

Jako platform dla kodeka Lame użyto Reapera oraz Voxengo R8brain Free (niestety – znów wersje oprogramowania nie zostały podane). Możemy się tylko domyślać rozdzielczości, w jakich oba pracują: Reaper (v. 4) 64bit floatpoint z sygnałem wejściowym 16/ 24/ 32 bit fixed przy rozdzielczości od 44,1 do 192 kHz.
Podobnie – Voxengo R8brain (v. 1.9). I znowu – mając jedynie informację na temat użytego oprogramowania (Adobe Audition 1.5) możemy w zasadzie powiedzieć jedynie, że widzimy jakieś różnice, natomiast nie sposób określić ich rozmiaru. Wynika to z braku informacji na temat algorytmiki użytej do stworzenia wykresów, wybranych parametrów, oraz skali.
Skazani więc jesteśmy na zgadywanie.

Sygnałem źródłowym jest plik wav (24 bit, 96kHz) zawierający przebieg sinusoidalny.

sweep-24

Powyższy skrin przedstawia głośność przebiegu (ustawienia spektrometru: block 8192, channel L+R, Refresh 60 ms, Av. 1, scale log.) – niestety, również Ableton nie podaje informacji o algorytmie stosowanym do analizy. No cóż…

Przejdźmy do metdologii testów.

1. Sygnał wejściowy został od razu przekonwertowany w środowisku Reaper’a z użyciem kodeka Lame.

2. Sygnał poddany jest konwersji częstotliwości próbkowania (Voxengo) do 44,1 kHz, a następnie downsamplingowi z dodaniem dithera (Reaper). Rezultat: wav 16 bit 44,1 kHz +dither, przechodzi przez kodek Lame (Reaper).

3. Sygnał poddany jest zarówno konwersji, jak i downsamplingowi wraz ditheringiem w jednym środowisku (Voxengo). Rezultat w postaci wav 16 bit 44,1 kHz +dither zostaje przekonwertowany kodekiem Lame (Reaper).

4. Sygnał poddany jest całkowitej konwersji w środowisku Voxengo: najpierw zmiana częstotliwości próbkowania do 44,1 kHz, potem od razu kompresja przy użyciu kodeka Lame.

Chwila przerwy i kilka uwag.

  • Nie mamy dokładnej informacji co do parametrów wybranych dla kodeka (jeden z nich: rozdzielczość wyjściowa pliku mp3 – 320 kb/s, wspomniany jest tylko w analizie drugiego przypadku; nie wiemy jednak nic więcej).
  • Warto pamiętać, iż skuteczność kompresji stratnej bazuje przede wszystkim na wykorzystaniu zjawisk psychoakustycznych, w związku z czym sprawdzanie jej skuteczności na tak czystym sygnale nie jest znowuż tak miarodajne, jak by się mogło wydawać.
  • Zarówno dobór analizowanych przykładów, jak i wykorzystanie różnego oprogramowania może w dodatkowy sposób wpłynąć na wyniki, chodzi tu zwłaszcza o dithering – nie wiemy, jaki typ szumu został wybrany.
    Wiemy natomiast, że wybór w obu przypadkach kompletnie nie miał sensu (2 i 3), jeśli porównywana była skuteczność kodeka w obu środowiskach. Jeżeli testowana miała być skuteczność algorytmiki ditheringu, to bez sensu z kolei dodano do testów kompresję stratną.
    Gdyby przedmiotem analizy był z kolei wpływ ditheringu na jakość skompresowanego sygnału, to istotniejszy od software’u byłby typ ditheringu (rect, triang, power-r, no dither).

Koniec przerwy. Czas na wyłapywanie błędów.

Test flow #1.
Zgodnie z przytoczoną wcześniej teorią sygnał wejściowy kompresji mp3 to 44,1 lub 48 kHz. Oznacza to, iż to nie Lame, ale raczej Reaper dokonuje konwersji sygnału z 96 kHz na 48 kHz.
Co równie istotne – wydaje się, iż downsampling z 24 bit do 16 w ogóle nie zachodzi. Zamiast tego kodek Lame przeprowadza prawdopodobnie operację na sygnale o parametrach 24 bit/ 48 kHz.

Test flow #2
Niewielka, ale jednak – nieścisłość. Dithering jest z założenia ostatnim procesem w toku resamplingu. Sygnał najpierw zostaje zaokrąglony, potem słowo bitowe ulega skróceniu i dopiero na końcu na błędy kwantyzacji w najmłodszym bicie słowa nakładany jest szum maskujący (dither).
Taka jest przyjęta kolejność w procesie masteringu i nie ma zasadniczo powodów, by wierzyć, iż w procedurach implementowanych w oprogramowaniu jest inaczej.

Druga nieścisłość warta omówienia jest już poważnym błędem. Zakres częstotliwościowy i dynamiczny, w jakim osadzany jest dither, nie jest bynajmniej kluczowy dla dźwięku – nie w sposób sugerowany w przytaczanym tekście. Kluczowym może go najwyżej uczynić kompresja stratna, w której przypadku szum tła staje się integralną częścią przetwarzanego sygnału, zatem nie podlega raczej usunięciu.

Test flow #3.
Kolejna nieścisłość to porównanie algorytmiki ditheru między Reaperem, a R8Brain, bo do tego w sumie sprowadza się zestawienie testów #2 i #3.

Różne funkcje obu programów powodują różny dobór rozwiązań dla tych samych funkcjonalności. Na co wyraźnie wskazuje opis ze strony Voxengo. Jakość stosowanego w R8Brain ditheringu pozostaje więc kwestią niewartą dyskusji.

Voxengo nie podaje specyfikacji dla darmowej wersji R8brain (diagram wskazuje na biały szum prostokątny – RPDF), natomiast wersja Pro wykorzystuje tzw. flat dithering, czyli niechybnie biały szum trójkątny (TPDF). Również Cockos (twórca Reapera) przemilcza w dokumentacji kwestie dostępnych typów ditheringu.
Przyznam, iż mógłbym specjalnie zainstalować Reapera tylko po to, żeby osobiście to sprawdzić, tylko, że…

Test flow #4.
I kolejna nieścisłość. Tym razem jest nią rozdzielczość wyjściowego pliku mp3. Nie jest to bynajmniej 16 bit / 44,1 kHz – w takim przypadku bowiem zamiast 320 kb/s mielibyśmy do czynienia ze strumieniem o jakości 1411 kb/s (sygnał nieskompresowany, bądź skompresowany bezstratnie). W tym momencie dochodzimy do apogeum:

It is amazing to know that there is no significant dithering noise (unlike in previous tests).

To prawda – całkowicie usprawiedliwioną jest radość z tego, jak świetnie radzi sobie z niezaszumionym sygnałem kodek, który z założenia nie dodaje szumów.

Uwagi co do wniosków i podsumowania.

Ad a.
Faktycznie możemy wywnioskować, iż kodek nie obsługujący konkretnej częstotliwości próbkowania będzie miał z nią istotne problemy. Równocześnie możemy jednak stwierdzić również, że i Reaper ma z tym prawdopodobnie niejaki kłopot.

Ad b.
Jest to niemal oczywiste, iż Lame świetnie sobie poradzi ditherem, który niechybnie nigdy nie został nałożony, skoro 24-bitowy dźwięk raczej go nie potrzebuje. Po raz kolejny zastanawiająca jest tylko podawana w tekście rozdzielczość kompresji stratnej…

Ad c.
Owszem zarówno dithering przeprowadzany przez Reapera, R8Brain, jak i prawdopodobnie przez każde inne urządzenie dające tę opcję, wprowadza zapewne szum głośniejszy od tego, którego nie dodaje – zdaje się – żaden kodek mp3.

Ad d.
Jeśli wierzyć opisom i informacjom, z których korzystałem w toku pisania niniejszego artykułu, ten wniosek nie ma zupełnie sensu.
Gwoli Twojej wiedzy, drogi Czytelniku źródła, z których korzystałem, to:

  • Wikipedia.org
  • Hydrogenaud.io
  • Xiph.org
  • Digido.com

oraz

  • Ableton Live 9 Manual
  • Reaper 4.76 Manual
  • Voxengo R8Brain Pro Help
  • Multimedia Signal Processing. Theory and Applications in Speech, Music and Communications; Saedd V. Vaseghi
  • Mastering Audio. The art and the science; Bob Katz

Uwagi do rekomendacji.

Ad 1.
Jak najbardziej, przy czym używanie zewnętrznych konwerterów nie jest tu istotne, chyba, że są to rozwiązania wysokiej klasy. Istotnym elementem jest wszakże wybór odpowiedniej rozdzielczości, jeśli downsampling i kompresję do mp3 wykonywane są w dwóch różnych programach.

Ad 2.
Owszem – dithering jest w zasadzie zbędny przy rozdzielczości 24 bit i większej. Natomiast, jak podejrzewam, kodeki mp3 radzą sobie z ewentualnym ditherem równie dobrze, jak grupa studentów zatrudnionych przy ręcznym usuwaniu ostatnich bitów każdego sampla.
Różnice w prędkości działania między kodekiem, a studentami byłyby prawdopodobnie zauważalne dopiero przy sygnale wejściowym o rozdzielczości 32 bit, skoro kodeki mp3 obsługują z założenia zarówno 16, jak i 24… dlaczego? Bowiem w tej sytuacji studenciaki faktycznie musiałyby kasować ostatnie osiem cyferek z każdej próbki i po ręcznym zliczeniu zaokrąglać najmłodsze bit skróconych próbek. Kto wie – może w Chinach tak właśnie się robi…
Warto w tym punkcie podkreślić jeszcze, iż kodeki mp3 nie przeprowadzają raczej wewnętrznego downsamplingu do 16 bit, skoro mogą pracować w 24.

Ad 3.
Jeśli materiał audio ma być użyty jako ścieżka w pliku AV, nie należy w ogóle brać pod uwagę kompresji stratnej. Ścieżka audio powinna zostać przygotowana według właściwej specyfikacji w najwyższej możliwej rozdzielczości formatu bezstratnego. Stosowne konwertery AV wykonają resztę pracując na sesji zawierającej zsynchronizowany z obrazem dźwięk.

Ad 3. (ten drugi).
Najlepszym wyjściem jest sprawdzenie specyfikacji używanego kodeka i przygotowywanie pliku wsadowego w najwyższej możliwej rozdzielczości bez ditheru.

Ad 4.
Jeśli już naprawdę chcemy bawić się w dithering, jest to bardzo słuszna koncepcja. Warto jednak pamiętać, że ma ona sens jedynie dla sygnału o rozdzielczości nie większej, niż 16 bit, skoro, jako się rzekło, dither z założenia miałby maskować zniekształcenia znajdujące czterokrotnie poniżej progu słyszalności.

* * *

BONUS:

W niniejszym artykule będzie nim brak pointy. W ramach pracy domowej możesz jednak, drogi Czytelniku, wspomnieć myśl przewodnią niniejszego artykułu. Jest nią – jak już dwakroć wspomniałem – praktyczny wymiar problematyki poruszonej w tekście Sprostowanie.

[]txt v.02

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s