Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Windows Phone
  • Formula aritmetičkog kodiranja. Pregled algoritama kompresije bez gubitaka

Formula aritmetičkog kodiranja. Pregled algoritama kompresije bez gubitaka

Aritmetičko kodiranje

Aritmetičko kodiranje je metoda koja omogućuje pakiranje znakova ulazne abecede bez gubitaka, pod uvjetom da je poznata frekvencijska raspodjela tih znakova. Aritmetičko kodiranje je optimalno, dostižući ograničeni teoretski omjer kompresije. Aritmetičko kodiranje - blok i izlazni kod su jedinstveni za svaku od mogućih ulaznih poruka; ne može se raščlaniti na pojedinačne znakovne kodove, za razliku od Huffmanovih kodova, koji su neblokirani, t.j. svakom slovu ulazne abecede dodijeljen je određeni izlazni kod.

Tekst komprimiran aritmetičkim koderom smatra se nekim binarnim razlomkom iz intervala ), i interval za /-ti kodirani simbol toka kao ; prije Krista]), uključujući 0,341. Tražeći sve mogući likovi prema gornjoj tablici nalazimo da je samo interval - (fti-j - li-i); bok= li!+ b ■ (bok! - li.i); ako ((lt<= value) && (value < bok)) pauza; ); DataFile.WriteSymbol(c^) ;

gdje je vrijednost broj (razlomak) pročitan iz toka, i sa - raspakirani znakovi upisani u izlazni tok. Kada koristite abecedu od 256 znakova cj Unutarnja petlja traje dugo da se završi, ali se može ubrzati. Imajte na umu da budući da b[c^ (\=a; II razdjelnik=10

Prvi_qtr - (h 0 +l)/4; // - 16384

Polovica = Prvi_qtr*2; // - 32768

Treći_qtr - Prvi_qtr*3;// = 49152

bits_to_follow=0; // Koliko bitova za resetiranje

dok (ne DataFile.EOFO) (

c = DataFile.ReadSymbol(); // Čitaj znak
j= IndexForSymbol(c); i++; // Pronađite njegov indeks
li= li.j + b*(h i. 1 - li-x+l)/razdjelnik;
bok= li!+ b;
Prvi_qtr = (h 0 +l)/4; // = 16384

Polovica = Prvi_qtr*2; // = 32768

Treći_qtr = Prvi_qtr*3; // = 49152

vrijednost=CompressedFile.Readl6Bit();

za (i=l; i< CompressedFile.DataLengthO; i++){

freq=((vrijednost-2 i . 1 +l)*delitel-l)/(h i . I - 1±. x+ 1) ;

za (j=l; b<=freq; j++); // Поиск символа

li = 1s+ blj-l]*(bi.!- li- u + l) / razdjelnik;

bok= Im+ b*(h i . 1 - li.!+ l)/razdjelnik - 1;

for(;;) ( // Opcije obrade

ako (bok< Half) // переполнения

; // Ništa drugo ifdi >= Pola) (

2i-=Polovica; hi=pola; vrijednost-= Polovica; )

inače if (di >= First_qtr)&& (bok< Third_qtr)) { 2i-= First_qtr; hi-= First_qtr; value-= First_qtr,-} else break; 2i+=2 i; hi+= hi+1;

vrijednost+=vrijednost+CompressedFile.ReadBit(); } DataFile.WriteSymbol(c););

Vježba. Navedite primjere nizova komprimiranih algoritmom s maksimalnim i minimalnim koeficijentima.

Kao što možete vidjeti, borimo se s aritmetičkim netočnostima izvodeći odvojene operacije na /, i A, sinkrono u kompresoru i dekompresoru.

Beznačajan gubitak preciznosti (djelići postotka za dovoljno veliku datoteku) i, sukladno tome, smanjenje stupnja kompresije u usporedbi s idealan algoritam nastaju tijekom operacije dijeljenja, kada se relativne frekvencije zaokružuju na cijeli broj, kada se zadnji bitovi zapisuju u datoteku. Algoritam se može ubrzati predstavljanjem relativnih frekvencija tako da djelitelj bude stepen dva (tj. zamjenom dijeljenja operacijom pomaka po bitu).

Da biste procijenili stupanj kompresije aritmetičkim algoritmom određenog niza, morate pronaći minimalni broj N, tako da bi duljina radnog intervala tijekom kompresije posljednjeg znaka niza bila manja od 1/2^.. Ovaj kriterij znači da unutar našeg intervala sigurno postoji barem jedan broj u binarni prikaz koji nakon N-ro znak će biti samo 0. Duljina intervala je lako čitljiva, budući da je jednaka umnošku vjerojatnosti svih simbola.

