Tuníme zvuk (PulseAudio)

Založil Roman Horník, 07. 04. 2021, 03:09:12

Předchozí téma - Další téma

Roman Horník

Nevím proč, ale jako výchozí výstupní kvalitu používá PulseAudio (PA) Stařičkou a dávno překonanou CD kvalitu (44.1kHz @ 16 bitů), která na světě existuje od roku 1982, a samozřejmě na ni za tu dobu z důvodu kompatibility nikdo nehrabal. To máme vlastně to samý s SMSkama, i když už asi nikdo mobil z 90. let nepoužívá - stále jsou (jako zpráva) složeny z až 140 bajtů textu (7b kódování, proto 160 znaků). Proto se taky jedná o jeden z vůbec nejdražších datových přenosů (při koruně pade za SMS stojí megabajt 11235Kč).
Ale zpátky k PA a jeho CD kvalitě - drtivá většina zvukovek vyrobených po roce 2000 umí vzorkovací frekvenci 48kHz a kolikrát 44.1kHz jim není nativní (dochází k převzorkování a aplikaci antialiasingovýho filtru, tj. dolní propusti, čímž trpěj vyšší frekvence útlumem). A za další, mimo pár výjimek, jako je přenos zvuku přes Bluetooth, dokážou zvukovky vyšší rozlišení (projevuje se na čistotě nižších tónů), jak 16 bitů, tj. 20, 24 i 32. Jestli tedy v případě, že neposloucháte CD, jeho rip nebo cokoliv v CD kvalitě nebo nižší, toužíte po jasnějším zvuku, decentní úpravou konfiguráku PA získáte kvalitnější zvuk velice snadno a rychle.


1) Zjistíme si něco o zvukovce a jejích možnostech

$ cat /proc/asound/card?/codec#0 | grep "Codec\|Control:\|rates\|bits"
Tím si z docela rozsáhlýho výstupu vykucháme kodek zvukovky (podle toho ji můžeme identifikovat, jestliže jich máme víc), vstupy/výstupy (jejich hodnoty se můžou lišit), seznam dostupných vzorkovaček a bitovou hloubku, neboli rozlišení/dynamickej rozsah (třeba 16 bitů má mezi maximální zápornou a kladnou amplitudou 65536 schodů, 24 bitů už 16777216, tj. jsou 256x jemnější).

Vyleze nám něco takovýho (výstup není dokonalej, ale vyznat se v něm dá):
Codec: Realtek ALC662 rev1
    rates [0x160]: 44100 48000 96000
    bits [0xe]: 16 20 24
  Control: name="Headphone Playback Volume", index=1, device=0
    rates [0x160]: 44100 48000 96000
    bits [0xe]: 16 20 24
  Control: name="Speaker+LO Playback Volume", index=0, device=0
    rates [0x160]: 44100 48000 96000
    bits [0xe]: 16 20 24
  Control: name="Headphone Playback Volume", index=0, device=0
    rates [0x160]: 44100 48000 96000
    bits [0xe]: 16 20 24
    rates [0x160]: 44100 48000 96000
    bits [0xe]: 16 20 24
  Control: name="Capture Volume", index=0, device=0
  Control: name="Capture Switch", index=0, device=0
    rates [0x160]: 44100 48000 96000
    bits [0x6]: 16 20
    rates [0x160]: 44100 48000 96000
    bits [0x6]: 16 20
  Control: name="Mic Playback Volume", index=0, device=0
  Control: name="Mic Playback Switch", index=0, device=0
  Control: name="Internal Mic Playback Volume", index=0, device=0
  Control: name="Internal Mic Playback Switch", index=0, device=0
  Control: name="Headphone Playback Switch", index=1, device=0
  Control: name="Speaker Playback Switch", index=0, device=0
  Control: name="Internal Mic Boost Volume", index=0, device=0
  Control: name="Mic Boost Volume", index=0, device=0
  Control: name="Line Out Playback Switch", index=0, device=0
  Control: name="Headphone Playback Switch", index=0, device=0
