keskiviikko 7. joulukuuta 2016

Tietokone, osa 8: Tekstiä ja kuvia

Viime kerralla rakenneltiin ohjelmia palikoista. Nyt on hyvä hetki lisätä lelulaatikkoon ääntä, kuvaa ja reaalilukuja ennen kuin sarja pääsee loppumaan. Siispä kohti kissavideoita!

Desimaaliluvut

Toistaiseksi olemme rajoittuneet käsittelyssä kokonaislukuihin. Vanhat tutut reaaliluvut ovat kuitenkin täysin mahdollisia binääriesityksenä: vaikkapa $0.5$ on binäärilukuna $0.1$. Kuten tutussa kymmenjärjestelmässäkin, vain osa reaaliluvuista voidaan esittää tarkasti — vaikkapa tuttu $0.1$ olisi binäärilukuna $0.00011001100\dots$. Koska tietokoneet käsittelevät mieluiten rajatun pituisia lukuja, tulosta täytyy pyöristää jotenkin, ja keksiä kuinka pilkku esitetään.

Onneksi ratkaisua ei tarvitse etsiä kaukaa: koulun penkiltä tuttu kymmenpotenssimuoto tulee avuksi. Esimerkiksi $0.123$ on sama kuin $123 \cdot 10^{-3}$. Koska tietokoneet tykkäävät kakkosen potensseista, kirjoitetaan se vaikkapa muodossa $126 \cdot 2^{-10}$. Nyt vain talletetaan lukupari $126$ ja $-10$. Ensimmäistä lukua kutsutaan mantissaksi ja jälkimmäistä eksponentiksi, ja kummallekin on varattu tietty määrä bittejä. Tietyt bittiesitykset on varattu erikoistilanteille, kuten äärettömyyksille ja määrittelemättömille luvuille.

Kuten edellä mainittiin, tulos on pyöristettävä mahtumaan rajattuun tilaan. Äskeisessä esimerkissä tapahtui juuri niin: $126 \cdot 2^{-10} = 0.123046875$. Luku kasvoi hiukkasen, koska se piti mahduttaa tasaluvulla kerrottuun kakkosen potenssiin. Tarkempaan arvioon olisi päästy käyttämällä vielä isompaa kerrointa pienemmän potenssin kanssa. Tietokoneissa käytetään usein 4 ja 8 tavuun mahdutettuja lukuja, joilla päästään noin 7 ja 15 merkitsevän numeron tarkkuuksiin. Varsin monelle ohjelmoijalle tulee yllätyksenä, etteivät desimaaliluvut olekaan tarkkoja!

Miljoona merkkiä

Ei tule varmaan suurena yllätyksenä, että tietokoneet käsittelevät myös tekstiä sarjana lukuja. Ennen vanhaan ei ollut yhteistä sopimusta siitä, mikä luku vastaa mitäkin merkkiä. Yleisin menetelmä oli ASCII, joka esitti tavulla 256 erikois- ja englanninkielistä merkkiä. Tämän päälle sitten rakennettiin kansallisia versioita, joissa oli ääkkösten kaltaiset merkit. Tästä tosin seurasi se, että osa merkistîstÑ nÑytti erilaiselta riippuen katsojan koneesta!

Erityisen vaikea tilanne oli Aasiassa, joissa kirjoitusjärjestelmät sisältävät tuhansia merkkejä. Lopulta 90-luvun alussa ratkaisuksi perustettiin Unicode, järjestö joka ylläpitää standardoitua rekisteriä kirjaimista. Tuoreimmassa Unicode-standardin versiossa on 128 237 merkkiä — lähes kaikki käytössä olevat kirjoitusjärjestelmät, varsin moni kuollut sellainen, sekä valtava kasa erikoismerkkejä. Perusperiaate on: jos se on joskus kirjoitettu, se otetaan mukaan. (Emoji-merkit ovat komitean työläs ja epäkiitollinen osa.)

