Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Windows Phone
  • Codificarea aritmetică a unei formule. O prezentare generală a algoritmilor de compresie fără pierderi

Codificarea aritmetică a unei formule. O prezentare generală a algoritmilor de compresie fără pierderi

Codare aritmetică

Codarea aritmetică este o tehnică de împachetare fără pierderi a caracterelor alfabetului de intrare, cu condiția ca distribuția de frecvență a acestor caractere să fie cunoscută. Codarea aritmetică este optimă, atingând limita teoretică a raportului de compresie. Codare aritmetică - codul de bloc și de ieșire este unic pentru fiecare dintre mesajele de intrare posibile; nu poate fi defalcat în coduri individuale de caractere, spre deosebire de codurile Huffman, care nu sunt blocate, adică fiecare literă a alfabetului de intrare este asociată cu un anumit cod de ieșire.

Textul comprimat de codificatorul aritmetic este considerat ca o fracție binară din interval),și intervalul pentru simbolul i-lea de flux codificat ca; B [c]), inclusiv 0,341. Enumerând toate simboluri posibile conform tabelului de mai sus, constatăm că doar intervalul este (fti-j - li-i); Salut= li.!+ b ■ (hi.! - li.i); dacă ((l t<= value) && (value < Salut)) pauză; ); DataFile.WriteSymbol (c ^);