Codec: Nvidia GPU 42 HDMI/DP
    rates [0x0]:
    bits [0x0]:
    rates [0x7f0]: 32000 44100 48000 88200 96000 176400 192000
    bits [0xe]: 16 20 24
    rates [0x7f0]: 32000 44100 48000 88200 96000 176400 192000
    bits [0xe]: 16 20 24
    rates [0x7f0]: 32000 44100 48000 88200 96000 176400 192000
    bits [0xe]: 16 20 24
    rates [0x7f0]: 32000 44100 48000 88200 96000 176400 192000
    bits [0xe]: 16 20 24


Trochu jsem zklamanej, že moje zvukovka umí jen 96kHz a 24 bitů, starší uměla 192kHz a 32 bitů, ALE furt stokrát lepší jak CD kvalita. Líp je na tom HDMI, ale 192kHz chci na vstup (ne výstup), jinak rozdíl mezi 96 a 192kHz není u hudby znát.


2) Konfigurace

Takže jsme snad našli svou zvukovku a její možnosti. Jestli umí víc jak 44k1@16b, jako root si otevřete v texťáku konfigurák /etc/pulse/daemon.conf:
$ sudo nano /etc/pulse/daemon.conf
Tam si povšimněte, že je všechno zakomentovaný (# a ;). Jako základ si odkomentujeme a změníme následující položky:
default-sample-format = s24le #s16le, s24le, float32le; pravděpodobně všichni budete mít little-endian (le) stroj; big-endian má "be"
default-sample-rate = 96000 #Frekvence v Hz, použijte minimálně 48000, maximálně to, co dá, ale nad 96kHz to nemá význam
alternate-sample-rate = 88200 #Alternativní vzorkovačka. Použijte 88200


Pro ještě o něco lepší kvalitu si můžeme změnit metodu převzorkování:
resample-method = soxr-vhq #Tohle je nejkvalitnější, ale nejvíc zatěžuje CPU. Alternativně lze použít speex-float-n, kde n je číslo mezi 1-6 (slabej HW) a 9 (nejvyšší kvalita týhle metody)

No a to je všechno. Po pravdě nevím, kdy by se změny mohly projevit, jestli po uložení, nebo restartu PA/systému, ale rozdíl je fakt znát, což ostatně potvrdil i dědek Trkola na svý letitý aparatuře, přestože se mu tuze nechtělo. Holt tady je vidět, kdo má o elektrotechnice znalosti a kdo ne ;D

P. S.: To, že nastavíte 96kHz neznamená, že můžete přehrávat/zaznamenávat frekvenci až 96kHz, ale "jen" maximálně 48kHz, za to poděkujte pánům Nyquistovi, Shannonovi a Kotělnikovi.
Vlna tónu o frekvenci 48kHz bude sestávat pouze ze dvou hodnot, prakticky se bude jednat o obdélník, 24kHz bude mít 4 hodnoty, 12kHz (to už uslyšíte) osm, ale je to víc, než u 44k1, kdy bude mít v průměru pouze 1.8 hodnoty, takže pokřivenej obdélník, čili jde především o potlačení zkreslení vyšších tónů a jejich věrnější reprodukci, umožňuje-li to vstup.
Jo a když nastavíte vyšší frekvenci, než kterou zvládne hardware, tak se nic zásadního nestane, jen PA bude převzorkovávat dvakrát (jednou na vaši frekvenci a podruhý na nejvyšší frekvenci zvukovky) a bude o to víc zaměstnávat CPU - a zbytečně.

P. P. S.: Zrovna jsem prováděl měření. Vstupem byl sinusovej signál od 1Hz po 48kHz, vzorkovačka 96kHz, výstup 44k1, 48k a 96k ze zvukovky.
Verdikt: u 44k1 dochází k útlumu od 20kHz, u 48k cca od 22.5kHz, u 96k to bylo 45kHz.
Debian Sid/Experimental 64bit + Mate Desktop Environment
* CPU: Intel i5 3570
* GPU: NVIDIA GTX650 1GD5
* MB: Lenovo IH61M
* RAM: 16GiB Deutsche Demokratische Republik 3 @ 1600MHz