A digitális hangerőszabályozás hatása a zenére

írta: AMDFan, 6 éve

Pár napja felmerült egy kérdés azzal kapcsolatban, hogy hogyan érdemes szabályozni az aktív hangfalak illetve úgy általában a digitális lejátszórendszerek (PC, laptop, telefon) hangerejét. Erre akkor a fórumban azt a választ adtam, hogy érdemes digitálisan a maximum hangerőt beállítani és analóg módon szabályozni a hangerőt a DAC-on, erősítőn, mivel a digitális hangerőszabályzás csökkenti a bitmélységet. Ezt akkor pontosabban nem tudtam megmagyarázni, de ígértem, hogy utánanézek. Most utánanéztem és alapvetően érdekes dolgok derültek ki számomra, a végkimenetelt illetően. De kezdjük az elejéről.

Hogyan működik a digitális hangerőszabályozás?

Bármilyen formátumú (mp3,flac,ogg,wav) zenét is játszunk le, bármilyen lejátszószoftverrel, a hangkártyánk (vagy külső hangkártya, DAC) PCM adatfolyamot fog elvárni (most a DSD-vel nagyvonalúan nem foglalkozom).
A PCM (Pulse Code Modulation) adatfolyam legismertebb konténere a WAV formátum, amit sokan tömörítetlen audioként ismernek, ami így is van. Tehát a lejátszószoftverünk egy PCM adatfolyamot fog kiküldeni az oprendszernek, ami továbbítja a hangkártyánk felé. A PCM-ről azt kell tudni, hogy a legelterjedtebb a 16 bites 44,1Khz mintavételezésű adatfolyam, ezt a CD standard. A 44,1 Khz azt jelenti, hogy minden másodpercben 44100 diszkrét ponton van mintavételezve az analóg jel, itt kap egy értéket, és ezekből az értékekből a DAC fogja visszaállítani az eredeti analóg hullámformát. Minden egyes minta amit az analóg jelből veszünk az egy 16 bites "signed integer" ami egy számot jelent −32,768 és +32,767 között. Gyakorlatilag egy ilyen digitálisan tárolt zeneszám minden egyes másodperce 44100 darab −32,768 és +32,767 közötti értékből áll, ezeket nevezzünk mintának (sample).

Ezek az értékek gyakorlatilag az adott mintavételi ponton az analóg jel amplitúdóját reprezentálják. Egy digitális audio filenak van egy úgymond fix hangereje, ezt akkor halljuk amikor maximumon (100%) vannak a szoftveres hangerőszabályzók. Amennyiben szeretnénk csökkenteni ezt a hangerőt, akkor digitálisan ez nagyon egyszerűen úgy oldható meg, hogy az adott mintát leosztjuk egy értékkel. Ha mondjuk lehúzzuk a zeneljátszó hangerő csúszkáját a felére akkor a szoftver minden mintát ami a WAV fileban van, elosztja kettővel. Itt fontos megjegyezni, hogy minden szoftverben mások az arányok, ez csak egy példa.
Tehát ha a WAV fileban ezek a minták jönnek egymás után: +16001,-3001,+14001,-4001 akkor ha ezeket elosztjuk kettővel, akkor kb 6dB-el kisebb hangerőt fogunk kapni. Hogy miért pont 6dB, arról később.

A PCM-nél lényeges, hogy csak signed integer értéket vehet fel, tehát csak egész szám lehet az érték. Ezért kerekítés van, az előbbi sorozatból lesz +8000,-1500,+7000,-2000. Igen ám, de mivan akkor ha mi ezt az erősítőn, DAC-on mégiscsak fel szeretnénk hangosítani az eredeti hangerőre, mert éppen úgy kényelmes? Akkor bizony a kerekített értékekből visszaállított analóg hullámformát fogjuk felerősíteni, ami nem ugyanaz lesz mint az eredeti volt. Ezt digitálisan egyszerű szimulálni, egyszerűen hangosítsuk vissza a sorozatot kétszeresére. Látjuk, hogy +16000,-3000,+14000,-4000 értékeket fogunk kapni, eltűnt az egyes mindegyik végéről. Végeredményben torzult az eredeti adatfolyam.

