A hang egy egyszerű hullám, a digitalizált hang pedig ennek a hullámnak a digitális reprezentációja. Ez úgy érhető el, hogy egy másodpercen belül sokszor megjegyzi az analóg jel szintjét. Például egy közönséges CD -n a jelet másodpercenként 44100-szor tárolják. Mivel a CD sztereóban működik, párhuzamosan tároljuk a bal és a jobb hangszóró jelét. Minden mintához 16 bites számokat használunk. Ezért könnyű kiszámítani, hogy egy másodpercnyi hang 2 × 2 × 44100 = 176 400 bájtot vesz igénybe.
A veszteségmentes hangtömörítés olyan átalakítások készlete, amely lehetővé teszi az audioadatok hatékony tömörítését a teljes helyreállítás lehetőségével. Mint minden veszteségmentes tömörítés, az audio adattömörítés is kihasználja az adatok bizonyos jellemzőit. Ebben az esetben ez:
A tömörítés első lépése az L és R audiocsatornák hatékonyabb ábrázolása, néhány X , Y számmal ábrázolva az alábbi algoritmus szerint:
Törtszámok esetén ez a transzformáció nem veszít információt, és egyenértékű az eredetivel. Egész számok esetén 0,5-öt veszít át, ha L és R paritása eltérő, de a paritás ellenőrzése után könnyen pótolhatjuk ezt a 0,5-öt. integer
A következő lépés az X és Y futtatása egy olyan algoritmuson keresztül, amely a lehető leghatékonyabban eltávolítja az összes felesleges információt X, Y ábrázolásában.
Ebben az esetben az egész folyamat arra irányul, hogy az X, Y tömböket a lehető legkisebb számmal ábrázoljuk, miközben a folyamat visszafordíthatósága megmarad. Ennek számos módja van. Az egyik egy transzformáció lineáris algebrával:
PX = (2 * X −1 ) − X −2
PY = (2 * Y −1 ) − Y −2
Ha X = (2, 8, 24, ?), akkor P4 = ( 2 * X 4-1 ) − X 4-2 = (2 * 24) − 8 = 40
Vagyis ha X = (2,8,24,27,25,28,21,17), akkor PX = ( 2,8,14,40 ,30,…)
Ugyanakkor érdemes megjegyezni, hogy a jó algoritmusok úgy szervezik meg a bejövő adatok feldolgozását, hogy csökkentsék a PX, PY tömbben lévő számokat.
Legyen az m szám a 0 ... 1024 tartományban. A PX tömb esetében egy sor transzformációt hajtunk végre m különböző értékeivel az alábbiak szerint:
X = (2, 8, 24, ?), majd, ill. ,
PX = (2 * X −1 ) − X −2 = (2 * 24) − 8 = 40
Ha ? = 45 és m = 512, akkor a végső érték =
Ezután ismételje meg az m értékeit , mivel a nagyobb értékek hatékonyabbak lehetnek.
Ezután, miután megkaptuk egy bizonyos m adattömböt , m növekszik vagy csökken attól függően, hogy az algoritmus utolsó kísérlete sikeres volt-e.
Különböző egyenletek használatával, és különböző szabad együtthatókhoz több lépést használva meglehetősen észrevehető adattömörítés érhető el.
Több egyenletre adunk példát, a szakirodalomból következően
P0 = 0
P1 = X -1
P2 = (2 * X -1 ) - X -2
P3 = (3 * X -1 ) - (3 * X -2 ) + X -3
A hangtömörítés lényege, hogy az adatfolyamnak megfelelő számokat a lehető legkisebb módon jelenítse meg, előzetesen eltávolítva minden adatkorrelációt. Ezt követően a kódolt adatfolyamot lemezre írhatja. Az egyik leghatékonyabb módszer a Rice kódolás .
A kisebb számok előnyösebbek, mert bináris ábrázolásuk rövidebb. Például a következő sort kell kódolnia:
10. alap: 10, 14, 15, 46
Vagy ugyanaz a sorozat bináris formában
2. alaphoz képest: 1010, 1110, 1111, 101110
Most, ha ezt egy karakterláncként akarjuk ábrázolni, ahol minden számhoz 32 bit van fenntartva (az összes lehetséges érték tartománya), akkor ez nem lesz hatékony, mivel 128 bitre lesz szükség. Van azonban egy hatékonyabb módszer is. A legjobb megoldás az lenne, ha az 1010, 1110, 1111, 101110 bináris számokat egyszerűen vessző nélkül írjuk fel, és így egy olyan számot kapunk, mint a 101011101111101110 . A probléma az, hogy miután nem lehet tudni az egyes számok határait. Általában a Rice algoritmust használják egy ilyen probléma megoldására.
A rizskódolás egy módja annak, hogy kis számokat ábrázoljunk egy sorban, miközben képesek vagyunk megkülönböztetni őket. Megjegyzés: az algoritmus hatékonyabb, minél kisebb a szám, ezért először erre kell ügyelnieA kódolás bizonyos szakaszában az adatok n számként jelennek meg . Kódolva a már kódolt számsor jobb oldalára kerül, oly módon, hogy lehetséges a fordított folyamat.
Az alapötlet az, hogy az n számot úgy ábrázoljuk , hogy 0 <= r < 2^k.Mivel a gépi nyelvben létezik egy szupergyors számforgató parancs, amely megfelel egy szám kettes hatványával való osztásának, elegendő a k=log n/log 2 értéket használni , felfelé kerekítve a legkisebb egészre. Így a k feltételei garantáltan teljesülnek az algoritmusban . A képlet alapján meg kell határozni a számot és a maradékot : . Például,
n = 46 (tizedes) = 101110 (bináris)
k = 4 (választható)
Ezután (binárisan 1110).
.
Ezután a következő séma szerint egy kódolt számot készítünk. A nullák az elsők, q darabban [00]. Ezután egy jelölőbitet [1] adunk a nullák jobb oldalán, hogy megtudjuk, mikor érnek véget a nullák. Utánuk pedig hozzáadódik a maradék r [1110], k bit hosszúsággal .
Vagyis a 46-os szám kódolt formában így néz ki: [00][1][1110] = 0011110A számot kódoló k bizonyossága miatt könnyen visszafejtheti:
(nullák száma) * 2 4 + (k bit a jelölőbit után) = 2*2 4 +14 = 46
A következő szám azonnal a következő bitnél kezdődik.
Ha az adat túl nagy k számmal van kódolva, például k=32 , akkor a metódus a szakasz elején leírt metódussá válik, ahol minden szám 32 bitnek felel meg, csak egy haszontalan jelölőbit előzi meg. Kis k esetén a nullák száma exponenciálisan növekszik - k=0 esetén . A 46-os szám ábrázolásához 46 nullára és 1 jelölőbitre van szüksége. Tekintettel arra, hogy a sorozatban a kalibrálási változások minimálisak, a legjobb megoldás a k átlagos értékével történő kódolás, például a századik szám kódolásához a k a 0 index alatti tömbben lévő számok átlagos méreteként kerül kiszámításra … 99 .
Például a leolvasások 16 bites ábrázolása esetén a 46-os számot a következő bináris kód képviseli: 0000000000101110. Átkódolás után ugyanaz a szám csak 7 számjegyből áll majd: 0011110.
Az optimális k kísérletileg is kiszámítható: például bármely k 16…128 között jól működik. Mindenesetre, ha ismert a kódolt értékek hozzávetőleges tartománya, akkor az optimális k = log n / log 2 érték .