Razmotrimo prethodni primjer niza od dva znaka l i Kommersant s vjerojatnostima 253/256 i 3/256. Duljina posljednjeg radnog intervala za niz od 256 znakova a i b s naznačenim vjerojatnostima jednaka. Lako je izračunati da je traženi N=24 (1/2 24 = 5,96-10" 8), budući da i 23 daje dugi interval(2 puta širi), dok 25 nije minimalno broj koji zadovoljava kriterije. Gore je pokazano da Huffmanov algoritam kodira ovaj lanac u 256 bita. Odnosno, za razmatrani primjer, aritmetički algoritam daje deseterostruku prednost u odnosu na Huffman algoritam i zahtijeva manje od 0,1 bita po simbolu.

Vježba. Izračunajte omjer kompresije za niz "BOX.BOX".

Treba reći nekoliko riječi o algoritmu prilagodljive aritmetičke kompresije. Njegova je ideja ponovno izgraditi tablicu vjerojatnosti b[f] u tijeku pakiranja i raspakiranja izravno po primitku sljedećeg znaka. Takav algoritam ne zahtijeva spremanje vjerojatnosti simbola u izlaznu datoteku i, u pravilu, osigurava visok stupanj kompresije. Tako, na primjer, datoteku oblika a 1000 £ 1000 sa 1000 b/ 1000 (gdje eksponent znači broj ponavljanja danog znaka) adaptivni algoritam može komprimirati učinkovitije nego trošenje 2 bita po znaku. Gornji algoritam se jednostavno pretvara u adaptivni. Prije smo spremili tablicu raspona u datoteku, a sada izračunavamo neposredno tijekom rada kompresora i dekompresora, preračunavamo relativne frekvencije, prilagođavajući tablicu raspona u skladu s njima. Važno je da se promjene u tablici događaju u kompresoru i dekompresoru sinkrono, tj. nakon kodiranje lanci duljine 100 tablica raspona mora biti potpuno ista kao poslije dekodiranje lanci duljine 100. Ovaj uvjet je lako ispuniti ako promijenite tablicu nakon kodiranje i dekodiranje sljedećeg znaka. Za više informacija o adaptivnim algoritmima pogledajte pogl. 4.

Karakteristike aritmetičkog algoritma:

Najbolji i najgori omjer kompresije: najbolji > 8 (moguće manje bitova po znaku), najgori - 1.

Prednosti algoritma: pruža bolji stupanj kompresije od Huffmanovog algoritma-I ritma (na tipičnim podacima za 1-10%).

Karakteristike: kao i Huffmanovo kodiranje ne povećava veličinu izvornih podataka u najgorem slučaju.

Intervalno kodiranje

Za razliku od klasičnog algoritma, intervalno kodiranje pretpostavlja da imamo posla s diskretnim cjelobrojnim vrijednostima koje mogu uzeti ograničen broj vrijednosti. Kao što je već napomenuto, početni interval u cjelobrojnoj aritmetici zapisuje se kao [OD) ili , gdje N- broj moguće vrijednosti varijabla koja se koristi za pohranjivanje granica intervala.

Kako bismo najučinkovitije komprimirali podatke, moramo kodirati svaki znak s preko -log 2 (J) bita, gdje f,- frekvencija simbola s. Naravno, u praksi je takva točnost nedostižna, ali možemo za svaki lik s dodijeliti raspon vrijednosti u intervalu , Prev_freq[c], 10) ;

Proizlaziti

Normalizacija

Normalizacija

Normalizacija

Kao što je već navedeno, najčešće nema prijenosa tijekom normalizacije. Na temelju toga, Dmitry Subbotin 1 predložio je potpuno odustajanje od prijenosa. Ispostavilo se da je gubitak u kompresiji prilično beznačajan, reda veličine nekoliko bajtova. Međutim, dobitak u brzini također nije bio jako zamjetan. Glavna prednost ovog pristupa je jednostavnost i kompaktnost koda. Evo kako izgleda funkcija normalizacije za 32-bitnu aritmetiku:

♦definirajte KODOVE 24

♦definiraj VRH (l«KODEBITI)

♦definirajte DNO (VRH»8)

