2024. április 19., péntek

Gyorskeresés

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

Írta: |

[ ÚJ BEJEGYZÉS ]

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

Hozzászólások

(#1) VoidXs


VoidXs
nagyúr

Egy probléma van csak ezzel, mégpedig hogy nem a fájlok hangerejét módosítod a saját bitmélységükben. Rendszerszinten minden 32 (vagy 64) bites, ráadásul lebegőpontos, így a fele hangerő rögtön nem az értékkészlet felét, hanem mindössze 0.00000002%-át veszíti el. Jobb lejátszók is ezt a módszert használják, így ha azokban piszkálod a hangot, akkor is jól bele lesz jitterezve a 24 bites rendszerkimenetbe. Ezen túl a DAC-ok nem PCM hangot adnak ki, átmegy egy interpolátoron és egy delta-szigma modulátoron, kvázi DSD lesz a vége, így a belső hangerőszabályzásuk nem jár veszteséggel.

[ Szerkesztve ]

W̘h̘̹̥̼a̝t̪̝͓̠̪ ̞͔s̼̱̣o͚̻̟un͚d̖̣̗̭̞̹ ̬ḏ̩̤͉o̹ͅe̟͚͕̺s͕̱̙ s̝̮̯͍̝̺o̰̪̲͓̦u̥̻͎n̘̳̟̗d̼ ̞̫̣̲̼̜m͚̼̳ak̪̩̻e̘̹̜?

(#2) AMDFan válasza VoidXs (#1) üzenetére


AMDFan
addikt

Nézd, ha van egy 16 bites PCM adatfolyamod, akkor azt hiába interpolálod bárhova, az 16 bites marad. Ahogy írod, a lejátszószoftverek, szerkesztők 32 vagy 64 biten tárolják az adatokat, csak ez irreleváns a DAC számára, ugyanis az max 16 bites PCM adatfolyamot fog elvárni a bemenetén. Például az audacity is 32 bit float-ban számol, de ez csak addig van így amíg az audacityn belül végzel műveleteket a zenével. Nyilván bármilyen műveletet végzel a zenével, érdemes floatban számolni egész addig ameddig lehetőséged van rá, így nagyságrendekkel kisebb hibák lesznek több művelet elvégzése után is. De amint eljutsz oda, hogy ki kell nyomni a DAC felé a PCM-et, máris csak a signed integer jöhet szóba, tehát kerekítés lesz a vége.

Az, hogy a DAC mit ad ki magából szintén irreleváns, de amúgy úgy van ahogy írtad.

(#3) VoidXs válasza AMDFan (#2) üzenetére


VoidXs
nagyúr

DAC-függő, hogy mit képes befogadni (a normálisak DSD-sek mind), de már a legolcsóbb alaplapi kártya is képes a 24 bitre, azt meg a driver mondja meg, hogy mi történik valójában. Ha van egy 16 bites forrásod, azt lényegében akárhogyan állíthatod, 24-re keverve már észre nem fogod venni, ha változik.

[ Szerkesztve ]

W̘h̘̹̥̼a̝t̪̝͓̠̪ ̞͔s̼̱̣o͚̻̟un͚d̖̣̗̭̞̹ ̬ḏ̩̤͉o̹ͅe̟͚͕̺s͕̱̙ s̝̮̯͍̝̺o̰̪̲͓̦u̥̻͎n̘̳̟̗d̼ ̞̫̣̲̼̜m͚̼̳ak̪̩̻e̘̹̜?

(#4) AMDFan válasza VoidXs (#3) üzenetére


AMDFan
addikt

A DSD DAC-ok nemrég jöttek még be a piacra, egy átlagos zenehallgató DAC-ja még PCM alapú.
Hiába képes az alaplapi kártya is 24bitre, ha a forrás PCM 16 bites. Azzal semmit sem érsz el ha felhúzod 192Khz/24 bitesre, hiszen alapból 44,1Khz-en lett mintavételezve, és 16 biten vannak tárolva az értékek.

[ Szerkesztve ]

(#6) VoidXs válasza AMDFan (#4) üzenetére


VoidXs
nagyúr

A 2008-as DAC-om DSD-s... Dehogy nem érsz el semmit a felszorzással, hozzáadsz rengeteg nullát, amivel sokáig gond nélkül oszthatod. Csak a beolvasás 16 bit, onnantól a folyamatban soha nem lesz újra 16.

W̘h̘̹̥̼a̝t̪̝͓̠̪ ̞͔s̼̱̣o͚̻̟un͚d̖̣̗̭̞̹ ̬ḏ̩̤͉o̹ͅe̟͚͕̺s͕̱̙ s̝̮̯͍̝̺o̰̪̲͓̦u̥̻͎n̘̳̟̗d̼ ̞̫̣̲̼̜m͚̼̳ak̪̩̻e̘̹̜?

(#7) AMDFan válasza VoidXs (#6) üzenetére


AMDFan
addikt

Hmm igazad van. Így csak a 16 bites hangkártyákra állja meg a helyét az írásom.

[ Szerkesztve ]

(#8) #90088192


#90088192
törölt tag

Koszi :DD

(#9) SunMount3r


SunMount3r
nagyúr

A magyar közszolgálati rádiók online stream-ke 64kbps-os, ezt hova lehet még tovább csökkenteni?!

A Bartók "hálistennek" már 96kbps-es, de ehhez is sokszor az egekbe kell tekerni a hangfalon a potit.

Ja és lassan 2018-at írunk. :D :C

Amúgy meg a cikk kezdő bekezdésére reagálva: sosem értettem, hogy a FLAC "szkeptikusok" hogyan nem hallják (legalább) a hangerő növekedést (sem) az mp3-al szemben. ?!

[ Szerkesztve ]

(#10) dabadab válasza SunMount3r (#9) üzenetére


dabadab
titán

"sosem értettem, hogy a FLAC "szkeptikusok" hogyan nem hallják (legalább) a hangerő növekedést (sem) az mp3-al szemben. ?!"

Mert nincs. Ha hangerőkülönbség van, akkor ott valami nem stimmel (más volt a forrás, pl).

DRM is theft

További hozzászólások megtekintése...
Copyright © 2000-2024 PROHARDVER Informatikai Kft.