unde valoare este numărul (fracția) citit din flux și Cu - caractere despachetate scrise în fluxul de ieșire. Când utilizați un alfabet de 256 de caractere Cj bucla interioară durează mult timp, dar o puteți accelera. Rețineți că din moment ce B [c ^ (\ = a; II delitel = 10

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

Jumătate = First_qtr * 2; // - 32768

Third_qtr - First_qtr * 3; // = 49152

bits_to_follow = 0; // Câți biți să ștergeți

în timp ce (nu DataFile.EOFO) (

c = DataFile.ReadSymbol (); // Citiți simbolul
j= IndexForSymbol (s); i ++; // Găsește-i indexul
li= li.j + b * (h i. 1 - li-x+ l) / delitel;
Salut= li.!+ b;
First_qtr = (h 0 + l) / 4; // = 16384

Jumătate = First_qtr * 2; // = 32768

Third_qtr = First_qtr * 3; // = 49152

valoare = CompressedFile.Readl6Bit ();

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

frecvență = ((valoare-2 i. 1 + l) * delitel-l) / (h i. I - 1 ±. X+ 1) ;

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

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

Salut= Sunt+ b * (h i. 1 - li.!+ l) / delitel - 1;

pentru (;;) (// Opțiuni de procesare

dacă (bună< Half) // переполнения

; // Nimic altceva ifdi> = Jumătate) (

2i- = Jumătate; hi- = Jumătate; valoare- = Jumătate; )

altfel dacă (di> = First_qtr) && (hi< Third_qtr)) { 2i-= First_qtr; hi-= First_qtr; value-= First_qtr,-} else break; 2i+=2 i; hi+= hi+1;

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

Exercitiul. Sugerați exemple de secvențe comprimate de algoritm cu coeficienții maxim și minim.

După cum puteți vedea, ne luptăm cu inexactitățile aritmetice prin efectuarea de operații separate pe / și A, sincron în compresor și decompresor.

Pierderea nesemnificativă a preciziei (fracții de procent pentru un fișier suficient de mare) și, în consecință, o scădere a raportului de compresie în comparație cu algoritm perfect apar în timpul operației de divizare, când frecvențele relative sunt rotunjite la cel mai apropiat număr întreg, când ultimii biți sunt scrieți în fișier. Algoritmul poate fi accelerat prin reprezentarea frecvențelor relative, astfel încât divizorul să fie o putere de doi (adică, înlocuirea diviziunii cu o operație de deplasare pe biți).

Pentru a estima raportul de compresie prin algoritmul aritmetic al unui anumit șir, trebuie să găsiți numărul minim N, astfel încât lungimea intervalului de lucru la comprimarea ultimului caracter al lanțului ar fi mai mică de 1/2 ^ .. Acest criteriu înseamnă că în intervalul nostru există cu siguranță cel puțin un număr în reprezentare binară care după N-ro vor fi doar semne 0. Lungimea intervalului este ușor de citit, deoarece este egală cu produsul probabilităților tuturor simbolurilor.

Luați în considerare exemplul anterior al unui șir de două caractere l și B cu probabilităţi 253/256 şi 3/256. Lungimea ultimului interval de lucru pentru un șir de 256 de caractere Ași B cu probabilitățile indicate egale. Este ușor de calculat că necesarul N = 24 (1/2 24 = 5,96-10 "8), deoarece 23 oferă și interval mare(de 2 ori mai lat) și 25 nu este minim un număr care îndeplinește criteriul. S-a arătat mai sus că algoritmul Huffman codifică acest șir pe 256 de biți. Adică, pentru exemplul considerat, algoritmul aritmetic oferă un avantaj de zece ori față de algoritmul Huffman și necesită mai puțin de 0,1 biți pe caracter.

Exercitiul. Calculați estimarea raportului de compresie pentru linia "COV.KOROBA".

Ar trebui spuse câteva cuvinte despre algoritmul de compresie aritmetică adaptivă. Ideea sa este de a reconstrui tabelul de probabilitate b [f]în timpul împachetarii și despachetarea imediat după primirea următorului caracter. Un astfel de algoritm nu necesită stocarea valorilor probabilităților caracterelor în fișierul de ieșire și, de regulă, oferă un raport de compresie ridicat. Deci, de exemplu, un fișier precum un 1000 £ 1000 cu 1000 b / 1000 (unde gradul înseamnă numărul de repetări ale unui anumit caracter), algoritmul adaptiv va putea să se comprima mai eficient decât cheltuind 2 biți pe caracter. Algoritmul de mai sus se transformă pur și simplu într-unul adaptiv. Anterior, am salvat tabelul intervalelor într-un fișier, iar acum calculăm chiar în cursul compresorului și decompresorului, recalculăm frecvențele relative, ajustând tabelul intervalului în conformitate cu acestea. Este important ca modificările din tabel să aibă loc în compresor și decompresor în mod sincron, adică, de exemplu, după codificare lanțuri de lungime 100 tabelul de gamă ar trebui să fie exact același ca după decodare lanțuri de lungime 100. Această condiție este ușor de îndeplinit dacă schimbați masa după codificarea și decodificarea următorului caracter. Pentru mai multe detalii despre algoritmii adaptivi, vezi cap. 4.

Caracteristicile algoritmului aritmetic:

Cel mai bun și cel mai rău raport de compresie: cel mai bun> 8 (este posibilă codificarea mai puțin de un bit per simbol), cel mai rău - 1.

Avantajele algoritmului: Oferă un raport de compresie mai bun decât ritmul Algo-I Huffman (pe datele tipice cu 1-10%).

Caracteristici: precum și codarea Huffman, nu crește dimensiunea datelor originale în cel mai rău caz.

Codare pe intervale

Spre deosebire de algoritmul clasic, codarea pe intervale presupune că avem de-a face cu numere întregi discrete care pot lua număr limitat valorile. După cum sa menționat deja, intervalul inițial în aritmetica întregului este scris ca [OD) sau, unde N- număr valori posibile variabilă utilizată pentru a stoca limitele intervalului.

Pentru a comprima datele cel mai eficient, trebuie să codificăm fiecare caracter s prin -log 2 (Ј) biți, unde f,- frecvența simbolului s. Desigur, în practică, o astfel de precizie este de neatins, dar putem pentru fiecare personaj s atribuiți un interval de valori într-un interval , Prev_freq [c], 10);

Rezultat

Normalizare

Normalizare

Normalizare

După cum sa menționat deja, cel mai adesea nu are loc nicio transferare în timpul normalizării. Pornind de la aceasta, Dmitry Subbotin 1 a propus să renunțe complet la transfer. S-a dovedit că pierderea în compresie este destul de nesemnificativă, de ordinul câțiva octeți. Cu toate acestea, creșterea vitezei nu a fost foarte vizibilă. Principalul avantaj al acestei abordări este simplitatea și compactitatea codului. Iată cum arată funcția de normalizare pentru aritmetica pe 32 de biți:

♦ definiți CODEBITS 24

♦ defini TOP (l "CODEBITS)

♦ definiți BOTTOM (SUS „8)

♦ definiți BIGBYTE (0xFF „(CODEBITS-8))

void encode_normalize (void) (în timp ce (interval< BOTTOM) {

dacă (low & BIGBYTE == BIGBYTE &&

interval + (jos & BOTTOM-1)> = BOTTOM) interval = BOTTOM - (jos & BOTTOM-1); octet_ieșire (scăzut „24); gamă<<=8; low«=8; })

Se poate observa că reducerea forțată în timp util a valorii mărimii intervalului ne permite să evităm transferul. S-a întâmplat

când al doilea cel mai semnificativ octet scăzut este setat la OxFF și când valoarea mărimii intervalului este adăugată la low, are loc o transferare. Aceasta este procedura de normalizare optimizată:

void encode_normalize (void) (în timp ce ((low "low + range)) } }

void decode_normalize (void) (în timp ce ((low and low + range) }

Exercitiul. Aplicați codare distanțată fără întreruperi de linie „vacă. vaca”.

Schema de compresie LZW

Codificare Huffman

Codarea grupului

Comprimarea imaginilor

Comprimarea imaginilor se bazează pe principiile generale ale compresiei datelor. Redundanța este eliminată - în loc de un grup de pixeli de aceeași culoare, sunt stocate informații despre culoare și numărul de repetări. Se folosește și codificarea. Dar prețul pentru aceasta este incompatibilitatea formatelor de fișiere, riscul ca unele programe să nu poată citi desenul. Există, de asemenea, fișiere autoextractibile care folosesc așa-numita compresie internă, adică. scanerul este încorporat în structura fișierului.

Una dintre cele mai simple metode de compresie este codificarea lotului sau compresia batch. Un alt nume este „compresie RLE” (codare run-length). Ideea este că în loc să se repete pixelii, se stochează informații despre culoarea punctului și numărul de repetări. Prezentarea datelor are opțiuni: mai întâi poate fi o înregistrare despre culoare, apoi despre cantitate, poate invers. Acest lucru creează probleme de redare. Pentru majoritatea fișierelor raster, în special pentru fișierele fotorealiste, compresia RLE este ineficientă. numărul de pixeli care se repetă este mic. Există chiar o risipă de resurse.

Codarea Huffman este o schemă generală de compresie. Abordarea a fost creată în 1952 pentru fișierele text. Există multe opțiuni. Ideea principală este de a atribui un cod binar fiecărui element unic, iar lungimea acestor coduri este diferită. Pentru elementele repetate cel mai frecvent se folosesc coduri mai scurte. Atribuțiile sunt stocate într-un tabel de căutare, care este încărcat în decodor înaintea codurilor în sine. Există diverși algoritmi pentru construirea codurilor. Raportul de compresie este estimat ca 8: 1 ... Pentru fișierele cu secvențe lungi, schema Huffman nu funcționează foarte bine. Compresia în vrac este mai bună aici. pentru că sunt necesare statistici pentru a construi coduri, de obicei se folosesc 2 treceri. Mai întâi se creează un model statistic, apoi se realizează compresia (codificarea) reală. pentru că lucrul cu coduri de lungime variabilă necesită timp, codificare și decodare consumatoare de timp.

Metoda este numită după primele litere ale numelor de familie ale dezvoltatorilor: Lempel, Ziv, Welch. Dezvoltată în 1984. La început, metoda a fost destinată implementării hardware. La fel ca algoritmul Huffman, algoritmul LZW are mai multe variații. Ideea este să găsiți modele de pixeli care se repetă și să le codificați. Tabelul de coduri nu este creat înainte de codificare, ci în timpul procesului de codificare, ceea ce face ca algoritmul să fie adaptabil. Luați în considerare secvența „ababaaacaaaad”. Lăsați fiecare literă să fie codificată în imagine cu o valoare de 2 biți. Tabelul de cod inițial codifică fiecare obiect atomic: a - 00, b - 01, c - 10, d - 11... Algoritmul continuă apoi să găsească secvențe. Poate recunoaște numai secvențe de 1 literă. Prima secvență de 2 litere nu este recunoscută și trebuie codificată. pentru că lungimea codului este epuizată, se mărește cu 1: a - 000, b - 001, c - 010, d - 011, ab - 100... Următoarea combinație de 2 litere este recunoscută. A existat o descriere pe 2 biți pentru fiecare literă. Secvența necesită 2 * 2 = 4 biți. Când înlocuim o secvență cu un cod de 3 biți, economisim 1 bit pentru fiecare apariție a secvenței. Raportul de compresie tipic pentru metodă 3: 1 ... Imaginile cu modele de culoare repetate sunt comprimate la 10: 1 ... Fotografiile scanate și imaginile care nu conțin modele nu sunt bine comprimate.

Când răspundeți la această întrebare, este necesar să explicați conceptul de „codare aritmetică”, să îl comparați cu alte metode de codare cunoscute și să spuneți despre algoritmul de construire a codului aritmetic al unui anumit mesaj.

Codarea aritmetică este unul dintre algoritmii de compresie a entropiei. Algoritmul de codare aritmetică oferă un raport de compresie aproape optim în ceea ce privește estimarea entropiei de codare Shannon. Fiecare personaj necesită aproape H cam unde H- entropia informaţională a sursei.

Codarea aritmetică este o metodă care vă permite să împachetați simbolurile alfabetului de intrare fără pierderi, cu condiția ca distribuția frecvențelor acestor simboluri să fie cunoscută și să fie cea mai optimă, deoarece se atinge limita teoretică a raportului de compresie.

Estimat necesar succesiune de caractere, când este comprimat prin metoda de codificare aritmetică este considerat Ca unii fracție binară din interval)

Top articole similare