♦definiraj BIGBYTE(0xFF"(CODEBITS-8))

void encode_normalize(void) ( while(raspon< BOTTOM) {

if(nisko & BIGBYTE == BIGBYTE &&

raspon + (nisko & BOTTOM-1) >= BOTTOM) raspon = BOTTOM - (nisko & BOTTOM-1); izlazni_bajt(niski"24) ; rasponu<<=8; low«=8; })

Vidi se da nam pravovremeno prisilno smanjenje vrijednosti veličine intervala omogućuje izbjegavanje prijenosa. Događa se

kada je drugi najznačajniji niski bajt 0xFF, a dodavanje raspona na low uzrokuje prijenos. Ovako izgleda optimizirani postupak normalizacije:

void encode_normalize(void) ( while((niski " niski + raspon) } }

void decode_normalize(void) ( while((niski i niski+raspon) }

Vježba. Primijenite span kodiranje bez prelamanja na niz "krava krava".

LZW shema kompresije

Huffmanovo kodiranje

Grupno kodiranje

Kompresija slike

Kompresija slike temelji se na općim principima kompresije podataka. Redundantnost je eliminirana - umjesto grupe piksela iste boje pohranjuju se podaci o boji i broju ponavljanja. Također se koristi kodiranje. Ali cijena za to je nekompatibilnost formata datoteka, rizik da neki programi neće moći pročitati sliku. Postoje i samoraspakirajuće datoteke koje koriste tzv. internu kompresiju, tj. program za skeniranje ugrađen je u strukturu datoteke.

Jedna od najjednostavnijih metoda kompresije je grupno kodiranje ili grupno sažimanje. Drugi naziv je "RLE kompresija" (run-length encoding). Ideja je da se umjesto ponavljanja piksela pohranjuju podaci o boji točke i broju ponavljanja. Prezentacija podataka ima opcije: prvo može zabilježiti boju, zatim količinu ili obrnuto. To stvara probleme s reprodukcijom. Za većinu rasterskih datoteka, posebno za fotorealistične, RLE kompresija nije učinkovita, jer broj piksela koji se ponavljaju je mali. Dolazi čak i do nepotrebnog rasipanja resursa.

Huffmanovo kodiranje je opća shema kompresije. Pristup je stvoren 1952. za tekstualne datoteke. Postoji mnogo opcija. Glavna ideja je dodijeliti binarni kod svakom jedinstvenom elementu, a duljina tih kodova je različita. Za elemente koji se najčešće ponavljaju koriste se kraći kodovi. Dodjela se pohranjuje u tablicu pretraživanja, koja se učitava u program za dekodiranje prije samih kodova. Postoje različiti algoritmi za izradu kodova. Omjer kompresije se procjenjuje kao 8: 1 . Za datoteke s dugim sekvencama, Huffmanova shema ne radi baš dobro. Grupna kompresija je ovdje bolja. Jer statistika je potrebna za izradu kodova, obično se koriste 2 prolaza. Prvo se kreira statistički model, a zatim se vrši stvarna kompresija (kodiranje). Jer rad s kodovima promjenjive duljine je dugotrajan, kodiranje i dekodiranje su dugotrajni.

Metoda je dobila ime po prvim slovima imena programera: Lempel, Ziv, Welch. Razvoj 1984. Isprva je metoda bila namijenjena za hardversku implementaciju. Poput Huffmanovog algoritma, LZW algoritam ima nekoliko varijanti. Ideja je tražiti ponavljajuće uzorke piksela i kodirati ih. Tablica kodova se stvara ne prije kodiranja, već tijekom kodiranja, što algoritam čini prilagodljivim. Razmotrite slijed "ababaaacaaaad". Neka svako slovo bude kodirano na slici s 2-bitnom vrijednošću. Početna tablica kodova kodira svaki atomski objekt: a - 00, b - 01, c - 10, d - 11. Algoritam zatim nastavlja s traženjem sekvenci. Može prepoznati samo sekvence od 1 slova. Prvi slijed od 2 slova nije prepoznat i mora se kodirati. Jer duljina koda je iscrpljena, povećava se za 1: a - 000, b - 001, c - 010, d - 011, ab - 100. Prepoznata je sljedeća kombinacija od 2 slova. Svako slovo je imalo 2-bitni opis. Potrebno je 2 * 2 = 4 bita po sekvenci. Prilikom zamjene sekvence s 3-bitnim kodom, spremamo 1 bit na svako pojavljivanje niza. Tipičan omjer kompresije za metodu 3: 1 . Slike s ponavljajućim uzorcima boja komprimiraju se na 10: 1 . Skenirane fotografije i slike bez uzoraka ne komprimiraju se dobro.

Prilikom odgovora na ovo pitanje potrebno je objasniti pojam "aritmetičkog kodiranja", usporediti ga s drugim vama poznatim metodama kodiranja i reći o algoritmu za izradu aritmetičkog koda određene poruke.

Aritmetičko kodiranje jedan je od algoritama entropijske kompresije. Algoritam aritmetičkog kodiranja osigurava gotovo optimalan omjer kompresije u smislu procjene entropije Shannonovog kodiranja. Svaki lik zahtijeva gotovo H malo gdje H- informacijska entropija izvora.

Aritmetičko kodiranje je metoda koja omogućuje pakiranje znakova ulazne abecede bez gubitka, pod uvjetom da je frekvencijska raspodjela tih znakova poznata i da je najoptimalnija, jer postignuta je teorijska granica kompresijskog omjera.

Procijenjeno potrebno niz znakova, kada se komprimira metodom aritmetičkog kodiranja razmatrano poput nekih binarni razlomak iz intervala)

Vrhunski povezani članci