Paras käytettävä koodaus riippuu paljon näytteiden jakautumisesta. Olet kertonut meille, että deltat ovat enimmäkseen melko pieniä, mikä tarkoittaa, että ensimmäinen vaihe on melkein varmasti delta-koodaus (jokainen arvo muunnetaan edellisen arvon eroksi).
Toinen rajoitus on järjestelmä, jolla koodaat - olet sanonut, että se on "upotettu", mutta se kattaa melko monenlaisen kyvyn. Olet sanonut myös, että SD-kortit ovat soveltamisalan ulkopuolella ja että puskuroit vain 450 näytettä kerrallaan RAM-muistissa, mikä viittaa todellakin hyvin pieneen järjestelmään. Tällöin optimointi yksinkertaisuuden ja suorittimen / RAM-muistin säilyttämisen puolesta näyttää olevan kunnossa.
Jos yleisin delta-arvo on täsmälleen 0 - ts. eränäytteet ovat samat kuin edellisessä näytteessä - on luultavasti hyvä ensin "koodata" nämä 0 arvon arvot. (Eli vain tallentaa, kuinka monta peräkkäistä oli.)
Loput riippuvat edelleen siitä, miltä arvojen jakauma näyttää. Oletan harjoituksen vuoksi, että ne ovat melkein kaikki alueella -64 < x < 63 (eli 7-bittinen allekirjoitettu kokonaisluku). Oletan myös, että on helpointa työskennellä tavuilla eikä biteillä (mikä on todennäköisesti totta, jos kirjoitat esimerkiksi C: tä) - jos se ei ole totta, katso vastauksen alareunasta hieman viisas kaavio. Hyvin yksinkertainen tavukohtainen koodaus voi näyttää tältä:
0b0xxxxxxx
- kirjaimellinen arvo (delta), joka on esitetty 7-bittisenä allekirjoitettuna kokonaislukuna osassa "xxxxxxx". (Arvot välillä -64 - 63.)
0b10xxxxxx
- nollajoukko (deltoja), joiden pituus on "xxxxxx" (6 bittiä allekirjoittamatta voi ilmaista jopa 63, ja jos tarvitsemme lisää, voimme vain lisätä uuden merkinnän.)
0b110xxxxx 0byyyyyyyy
- kirjaimellinen arvo (delta), joka on esitetty 13-bittisenä allekirjoitettuna kokonaislukuna osassa "xxxxxyyyyyyyy".
0b11111111 0bxxxxxxxx 0byyyyyyyy
- kirjaimellinen arvo (delta), joka on esitetty 16-bittisenä allekirjoitettuna kokonaislukuna. Tämä on erittäin tehoton koodaus (ilmeisesti), koska se muuttaa 16-bittisen arvon 3-tavuiseksi esitykseksi. Se tuhlaa tarpeettomasti tilaa pitääkseen tavun kohdistettuna. Tällä järjestelmällä on merkitystä vain, jos tämän suuret deltat ovat hyvin harvinaisia. (Jokaisessa ei-triviaalisessa pakkausmenetelmässä on joitain syötteitä, joiden tuloksena saatu tulos on itse asiassa suurempi; tämä on tietoteorian lause.)
(Yllä oleva kaavio on hieman innoittanut Unicoden UTF-8-koodausta.)
Toisin kuin Huffman-koodit (mainitaan toisessa vastauksessa), oletettu arvojakauma on vahvistettu etukäteen. Tämä on hyve, koska se pitää asiat yksinkertaisina ja välttää lisäkustannusten lisäämisen jokaisen näytelohkon alkuun; se on varapuheenjohtaja, koska mukautuvampi järjestelmä ei vaadi käsin viritystä jakelulle.
Jos yleisesti paljon pienemmät kuin -64 - 63 deltat ovat, yllä olevaa parempaa tavukohtaista koodausta on käsiteltävä useampi kuin yksi näyte kerrallaan, jotta pakkaus olisi parempi kuin 2: 1 (ts. useampi kuin yksi näyte tavua kohden.)
Jos bittikoodaus on kunnossa, paljon yksinkertaisempi kuvata malli on seuraava: silti delta-koodaus ensin, sitten koodaus seuraavasti. 0 bittiä seuraa vaihtelevan pituinen positiivinen kokonaisluku, joka koodaa seurattavien nollien lukumäärän; 1 bittiä seuraa merkkibitti, sitten vaihtelevan pituinen positiivinen kokonaisluku, joka koodaa yhdessä seuraavan (delta) arvon. Vaihtelevan pituiset positiiviset kokonaisluvut voidaan koodata käyttämällä yhtä koodista osoitteesta https://fi.wikipedia.org/wiki/Universal_code_(data_compression), kuten yhtä Elias-koodeista. (Mikä koodaus on paras, riippuu jälleen tietojen jakelusta, mutta luultavasti mikä tahansa niistä onnistuu hyvin.)