Hogyan mérjünk?

Az előbb ugye arról volt szó, hogy 16 bites signed integer értékeket tárolunk el. Ez 65536 (2 a 16.-on) különböző értéket jelent az előbb leírt tartományban. Ha elosztjuk kettővel az összes mintát, akkor látható, hogy már csak fele annyi 32768 (2 a 15.-en) értéket vehetnek fel a minták. Tehát a 16 bit helyett már csak 15ös bitmélységünk van. Ha megint elosztjuk kettővel akkor már csak 14 bit és így tovább. Így vágja a bitmélységet a digitális hangerőszabályzás.

Hogy pontosan bizonyítsam magamnak is ezt a logikát, írtam egy nagyon egyszerű kis python scriptet amivel manipulálni lehet a wav fileokat. Az eredeti és a halkított verzió közötti hangminőség különbséget a következő módszerrel lehet tesztelni. Digitálisan lehalkítjuk a wavot mondjuk 4 bittel (ez az amplitúdó 16-tal való osztását jelenti, 24dB-es halkítás), majd visszaszorozzuk 16-tal, hogy megkapjuk az eredeti hangerőt, így már nulltesztelhető lesz a két file. Nyilván miután már "levágtuk" a filet 12 bitesre és visszahangosítottuk, "papíron" 16 bites lesz, de ez egy felkonvertálás eredménye, így a 12 bites hangot fogjuk hallani. Berakom a scriptet hátha valakit érdekel:

f = open('fbks.wav','rb')
newfile = open('fbks_12bit.wav','wb')
header=f.read(44) //44 byte a header, ezt nem bántjuk
newfile.write(header)
for x in range(0, 5292000): //60 másodperc PCM, az pontosan kétszer ennyi byte
k = f.read(2)
num = int.from_bytes(k,'little',signed=True)
halfnum = int(num/16)
num = halfnum*16
num = num.to_bytes(2,'little',signed=True)
newfile.write(num)
footer=f.read(278) //278 byte footer, szintén nem bántjuk
newfile.write(footer)
newfile.close

És mindez mennyire hallható?

Hogy bárki tudja tesztelni, feltöltöttem 5 filet, amit böngészőből meg lehet hallgatni itt: [link]

Az 5 file a következő:
1. Az eredeti
2. 24dB-vel halkítva (12 bites)
3. 36dB-vel halktíva (10 bites)
4. 24dB-vel halkítva, majd felerősítve eredeti hangerőre (10 bites)
5. 36dB-vel halkítva, majd felerősítve eredeti hangerőre (12 bites)

Én megmondom őszintén, hogy vakteszten, csak a 10 bitest tudtam megkülönböztetni az eredetitől, a 12 bites felerősített hanganyagot nem tudom megkülönböztetni hallás alapján az eredeti 16 bitestől. Ez azt jelenti, hogy számomra 4 bit vágásig (-24dB halkítás) a digitális hangerőszabályzás is megteszi. Nyilván amikor ennyire le kell halkítani valamit, akkor ott inkább csak háttérzeneként szól valami, tehát abszolút elfogadható minőséget kapunk.

Természetesen végeztem nulltesztet is a hanganyagok között, az alábbi eredménnyel:

10 bit vs. 16 bit

12 bit vs. 16 bit

Akkor van értelme a 24 bites zenéknek?

Alapvetően az a legjobb tulajdonságuk, hogy büntetlenül lehet digitálisan csökkenteni a hangerejüket. Ha a 24 bitből levágunk 6 bitet, még mindig marad 18, és ezzel már nagyon durván tudtuk csökkenteni a hangerőt, ezt érdemes meghallgatni a linkelt oldalon. Alapvetően jobb hangminőséget nem fogunk kapni csak azért mert 24 bites a zene, de legalább nagyon praktikus. És miért pont 6dB-t tudunk halkítani minden bittel? Ebbe már nem mennék bele itt, az alábbiakban itt van pár link ahonnan én is informálódtam:

PCM Wiki

Bit depth Wiki

WAV PCM Format