Giriş
1996 yılı Aralık ayında NASA'nın Mars Pathfinder görevi, Dünya'ya ilettiği verilerle bilimsel çevrelerde büyük yankı uyandırmıştır. Ancak asıl soru şudur: Yalnızca sönük bir ampul kadar enerji harcayan bir verici kullanılarak, milyonlarca kilometre uzaklıktan verilerin hatasız aktarımı nasıl sağlanmıştır? Bu başarının arkasında, elektronik mühendisliği, bilgisayar bilimleri ve matematiğin kesişim noktasında yer alan Kodlama Kuramı yatmaktadır.
Claude Shannon tarafından 1948'de yayımlanan "A Mathematical Theory of Communication" bilişim kuramının temellerini sağlamlaştırarak bu alanın önünü açmıştır. Shannon'ın çalışmasının temel katkıları şunlardır:
Bilişim Kuramının Temeli: Alanı sağlam temellere oturtarak yaygınlaşmasını sağlamıştır.
Kanal Kapasitesi: Gürültülü kanallarda, belirli bir kapasite sınırının altında kalmak şartıyla, uygun kodlamayla güvenilir iletişim yapılabileceğini kanıtlamıştır.
Yapısal Olmayan Kanıt: Shannon'ın kanıtı, uygun kodların var olduğunu ispatlar ancak bu kodların nasıl oluşturulacağını (yapısal/constructive yöntem) tarif etmez.
Shannon'ın ortaya koyduğu bu teorik çerçevenin ardından, uygun kodlama yöntemlerinin inşasına yönelik araştırmalarla birlikte "kodlama kuramı" bir disiplin olarak doğmuştur.
Bu alandaki ilk somut adım, Richard W. Hamming'in hata düzelten kodlar (error-correcting codes) üzerine yaptığı çalışmaları yayımlamasıyla atılmıştır. Takip eden yarım yüzyılı aşkın sürede hızla gelişen kodlama kuramı, her ne kadar pratik problemlerini mühendislik uygulamalarından alsa da, çözüm süreçlerinde matematiğin rolü vazgeçilmezdir. Bu disiplinler arası doğası gereği kodlama kuramı; sadece elektronik mühendisleri ve bilgisayar bilimcilerinin değil, aynı zamanda matematikçilerin de yoğun ilgisini çeken bir araştırma alanıdır.
Kodlama Kuramının Temel Kavramları
Kodlama kuramı, gürültülü bir kanal boyunca veri aktarılması ve bu sırada bozulan iletilerin tamir edilmesi ile ilgilenmektedir. Bilginin daha kolay okunabilir hale gelmesiyle ilgilenen bu alan, daha zor okunmasını sağlamayı amaçlayan şifreleme (cryptography) ile karıştırılmamalıdır.
Burada ileti ve kanal kelimeleri ile kapsayabilecekleri en geniş anlamlar kastedilmektedir:
İletiler: Konuşma dili veya yazı olabileceği gibi resim, müzik vb. yapılar da olabilir.
Veri aktarımı: "Buradan başka bir yere iletilmesi" (yani haberleşme) olabileceği gibi "şimdiden sonraya iletilmesi" de (yani saklama da) olabilir.
Kanal: Uzay, atmosfer, telefon teli vb. bir ortam olabileceği gibi veri saklamada zaman olgusu veya verilerin saklanmasında kullanılan ortamlar da (örneğin kompakt disk yüzeyi) kanal olarak düşünülebilir.
Dikkat edilirse yukarıda örnekleri sayılan kanalların hiçbiri veri aktarımı konusunda mükemmel değildir:
Uzayda ve atmosferde oluşabilecek manyetik alanlar radyo dalgalarını bozabilmektedir.
Olumsuz hava koşulları telefon telleri üzerinden aktarılan sinyalleri bozabilmektedir.
Bir kompakt disk üzerinde bulunan çizikler ve lekeler disk üzerindeki bilgileri bozabilmektedir.
Örnekleri daha da çoğaltılabilecek bunun gibi olumsuzluklara sahip kanallara gürültülü kanal denir. Gürültülere rağmen verilerin iletiminde oluşabilecek hataların sezilmesi ve hatta düzeltilmesi, kodlama kuramının temel problemlerini oluşturmaktadır.
Simgeler ve Kodlama
Kanal, ileti, veri aktarımı, iletişim, haberleşme ve veri saklama gibi havalı kelimeler geçiyor olsa da bu kuramın kabul ettiği bir tek basit kavram vardır: simgeler. Simge ile neyi kastettiğimizi tam olarak tanımlayamayız. Simgeler ile yazılı ve sözlü (hatta mimik kullanarak) iletişim kurarız. Simge ile ne kastettiğimizi anlatmak için simgelere başvuracağımız açık olduğuna göre, simgenin anlamını sezgisel bir seviyede tutmayı tercih edeceğiz.
Kodlama kuramının ana konusu kaynak alfabe simgelerini, simgelerin başka bir sistemi (genellikle simgeleri 0 ve 1 olan ikili sistem) ile temsil etmeye dayanır. Bu temsile kodlama denir. Kodlamanın iki temel problemi aşağıdaki gibidir:
Tanım 1.1: Kaynak Kodlaması
Verimlilik esasına dayalı olarak kaynak simgelerinin asgari yapıda nasıl temsil edileceği problemidir.
Tanım 1.2: Kanal Kodlaması
Kaynak simgelerinin bir anlamda birbirlerinden uzak olacak şekilde nasıl temsil edileceği problemidir. Sonuçta ise meydana gelebilecek küçük değişikliklere (gürültüye) rağmen değişen simgelerin sezilmesi ve hatta düzeltilebilmesi mümkün olmaktadır.
Kaynak Kodlaması Örnekleri
ASCII Kodu
Kaynak kodlamalarına örnek olarak yazı karakterlerini 8 bit'e (ya da 1 byte) dönüştüren ASCII (American Standard Code for Information Interchange) kodu verilebilir. ASCII kod tablosunda karakterlerin ikili sistemde gösterimleri bulunur.
Örneğin ASCII tablosuna göre sekizli olarak "172" şeklinde kodlanan "z" karakteri bilgisayar içinde 1111010 ile temsil edilir:
$$1\mapsto 001$$ $$7\mapsto 111$$ $$2\mapsto 010$$ $$z \to 172 \to \cancel{00}1\ 111\ 010$$Yukarıda yapıldığı gibi başaki iki basamak atılırsa her karakter 7 bitlik bir dizge ile temsil edilebilir. Ancak 1 byte 8 bit olduğuna göre bu temsillere bir basamak daha eklenir. Bu basamak çoğlukla hata sezme amacıyla kullanılır. Örneğin bu basamağa, tüm dizge içindeki 1'lerin toplam sayısı çift olacak şekilde 1 veya 0 eklenebilir. Bu işleme (çift) eşlik denetimi (parity check) diyeceğiz. Örneğin çift eşlik denetim biti eklendikten sonra yukarıdaki 1111010 dizgesi 11111010 dizgesine dönüşür. Benzer şekilde 1'lerin sayısı tek olacak şekilde (tek eşlik denetimi) veya rastgele bir ekleme de yapılabilir:
$$z \to 172 \to 1111010 \to 11111010$$Mors Kodu
Kaynak kodlamasına örnek olarak bir zamanlar çok yaygın olarak kullanılan Mors kodunu da verebiliriz. Mors kodu, simgeleri ".", "_" ve boşluk olan bir üçlü koddur. Her harf bu simgelerin bir dizilimi ile temsil edilir. Tek bir harf içindeki simgeler arasına bir birim boşluk, harfler arasına üç birim boşluk ve kelimeler arasına da altı birim boşluk konulur.
Yukarıda verilen ASCII kodundan farklı olarak, Mors kodu değişken uzunluklu bir koddur. Harfler, dildeki kullanım sıklıklarına göre değerlendirilip, en sık kullanılanlar için nispeten daha kısa ve kolay dizilimlerle temsil edilir.
Basit İletişim Modeli
Kodlama kuramın, gürültülü bir kanal boyunca veri aktarılması sırasında ileti üzerinde oluşması muhtemel hataların sezilmesi ve hatta onarılması ile ilgilendiğini daha önce söylemiştik. Gürültülü bir kanalı içeren basit bir iletişim modeli şu şekilde verilebilir:
Kaynak → Kodlayıcı → [Gürültülü Kanal] → Kod Çözücü → Hedef
Örnek 1.1: Basit Kodlama Örneği
Ahmet, Mehmet, Ayşe ve Fatma isimleri için aşağıdaki gibi verilen kaynak kodlamasını düşünelim:
| İsim | Kod |
|---|---|
| Ahmet | 00 |
| Mehmet | 01 |
| Ayşe | 10 |
| Fatma | 11 |
Diyelim ki gürültülü bir kanal üzerinden 00 olarak kodlanan "Ahmet" gönderilsin. Gönderilen ileti üzerinde bozulma olabilir ve ileti 00 yerine 10 olarak alınabilir. Bu durumda "Ahmet" olarak gönderilen ileti, alıcı tarafından "Ayşe" olarak anlaşılacaktır. Ancak, büyük olasılıkla, alıcı, aktarım sırasında bir hata oluştuğunu düşünmeyecektir. Buna göre iletişim başarısız olmuştur.
Peki bu durumda ne yapılabilir? Cevap olarak kabaca kanal kodlamasını verebiliriz. Dikkat edilirse yalnız kaynak kodlaması ile başarılı bir iletişim kurmak, özellikle karmaşık sistemler gerektiren durumlarda, oldukça zordur.
Yukarıdaki kaynak kodlamasına çift eşlik denetimini uygulayarak bir basamak daha ekleyelim:
| İsim | Yeni Kod |
|---|---|
| Ahmet | 000 |
| Mehmet | 011 |
| Ayşe | 101 |
| Fatma | 110 |
Not 1.1: Önemli
Yukarıdaki kodlamaya kıyasla iki yerine üç bit taşımak zorunda kalacağımız için, hata sezmek uğruna aktarım hızının düşmesini göze aldığımıza dikkat ediniz. Buna rağmen sadece hatanın varlığını anlayabilir, onu düzeltemeyiz. Çünkü 101 ve 110 iletilerinin de bir adet hata sonucu 100 olarak alınması mümkündür.
Hata Düzeltme
Doğrusu biraz daha ekleme yaparsak hata düzeltmek de mümkün olur. Örneğin aşağıdaki gibi bir kodlamayı ele alalım:
| İsim | Kod |
|---|---|
| Ahmet | 00000 |
| Mehmet | 01111 |
| Ayşe | 10110 |
| Fatma | 11001 |
Yine "Ahmet" kelimesi gönderilsin ve bir adet hata meydana gelsin. Örneğin 10000 iletisi alınmış olsun. Bu durumda 10000 iletisinin aslında 00000 iletisinden bir adet hata sonucu meydana geldiğini anlayabiliriz. Çünkü 10000 iletisi ile diğer kodlanmış iletiler (01111, 10110 ve 11001) arasında en az iki hata vardır.
Bu şekilde aktarım hızının biraz daha azaldığını görebiliriz. Dolayısıyla hataların sezilmesi ve hatta düzeltilmesi amacıyla yapılan bu tür eklemelerin bir sınırı olması gerektiği sonucuna varabiliriz.
Tekrarlı Kod
Hata düzeltme amacıyla yapılabilecek eklemelere basit ve genel bir örnek verelim. Kabul edelim ki kaynak kodlaması yapılmış olsun ve iletiler $k$ uzunluğundaki bit dizgelerinden oluşsun. Kodlamayı bit dizgelerini, $r \geq 1$ için, $2r + 1$ defa tekrar ederek gerçekleştireceğiz. Örneğin, 01 dizgesi, $r = 2$ için, 0101010101 dizgesi olarak kodlanacaktır. Bu yönteme tekrarlı kod denir.
Neler Öğrendik?
Kısa sınav
⚠️ Quiz cevaplamak için giriş yapmalısınız. Giriş Yap.