Unicode-standardiin mahtuu hieman yli miljoona merkkiä. Tämä aiheuttaa ongelmia esitystavalle, koska yksi tavu ei riitä alkuunkaan, ja neljä tavua olisi käytännössä aina tilan haaskausta. Windows-tietokoneet käyttävät kompromissina kahta tavua, jotka voivat esiintyä parina, mutta hieman myöhemmin kehitettiin nerokas menetelmä nimeltään UTF-8. Siinä yleiset englannin kielen merkit ja välilyönnin kaltaiset erikoismerkit mahtuvat yhteen tavuun. Ääkkösten kaltaiset merkit ovat kahdessa tavussa, suurin osa kiinalaisista merkeistä menee kolmessa tavussa ja lopuille riittää neljä tavua. Ensimmäiset bitit määräävät, mistä tapauksesta on kyse.

Ääntä ja kuvaa

Ääni on aaltoliikettä, joten tehtäväksi jää tallentaa aallon muoto. Mitataan aallon "korkeus" eli äänenvoimakkuus tuhansia kertoja sekunnissa (yleinen valinta on 48 000) ja talletetaan se sarjana lukuja. Muuttamalla luvut uudestaan virran voimakkuudeksi kaiuttimessa voidaan toistaa ääni. Usein tähän käytetään 16-bittisiä lukuja, joiden tarkkuus riittää hyvin tavalliselle kuluttajalle. Äänitiedon koko voi kuitenkin muodostua ongelmaksi:

\[ 48~000~\mathrm{mittausta/sekunti} \cdot 2~\mathrm{tavua/mittaus} \approx 94~\mathrm{kilotavua/sekunti} \]

Jos tallennetaan ääni stereona, viiden minuutin kappaleen kooksi tulee noin 55 megatavua. Kuitenkin MP3-muotoisen kappaleen koko on noin kymmenesosa siitä. Temppu on pakkaus: äänitiedosta poistetaan osia, joiden puuttumista ihminen ei huomaa, jonka jälkeen tietoa pakataan vielä pienemmäksi matemaattisilla menetelmillä. Uudemmilla pakkausmuodoilla päästään vielä parempaan tarkkuuteen — MP3 on niin 90-lukua!

Kuville tehdään samalla tavoin. Kaikki värit voidaan esittää lisäämällä mustaan kolmea pääväriä: punaista, vihreää ja sinistä (valkoiselle paperille lisätään eri värejä, koska ne imevät valoa, eivät tuota sitä). Jos mitataan näiden kolmen värin osuus ja talletetaan ne taulukoksi kuvapisteitä, voidaan toistaa kuva.

Kissavideossa sitten vain yhdistetään ääni ja sarja kuvia. Oikeastaan jälkimmäinen on taas kerran yksinkertaistus: kuvat vasta isoja ovatkin. Niinpä niihin käytetään tiukkaa pakkaamista, jossa ensin tiputetaan yksityiskohtien määrää ja sitten poistetaan ylimääräistä tietoa, joka voidaan laskea muiden tietojen perusteella. Uusimmissa menetelmissä käytetään liikkeen ennustamisen kaltaisia temppuja, jolloin voidaan tallentaa vain muuttuneet osat. Aiheesta kiinnostunut löytää lisää tästä artikkelista.


Kokeiltavaksi ja pohdittavaksi

  • Ota valitsemasi kuvankäsittelyohjelma (Paint riittää) ja avaa sen värinvalintatyökalu. Tutki värien ja RGB-arvojen (Red, Green, Blue) yhteyttä. Mistä väreistä tulee keltaista?
  • Pysäytä kissavideo (tai koiravideo, tai siilivideo, tai mikä tahansa video) johonkin kohtaan ja tarkastele kuvan yksityiskohtia.
  • Miten vertailisit, ovatko kaksi desimaalilukua käytännössä yhtä suuret, kun eksakti yhtäsuuruus ei ole mahdollista?

Ei kommentteja:

Lähetä kommentti

Kommentit ovat moderoituja — yritän hyväksyä kommenttisi mahdollisimman pian. Voit kirjoittaa kommenttiin LaTeX-koodia tai yksinkertaista HTML-merkintää: lue lisää Kommentointi-sivulta.