Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Windows telefon
  • 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ćava pakovanje znakova ulaznog alfabeta bez gubitaka, pod uslovom da je poznata distribucija frekvencija ovih 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 razložiti na pojedinačne znakovne kodove, za razliku od Huffmanovih kodova koji su neblokirani, tj. svakom slovu ulazne abecede dodijeljen je specifičan izlazni kod.

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

gdje je vrijednost broj (razlomak) pročitan iz toka, i sa - raspakovani karakteri upisani u izlazni tok. Kada koristite abecedu od 256 znakova cj Unutrašnjoj petlji je potrebno mnogo vremena da se završi, ali se može ubrzati. Imajte na umu da pošto b[c^ (\=a; II razdjelnik=10

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

Pola = Prvi_qtr*2; // - 32768

Third_qtr - First_qtr*3;// = 49152

bits_to_follow=0; // Koliko bitova za resetiranje

dok (ne DataFile.EOFO) (

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

Pola = Prvi_qtr*2; // = 32768

Third_qtr = First_qtr*3; // = 49152

value=CompressedFile.Readl6Bit();

for(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;

zdravo= Ja sam+ b*(h i . 1 - li.!+ l)/razdjelnik - 1;

for(;;) ( // Opcije obrade

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

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

2i-=Pola; hi=Half; vrijednost-= Polovina; )

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+=value+CompressedFile.ReadBit(); } DataFile.WriteSymbol(c););

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

Kao što vidite, borimo se sa netačnostima aritmetike tako što izvodimo odvojene operacije na /, i A, sinhrono u kompresoru i dekompresoru.

Beznačajan gubitak preciznosti (djelići procenta za dovoljno veliku datoteku) i, shodno tome, smanjenje stepena kompresije u odnosu na idealan algoritam nastaju tokom operacije dijeljenja, kada se relativne frekvencije zaokružuju na cijeli broj, kada se posljednji bitovi upisuju 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 stepen kompresije aritmetičkim algoritmom određenog niza, morate pronaći minimalni broj N, tako da bi dužina radnog intervala tokom kompresije posljednjeg karaktera niza bila manja od 1/2^.. Ovaj kriterij znači da unutar našeg intervala sigurno postoji barem jedan broj u binarno predstavljanje koji posle N-ro znak će biti samo 0. Dužina intervala je lako čitljiva, pošto je jednaka proizvodu vjerovatnoća svih simbola.

Razmotrimo raniji primjer niza od dva znaka l i Kommersant sa vjerovatnoćama 253/256 i 3/256. Dužina posljednjeg radnog intervala za niz od 256 znakova a i b sa naznačenim verovatnoćama jednaka. Lako je izračunati da je potrebno N=24 (1/2 24 = 5,96-10" 8), pošto 23 daje i dug interval(2x širi) dok 25 nije minimalno broj koji ispunjava kriterijume. Gore je pokazano da Hafmanov algoritam kodira ovaj lanac u 256 bita. To jest, za razmatrani primjer, aritmetički algoritam daje desetostruku prednost u odnosu na Huffman algoritam i zahtijeva manje od 0,1 bita po simbolu.

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

Treba reći nekoliko riječi o algoritmu adaptivne aritmetičke kompresije. Njegova ideja je da ponovo izgradi tabelu verovatnoće b[f] u toku pakovanja i raspakivanja direktno po prijemu sledećeg karaktera. Takav algoritam ne zahtijeva pohranjivanje vrijednosti vjerojatnosti simbola u izlaznoj datoteci i, u pravilu, daje visok stupanj kompresije. Tako, na primjer, datoteku oblika a 1000 £ 1000 sa 1000 b/1000 (gdje eksponent znači broj ponavljanja datog znaka) adaptivni algoritam može efikasnije komprimirati nego trošenje 2 bita po karakteru. Gornji algoritam se jednostavno pretvara u adaptivni algoritam. Ranije smo tabelu opsega snimili u datoteku, a sada računamo tačno u toku rada kompresora i dekompresora, preračunavamo relativne frekvencije, prilagođavajući tabelu opsega u skladu sa njima. Važno je da se promene u tabeli dešavaju u kompresoru i dekompresoru sinhrono, tj. kodiranje lanci dužine 100 tabela raspona mora biti potpuno ista kao i poslije dekodiranje lanci dužine 100. Ovaj uslov je lako ispuniti ako promenite tabelu poslije kodiranje i dekodiranje sljedećeg znaka. Za više informacija o adaptivnim algoritmima, pogledajte pogl. četiri.

Karakteristike aritmetičkog algoritma:

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

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

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

Intervalno kodiranje

Za razliku od klasičnog algoritma, intervalno kodiranje pretpostavlja da imamo posla s diskretnim cijelim brojevima koji 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.

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

Rezultat

Normalizacija

Normalizacija

Normalizacija

Kao što je već napomenuto, najčešće nema prijenosa tokom normalizacije. Na osnovu toga, Dmitrij Subbotin 1 predložio je da se u potpunosti odustane od transfera. Ispostavilo se da je gubitak u kompresiji prilično beznačajan, reda veličine nekoliko bajtova. Međutim, porast u brzini također nije bio previše primjetan. 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(opseg< BOTTOM) {

if(nisko & BIGBYTE == BIGBYTE &&

raspon + (nisko & BOTTOM-1) >= BOTTOM) raspon = BOTTOM - (nisko & BOTTOM-1); output_byte(low"24) ; domet<<=8; low«=8; })

Može se vidjeti da nam pravovremeno prisilno smanjenje vrijednosti veličine intervala omogućava izbjegavanje prijenosa. Dešava se

kada je drugi najznačajniji niski bajt postavljen na 0xFF, a dodavanje raspona low-u rezultira prijenosom. Ovako izgleda optimizirana procedura normalizacije:

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

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

Vježbajte. Primijenite span kodiranje bez premotavanja na niz "krava krava".

LZW shema kompresije

Huffman kodiranje

Grupno kodiranje

Kompresija slike

Kompresija slike se zasniva na opštim principima kompresije podataka. Redundantnost je eliminisana - umjesto grupe piksela iste boje, pohranjuju se podaci o boji i broju ponavljanja. Kodiranje se također koristi. Ali cijena za to je nekompatibilnost formata datoteka, rizik da neki programi neće moći pročitati sliku. Postoje i samoraspakujući fajlovi koji koriste takozvanu internu kompresiju, tj. program za skeniranje je ugrađen u strukturu datoteke.

Jedna od najjednostavnijih metoda kompresije je grupno kodiranje ili grupna kompresija. Drugi naziv je "RLE kompresija" (run-length encoding). Ideja je da se umjesto ponavljanja piksela pohranjuju podaci o boji tačke i broju ponavljanja. Prezentacija podataka ima opcije: prvo može zabilježiti boju, zatim količinu ili obrnuto. Ovo stvara probleme sa reprodukcijom. Za većinu rasterskih datoteka, posebno za fotorealistične, RLE kompresija nije efikasna, jer broj piksela koji se ponavljaju je mali. Postoji čak i nepotrebno trošenje resursa.

Huffmanovo kodiranje je opća šema kompresije. Pristup je kreiran 1952. za tekstualne datoteke. Postoji mnogo opcija. Glavna ideja je da se svakom jedinstvenom elementu dodeli binarni kod, a dužina ovih kodova je različita. Za elemente koji se najčešće ponavljaju koriste se kraći kodovi. Dodjela se pohranjuje u tabeli za pretraživanje, 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 sa dugim sekvencama, Huffmanova šema ne radi baš dobro. Grupna kompresija je ovdje bolja. Jer statistika je potrebna za pravljenje kodova, obično se koriste 2 prolaza. Prvo se kreira statistički model, a zatim se vrši stvarna kompresija (kodiranje). Jer rad sa kodovima promjenjive dužine je dugotrajan, kodiranje i dekodiranje su dugotrajni.

Metoda je dobila ime po prvim slovima imena programera: Lempel, Ziv, Welch. Razvoj 1984. U početku je metoda bila namijenjena za hardversku implementaciju. Kao i Huffman algoritam, LZW algoritam ima nekoliko varijanti. Ideja je da se traže uzorci piksela koji se ponavljaju i da se kodiraju. Tabela kodova se kreira ne prije kodiranja, već tokom kodiranja, što algoritam čini prilagodljivim. Razmotrite sekvencu "ababaaacaaaad". Neka svako slovo bude kodirano u slici sa 2-bitnom vrijednošću. Početna tablica kodova kodira svaki atomski objekt: a - 00, b - 01, c - 10, d - 11. Algoritam zatim nastavlja sa traženjem sekvenci. Može prepoznati samo sekvence od 1 slova. Prvi niz od 2 slova nije prepoznat i mora biti kodiran. Jer dužina koda je iscrpljena, povećava se za 1: a - 000, b - 001, c - 010, d - 011, ab - 100. Sljedeća kombinacija od 2 slova je prepoznata. Svako slovo je imalo 2-bitni opis. Potrebno je 2 * 2 = 4 bita po sekvenci. Prilikom zamjene sekvence sa 3-bitnim kodom, štedimo 1 bit pri svakom pojavljivanju niza. Tipičan omjer kompresije za metodu 3: 1 . Slike s ponavljajućim uzorcima boja se komprimiraju na 10: 1 . Skenirane fotografije i slike bez uzoraka se ne komprimiraju dobro.

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

Aritmetičko kodiranje je jedan od algoritama entropijske kompresije. Algoritam aritmetičkog kodiranja daje skoro optimalan omjer kompresije u smislu procjene entropije Šenonovog kodiranja. Svaki lik zahtijeva skoro H malo gde H- informaciona entropija izvora.

Aritmetičko kodiranje je metoda koja vam omogućava da upakujete znakove ulazne abecede bez gubitka, pod uslovom da je frekvencijska raspodjela ovih znakova poznata i da je najoptimalnija, jer teorijska granica omjera kompresije je dostignuta.

Procijenjeno potrebno niz znakova, kada se komprimuje metodom aritmetičkog kodiranja razmatrano kao neki binarni razlomak iz intervala)

Top Related Articles