Institutional Repository | Satya Wacana Christian University: Simulator Penyandian dan Pengawasandian pada Sistem Komunikasi Berbasis Perangkat Lunak Visual C T1 612010011 BAB II

(1)

BAB II DASAR TEORI 2.1. Huffman Code

Algoritma Huffman menggunakan prinsip penyandian yang mirip dengan kode Morse, yaitu tiap karakter (simbol) disandikan dengan rangkaian bit. Karakter yang sering muncul disandikan dengan rangkaian bit yang pendek dan karakter yang jarang muncul disandikan dengan rangkaian bit yang lebih panjang. Berdasarkan tipe peta kode yang digunakan untuk mengubah masukan menjadi sekumpulan codeword, algoritma Huffman termasuk ke dalam kelas algoritma yang menggunakan metode statik .

Metode statik adalah metode yang selalu menggunakan peta kode yang sama. Metode ini memiliki dua tahapan: tahap pertama untuk menghitung probabilitas kemunculan tiap simbol dan menentukan peta kodenya, dan tahap kedua untuk mengubah masukan menjadi kumpulan kode yang akan ditransmisikan.

Berdasarkan teknik penyandian simbol yang digunakan, algoritma Huffman menggunakan metode symbolwise. Metode symbolwise adalah metode yang menghitung probabilitas kemunculan setiap simbol dalam satu waktu, dengan simbol yang lebih sering muncul diberi kode lebih pendek dibandingkan simbol yang jarang muncul.

Prosedur pembentukan kode Huffman adalah sebagai berikut.

4. Mengurutkan simbol-simbol sumber mulai dari yang memiliki probabilitas terbesar hingga terkecil.

5. Menjumlahkan probabilitas dua simbol pada urutan terbawah (yaitu, dua simbol dengan probabilitas terkecil), dan kemudian mengurutkan kembali nilai-nilai yang dihasilkan. prosedur ini diulangi hingga hanya terdapat dua probabilitas yang dijumlahkan sampai 1.

6. Selanjutnya dilakukan penyandian, probabilitas yang terkecil pertama diberi kode '1' dan probabilitas terkecil kedua diberi kode '0'.

7. Menuliskan kode karakter dimulai dari level paling atas sampai level paling bawah.


(2)

Contoh:

Masukan: katak

Langkah pertama: menghitung probabilitasnya:

Tabel 2.1. Probalitas Masukan: “katak”.

Karakter Jumlah Probabilitas

K 2 2/5

T 1 1/5

A 2 2/5

Langkah kedua: mengurutkan probabilitas dari yang paling besar ke probabilitas yang paling kecil.

Gambar 2.1. Urutan Karakter Masukan: “katak.

Langkah ketiga: Menjumlahkan probabilitas yang terkecil dan terkecil kedua, kemudian mengurutkan probabilitasnya lagi. Kalau sama, maka hasil penjumlahan probabilitas yang terkecil dan terkecil kedua diletakkan di depan. Kemudian langkah ketiga ini diulangi sampai total probabilitasnya 1.

Gambar 2.2. Pohon Huffman Masukan: “katak”.

Langkah 4: Menuliskan kode „0‟ pada sebelah kiri dan menuliskan kode „1‟ pada sebelah kanan pada cabang.

a 2/5

k 2/5

t 1/5

kta 5/5

a 2/5 t k

3/5

t 1/5 k

2/5 a


(3)

0 1

0 1

Gambar 2.3. Pohon Huffman Masukan: “katak”.

Langkah kelima: menuliskan kode karakter dari kode paling atas sampai kode paling bawah dan akan didapat hasil seperti pada tabel 2.2 berikut..

Tabel 2.2. Hasil Penyandian Masukan: “katak”.

Karakter Code Probabilitas

K 00 2/5

T 01 1/5

A 1 2/5

Langkah keenam: menuliskan masukan dengan code. Sehingga mendapatkan hasil =00101100.

2.1.1. Rerata Informasi atau Entropi

Sistem-sistem komunikasi umumnya mentransmisikan serangkaian karakter yang berasal dari sumber informasi. Oleh sebab itu, lebih penting untuk mengetahui

t 1/5 a

2/5

k 2/5 k t

3/5

a 2/5 kta


(4)

rerata jumlah informasi yang dihasilkan oleh sebuah sumber informasi, daripada jumlah informasi yang dikandung oleh sebuah karakter tunggal. Entropi dinyatakan oleh Persamaan (2.1).

(2.1) dengan:

n = jumlah karakter;

P(xi) =probabilitas setiap kode; dan H(X) =entropi.

Misal untuk masukkan: “katak”, bisa dilihat pada Tabel 2.1

Karakter Jumlah Probabilitas

K 2 2/5

T 1 1/5

A 2 2/5

H(X) = =

=1,52192 bit per karakter.

2.1.2. Panjang Rata-Rata dan Efisiensi Kode

Panjang sebuah kode biner adalah banyaknya digit biner (bit) di dalam kode tersebut. Panjang kode rata-rata L untuk tiap karakter sumber ditentukan sebagai berikut:

(2.2) dengan:

L =panjang kode rata-rata; n = jumlah karakter;

P(xi) =probabilitas setiap kode; dan ni =jumlah bit tiap kode Huffman.

Peubah L menunjukkan jumlah bit rata-rata yang digunakan untuk merepresentasikan sebuah karakter sumber dalam penyandian sumber.


(5)

(2.3)

dengan: =efisiensi kode;

L =panjang kode rata-rata; dan H(X) =entropi.

Misalnya untuk masukan: “katak”, bisa dilihat pada Tabel 2.2 berikut.

Karakter Code Probabilitas

K 00 2/5

T 01 1/5

A 1 2/5

= 1,6 bit per karakter

Sehingga panjang kode rata-rata masukan “katak” adalah 1,6 bit per karakter.

=0,9512 bit per karakter

Sehingga efisiensi kode masukan “katak” adalah 0,9512 bit per karakter.

2.2. Arithmetic Code

Pada umumnya, algoritma kompresi data melakukan penggantian satu atau lebih karakter masukan dengan kode tertentu. Berbeda dengan cara tersebut, Arithmetic Coding menggantikan satu deretan karakter masukan dengan sebuah bilangan floating point. Keluaran arithmetic coding ini adalah satu angka yang lebih kecil dari 1 dan lebih besar atau sama dengan 0. Angka ini secara unik dapat diawasandikan sehingga menghasilkan deretan karakter yang dipakai untuk menghasilkan angka tersebut. Untuk menghasilkan angka keluaran tersebut, tiap karakter yang akan disandikan diberi satu set nilai probabilitas.

Contoh, masukan : “kata akan disandikan. Akan didapatkan tabel probabilitas berikut.

Langkah pertama: Mencari probabilitas tiap karakter


(6)

Karakter Jumlah Probabilitas

K 1 1/4

T 1 1/4

A 2 2/4

Langkah kedua: Setelah probabilitas tiap karakter diketahui. Tiap karakter akan diberikan rentang tertentu yang nilainya berkisar di antara 0 dan 1, sesuai dengan probabilitas yang ada. Dalam hal ini, penentuan rentang harus urut dari karakter masukan. Dari Tabel 2.3 di atas dibentuk Tabel 2.4 berikut:

Tabel 2.4. Rentang untuk Masukan: “kata”.

Karakter Probabilitas Rentang

K 1/4 0,00-0,25

A 2/4 0,25-0,75

T 1/4 0,75-1,00

Langkah ketiga: Membuat diagram Arithmetic

Dengan low=0 dan high=1. Low adalah batas bawah dan high adalah batas atas yang disesuaikan dengan rentang pada Tabel 2.4.

0,00 k 0,25 a 0,75 t 1

Langkah keempat: menyesuaikan urutan masukan, karena masukan “kata” maka dimulai dengan huruf k yang mempunyai rentang 0,00 sampai 0,25. Sehingga batas bawahnya =0,00 dan batas atasnya menjadi 0,25.

0,00 k 0,0625 a 0,1875 t 0,25

Rumus batas atas=(batas atas karakter – batas bawah karakter) * probabilitas karakter + batas bawah.

Dengan nilai batas atas karakter „k‟=0,25, batas bawah karakter „k‟=0,00, probabilitas karakter „k‟=0,25

Batas atas k= (0,25-0,00)*0,25+0,00 =0,25*0,25+0,00=0,0625


(7)

Sehingga didapatkan batas atas k adalah 0,0625.

Dengan batas atas karakter „a‟=0,25, batas bawah karakter „a‟=0,0625, dan probabilitas karakter „a‟=0,5

Batas atas a= (0,25-0,0625)*0,5+0,0625 =0,1875

Sehingga didapatkan batas atas a adalah 0,1875

Lakukan sampai dengan huruf a yang terakhir. Sehingga didapatkan hasil seperti pada Tabel 2.5.

Tabel 2.5. Tabel Batas untuk Masukan: “kata”.

Karakter Batas bawah Batas atas Batas atas-batas

bawah

0,00 1,00

k 0,00 0,25 1

a 0,0625 0,1875 0,25

t 0,15625 0,1875 0,125

a 0,1640625 0,1796875 0,03125

Langkah kelima: Mencari hasil penyandian dan pengawasandian

Untuk mencari hasil penyandian karakter ke-2 (huruf „a‟), dan seterusnya menggunakan rumus

Proses penyandian:

Hasil penyandian karakter pertama dapat dilihat pada Tabel 2.5 pada batas bawah karakter terakhir (huruf „a‟) seperti yang dilingkari di bawah ini.

Karakter Batas bawah Batas atas Batas atas-batas

bawah

0,00 1,00


(8)

a 0,0625 0,1875 0,25

t 0,15625 0,1875 0,125

a 0,1640625 0,1796875 0,03125

Sehingga Karakter 1 =0,1640625

Selanjutnya, membandingkan dengan Tabel 2.4. Dengan tabel ini, dapat dilihat hasil

penyandian pertama memenuhi rentang karakter „k‟ karena 0,164025 berada di antara rentang 0,00 sampai 0,25 (pada baris yang diberi anak panah).

Karakter Probabilitas Rentang

k ¼ 0,00-0,25

a 2/4 0,25-0,75

t ¼ 0,75-1,00

 probabilitas di antara 0,00 sampai 0,25 sehingga karakter pertama adalah karakter k.

Untuk karakter ke 2 dan seterusnya menggunakan Persamaan 2.4. Hasil penyandian sebelumnya=0,1640625

Batas bawah dan batas atas yang dipakai batas bawah batas atas karakter sebelumnya.

Batas bawah =0,00

Batas atas =0,25

Selanjutnya, membandingkan dengan Tabel 2.4. Dengan tabel ini, dapat dilihat hasil penyandian karakter ke-2 memenuhi rentang karakter „a‟ karena berada di antara rentang 0,25 sampai 0,75 (pada baris yang diberi anak panah).

Karakter Probabilitas Rentang

k ¼ 0,00-0,25

a 2/4 0,25-0,75

t ¼ 0,75-1,00


(9)

 probabilitas di antara 0,25 sampai 0,75 sehingga karakter ke-2 adalah karakter a Hasil penyandian sebelumnya=

Batas bawah dan batas atas yang dipakai batas bawah batas atas karakter sebelumnya.

Batas bawah =0,25

Batas atas =0,75

Selanjutnya, membandingkan dengan Tabel 2.4. Dengan tabel ini, dapat dilihat hasil penyandian karakter ke-3 memenuhi rentang karakter „t‟ karena berada di antara rentang 0,75 sampai 1,00 (pada baris yang diberi anak panah).

Karakter Probabilitas Rentang

k ¼ 0,00-0,25

a 2/4 0,25-0,75

t ¼ 0,75-1,00

 probabilitas di antara 0,75 sampai 1,00 sehingga karakter ke-3 adalah karakter t Hasil penyandian sebelumnya=

Batas bawah dan batas atas yang dipakai batas bawah batas atas karakter sebelumnya.

Batas bawah =0,75

Batas atas =0,1

Selanjutnya, membandingkan dengan Tabel 2.4. Dengan tabel ini, dapat dilihat hasil penyandian karakter ke-4 memenuhi rentang karakter „a‟ karena berada di antara rentang 0,25 sampai 0,75 (pada baris yang diberi anak panah).

Karakter Probabilitas Rentang

k ¼ 0,00-0,25


(10)

t ¼ 0,75-1,00

 probabilitas di antara 0,25 sampai 0,75 sehingga karakter ke-4 adalah karakter a Sehingga hasil setelah diawasandikan=kata.

2.3. Parity Check Code

Parity Check Code adalah penyandian menggunakan penambahan satu atau lebih bit untuk membuat total jumlah 1 bit menjadi genap (parity genap) atau gasal (parity gasal). Jika jumlah bit gasal (termasuk bit parity) berubah pada waktu pengiriman, maka bit parity menjadi tidak benar dan mengindikasikan adanya kesalahan pada saat diterima. Oleh karena itu, bit parity merupakan kode pendeteksi kesalahan (error detecting code), dan bukan merupakan kode pengoreksi kesalahan (error correcting code) karena tidak ada cara untuk menentukan bit mana yang keliru. Data harus diabaikan seluruhnya dan mengulangi lagi transmisi dari awal. Pada media transmisi yang terganggu, transmisi yang berhasil akan membutuhkan banyak waktu atau tidak berhasil sama sekali. Bit ekstra disebut parity redundant bit.

Kelemahan Parity Check Code ini adalah jumlah kesalahan bitnya harus gasal, jika tidak maka sistem tidak bisa mendeteksi error.

Contoh penggunaan parity check code ditunjukan pada Gambar 2.4. Misalnya pengiriman data biner 1100010, menggunakan parity genap

o Karena jumlah bit 1 dalam data ada 3, maka parity bit nya adalah 1, agar jumlah bit menjadi genap

o Pada penerima, jika penerima mengenali 11000101 dan menghitung jumlah total angka 1 pada data yaitu empat angka genap, maka data dideteksi benar

o Jika data telah rusak selama pengiriman dan penerima menerima 11100101, maka fungsi parity check menghitung angka 1 dan didapatkan jumlah bit 1 sebanyak 5, yang merupakan angka gasal. Penerima mengenali bahwa error telah terjadi pada data.


(11)

Gambar 2.4. Parity Check Code

 Bila sistem menggunakan parity check gasal, maka parity bit ditambahkan pada data agar jumlah bit 1-nya gasal.

2.4. Longitudinal Redundancy Check (LRC)

Longitudinal Redundancy Check (LRC) merupakan pengembangan Parity Check Code yang mempunyai kemampuan deteksi error yang lebih efisien. Pada data

Longitudinal Redundancy Check (LRC) dibagi menjadi sejumlah blok dan setiap blok mempunyai karakter pemeriksa blok (Block Check Character/BCC) yang ditambahkan di akhir blok.

Bit-bit paritas yang diletakan pada setiap karakter berfungsi sebagai LRC. Pada teknik ini, satu blok bit diatur dalam bentuk baris dan kolom. LRC menggunakan paritas genap untuk tiap kolomnya.

Jika dibandingkan Parity Check Code, LRC bisa mendeteksi junlah kesalahan tidak hanya gasal saja tetapi bisa genap. Tetapi pada LRC memiliki kelemahan juga yaitu jika jumlah kesalahannya 2 dan pada bit ke-n dan n+8, maka tidak terdeteksi error. Karena LRCnya terdeteksi sama.

Adalah jumlah total angka 1genap

1 1 0 0 0 1 0

penerima menerima data

1 1 0 0 0 1 0 1

Checking function

1 1 0 0 0 1 0 Even parity Generator

Parity

Bit


(12)

 Sebagai contoh, anggap pengirim ingin mengirim satu blok yang terdiri dari 32 bit. o Sebelum pengiriman, 32 bit diatur dalam empat baris dan delapan kolom.

o Bit-bit dibaca per kolom, lalu parity bit dihitung sesuai aturan parity check code, parity bit untuk setiap kolom tersebut membentuk baris kelima.

o Parity bit pertama dalam baris kelima dihitung berdasarkan semua bit pertama o Parity bit kedua dalam baris kelima dihitung berdasarkan semua bit kedua, dan

seterusnya.

o Pada saat pengiriman, dilampirkan baris kelima yang terdiri atas delapan parity bit pada data asli. Gambar 2.5 menunjukkan Longitudinal Redundancy Check.

Gambar 2.5. Longitudinal Redundancy Check (Data tak Terkorupsi).

o Penerima memeriksa blok LRC, 10101010 dan mengikuti aturan parity genap.

Pengirim

Penerima

LRC

Data Asli

11100111 11011101 0011001 10101001

11100111 11011101 00111001 10101001

Baris 1 Baris 2

Baris 3 Baris 4

10101010

Baris 5 LRC

11100111 11011101 0011001 10101001 10101010

11100111 11011101 0011001 10101001 10101010


(13)

 Gambar 2.6 menggambarkandata sebenarnya ditambah LRC, diterima oleh penerima ketika data terkorupsi selama pengiriman.

Gambar 2.6. Longitudinal Redundancy Check (Data Terkorupsi).

 Ketika penerima mengecek LRC, beberapa bit tidak mengikuti aturan parity genap,

2.5. Cyclic RedundancyCheck (CRC)

Cyclic Redundancy Check (CRC) adalah teknik untuk mendeteksi kesalahan dalam data digital, tetapi tidak dapat mengoreksi ketika kesalahan terdeteksi. Hal ini digunakan terutama dalam transmisi data. Penerima memeriksa bit pengecek CRC yang sama dengan yang dikirim, untuk mendeteksi terjadinya kesalahan.

Teknik ini kadang-kadang diterapkan pada perangkat penyimpanan data, seperti disk drive. Dalam situasi ini setiap blok pada disk akan memeriksa bit, dan hardware secara otomatis memulai membaca kembali dari blok ketika kesalahan terdeteksi, atau melaporkan kesalahan perangkat lunak.

CRC mempunyai kelebihan dibandingkan dengan parity check code dan LRC ,yaitu hasil koreksinya lebih akurat dan juga mempunyai bit redundant yang sedikit jika dibandingkan LRC (jika bit pembaginya kurang dari 8 bit).

Penggunaan Cyclic Redundancy Check (CRC) dijelaskan sebagai berikut.

 Data atau pesan yang diberikan sejumlah k-bit, kemudian pengirim membangkitkan suatu bagian n-bit, sehingga jumlah bit yang terkirim adalah k+ n bit

 Penerima memeriksa data (bit k+n).

 Data dibagi oleh angka yang belum ditentukan, dan jika tidak ada sisa, maka tidak terjadi error.

11100111 11011101 0011001 10101001 10101010

11100111 11011101 10001001 10100011 10101010 Pengirim


(14)

 Gambar 2.7 menunjukkan generator CRC, Gambar 2.8 menunjukkan pengecek CRC, dan Gambar 2.9 menunjukkan transmisi CRC.

Gambar 2.7. Generator CRC.

Gambar 2.8. Pengecek CRC.

Gambar 2.9. Transmisi CRC.  Berikut ini adalah ilustrasi proses yang terjadi.

o String n ”0” diberikan pada data. Jumlah n kurang 1 dari jumlah bit pada

pembagi yang belum ditentukan, yaitu bit n+1.

o Data yang baru saja diperpanjang dibagi dengan pembagi menggunakan proses

yang disebut pembagian biner. Sisa yang dihasilkan dari pembagian adalah CRC.

o CRC pada bit n berasal dari langkah ke-2 yang menggantikan 0 yang

ditambahkan pada akhir rentetan data.

o Rentetan data tiba pada penerima data pertama, diikuti oleh CRC.

Data 00 - - - - 0

Pembagi

CRC

k-bit

n+1 bit

n-bit

Data CRC

Pembagi

Sisa

Angka yang belum ditentukan

0 , menerima

Data CRC


(15)

o Penerima memperlakukan keseluruhan string sebagai sebuah kesatuan dan

membaginya dengan pembagi yang sama yang digunakan untuk menemukan sisa CRC.

o Jika string bisa sampai tanpa error, pengecek CRC menghasilkan sisa nol, jika

string telah berubah dalam pengiriman, pembagian menghasilkan sisa yang bukan nol.

 Gambar 2.10 menggambarkan cara kerja generator CRC.

o Pada langkah pertama, keempat bit pembagi (1101) mengurangi empat bit pertama yang dibagi (1001), menghasilkan 100 (0 pada sisa dikeluarkan). o Selanjutnya satu bit berikutnya dari bit yang dibagi, ditarik ke bawah untuk

membuat jumlah bit pada sisa sama dengan bit pada pembagi. o Langkah selanjutnya, 1000-1101 menghasilkan 101, dan seterusnya.

Gambar 2.10. Cara Kerja Generator CRC.

o Dalam proses ini, pembagi hanya bisa dikurangi dari sisa yang memiliki bit sisa sebagian besar adalah satu.

1 0 0 1 0 0 0 0 0 1 1 0 1

1 0 0 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0

1 1 0 0 1 1 0 1 0 0 1

Data plus ekstra 0. Angka 0 adalah angka

bit pembagi dikurangi 1

Ketika bit paling kiri dari sisa adalah 0,

harus menggunakan 0000 bukan pembagi asli

Sisa atau n- bits (CRC) 1101


(16)

o Pada saat bit sisa sebagian besar adalah 0, kita harus menggunakan 0000 bukannya pembagi asli.

o Pembatasan ini menyatakan secara tidak langsung bahwa pada beberapa langkah, pengurangan sisa sebagian besar akan menjadi 0-0 atau 1-1 yang keduanya sama-sama menghasilkan angka 0.

o Proses ini dilakukan berulang-ulang hingga pembagi yang tersisa telah digunakan. Di sini, CRC nya adalah 001.

 Gambar 2.11 menunjukkan pengecek CRC untuk generator CRC.

o Pengirim mengirim data ditambah CRC ke penerima, setelah menerima data yang ditambahkan CRC.

o Di sini, pembagi bit (1101) sama dengan generator CRC.

o Jika semua sisanya adalah 0, maka CRC dibuang dan data diterima; sesuai dengan yang dikirim.

Gambar 2.11. Cara Kerja Pengecek CRC .

Jika hasil CRCnya tidak 0 semua, maka terjadi error saat data diterima, sebaliknya jika hasil CRCnya 0 semua, maka tidak terjadi error saat data diterima.

Pembagi –1101, data plus CRC–100100001, dan hasilnya 000

Ketika bit paling kiri dari sisa adalah

0, kita harus menggunakan 0000 bukan pembagi

1101

111101 1 0 0 1 0 0 0 0 1 1 1 0 1

1 0 0 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0

1 1 0 1 1 1 0 1

0 0 0 Hasil CRC setelah dideteksi


(17)

2.6. Checksum Code

Checksum Code adalah penyandian yang sering dipakai dalam komunikasi data untuk mendeteksi error dengan cara menembahkan bit. Metode pendeteksian error yang digunakan oleh protokol-protokol dengan lapisan lebih tinggi disebut checksum. Checksum didasarkan pada konsep redundancy bit. Pengirim menggunakan generator checksum dan penerima menggunakan pengecek checksum. Generator checksum membagi kembali data menjadi segmen-segmen yang sama pada bit n, segmen-segmen ini ditambahkan bersama-sama. Segmen yang ditambahkan disebut checksum field yang ditambahkan pada akhir data asli sebagai bit redudancy. Pengirim mengirim data ditambah checksum.

Checksum Code, jika dibandingkan dengan parity check code, LRC, dan CRC, mempunyai kelebihan yaitu cara pendeteksiannya lebih sederhana dibandingkan CRC, dan hasil pendeteksiannya a juga lebih akurat dibandingkan parity check code dan LRC.  Contoh data terdiri dari 16 bit yaitu 10101001 00111001.

o Rentetan data dibagi menjadi dua segmen 8 bit, sebagai berikut : 10101001 dan 00111001.

o Kedua segmen ditambahkan sebagai berikut: 10101001

00111001

11100010 (jumlah)

o Checksum dibentuk dari komplemen hasil jumlah yaitu 00011101. o Checksum ditambahkan pada data. Pola yang terkirim adalah:

10101001 00111001 00011101

o Penerima menerima pola-pola di atas kemudian membaginya menjadi tiga bagian, dan menjumlahkan secara bersamaan, dan akan mendapatkan semua angka 1, yang dilomplemen menghasilkan semua angka 0.

o Ini menunjukkan bahwa tidak ada error dalam pengiriman. o Jika hasil tidak nol semua maka terjadi error.


(18)

10101001 (segmen data) 00111001 (segmen data)

00011101 (cek jumlah/ checksum) 11111111 (jumlah)

00000000 (komplemen)

2.7. HammingCode

Metode Hamming code merupakan salah satu metode pendeteksi error dan pengkoreksi error (error detection and error correction) yang paling sederhana. Metode ini menggunakan operasi logika XOR (Exclusive-OR) dalam proses pendeteksian error maupun pengkoreksian error. masukan dan keluaran dari metode ini berupa bilangan biner. Hamming code merupakan salah satu jenis linier error correcting code linier yang sederhana dan banyak dipergunakan pada peralatan elektronik.

Metode hamming code bekerja dengan menyisipkan beberapa check bit ke dalam data. Jumlah check bit yang disisipkan tergantung pada panjang data. Rumus untuk menghitung jumlah check bit yang akan disisipkan ke dalam data adalah: data 2n bit, c = (n+1) bit, dengan c adalah jumlah check bit yang disisipkan.

Metode koreksi error single bit yang dikembangkan oleh R.W Hamming melibatkan penciptaan codeword spesial dari data. Hamming Code menyertakan parity bit jamak dalam string bit sebelum pengiriman. Idenya adalah bahwa bit diubah, posisinya menentukan suatu kombinasi unik error parity check.


(19)

Tabel 2.6. Hubungan antara Data dan Bit Redudancy

Angka data bit

(m)

Angka bit

redundancy (r)

Jumlah angka bit

(m+r)

2rm+r+1

1 2 3 4 5 6 7 2 3 3 3 4 4 4 3 5 6 7 9 10 11

4  4 8  6 8  7 8  8 16  10 16  11 16  12

 Misalnya data terdiri dari tujuh bit ASCII, akan diperlukan empat bit redudancy yang bisa ditambahkan pada akhir unit data atau menyelingi dengan bit data asli.  Gambar 2.12 menunjukkan posisi bit redudancy pada kode Hamming.

Gambar 2.12. Posisi Bit Redudancy pada Kode Hamming

 Pada kode Hamming, setiap bit r adalah parity bit untuk satu kombinasi data bit : o r 1 adalah parity bit untuk satu kombinasi data bit, yaitu:

r 1 : bit 1, 3, 5, 7, 9, 11

o r 2 adalah parity bit untuk satu kombinasi data bit, yaitu: r 2 : bit 2, 3, 6, 7, 10, 11

m1 m2 m3 r 8 m4 m5 m6 r 4 m7 r 2 r 1

11 10 9 8 7 6 5 4 3 2 1


(20)

o r 4 adalah parity bit untuk satu kombinasi data bit, yaitu: r 4 : bit 4, 5, 6, 7

o r 8 adalah parity bit untuk satu kombinasi data bit, yaitu: r 8 : bit 8, 9, 10, 11

 Masing-masing bit data mungkin diikutsertakan dalam lebih dari satu hitungan parity.

 Di sini, r1 dihitung menggunakan semua posisi bit yang memiliki perwakilan biner

termasuk satu ”1” pada posisi paling kanan.

 Bit r2 dihitung menggunakan semua posisi bit dengan satu ”1” pada posisi kedua, dan seterusnya.


(21)

Gambar 2.13. Penghitungan Bit Redudancy.

 Gambar 2.14 menunjukkan penghitungan untuk mendapatkan kode Hamming  Dalam contoh tersebut, kesebelas bit terdiri dari 7 karakter ASCII dan 4 parity

check.

 Pertama-tama masing-masing karakter asli (7 bit) ditempatkanpada posisi yang tepat pada 11 bit.


(22)

 Langkah selanjutnya, menghitung parity genap untuk berbagai macam kombinasi bit.

 Nilai parity untuk masing-masing kombinasi adalah nilai hubungan bit r.

Gambar 2.14. Penghitungan Bit Redudancy.

 Seperti ditunjukkan oleh Gambar 2.14, untuk mendapatkan kode berjumlah 11 bit, pengirim mengirim kode berjumlah 11 bit kepada penerima melalui garis transmisi.  Sekarang misalkan pada saat pengiriman data di atas diterima, angka bit 7 telah


(23)

Gambar 2.15 Kesalahan pada Bit Tunggal.

 Gambar 2.16 memperlihatkan deteksi error dengan menggunakan kode Hamming.  Penerima menghitung kembali empat parity check baru (vertikal redudancy check)

dengan menggunakan set bit yang sama yang digunakan pengirim ditambah hubungan parity bit r untuk setiap set.

 Dari contoh dapat diketahui bit yang salah adalah posisi ketujuh, sehingga detektor langsung bisa mengoreksi bit pada posisi ketujuh yaitu 0 menjadi 1 sesuai data yang dikirimkan.

Gambar 2.16. Error Detection.

1 0 0 1 1 1 0 0 1 0 1

1 0 0 1 0 1 0 0 1 0 1

Menerima Error

Mengirim

11 10 9 8 7 6 5 4 3 2 1

1 0 0 1 0 1 0 0 1 0 1

r

11 10 9 8 7 6 5 4 3 2 1

1 0 0 1 0 1 0 0 1 0 1

r

11 10 9 8 7 6 5 4 3 2 1

1 0 0 1 0 1 0 0 1 0 1

r

11 10 9 8 7 6 5 4 3 2 1

1 0 0 1 0 1 0 0 1 0 1

r

0 1 1 1

(Bit pada posisi 7 salah) 7

( r 1 d ih it u ng den gan p engk om b inas ian b it 1

, 3, 5, 7

, 9 dan


(24)

2.8. BCH Code

Bose, Chaudhuri, and Hocquenghem (BCH) code merupakan sebuah metode error correction yang dibangun pada bidang finite (terbatas). Kode ini merupakan pengembangan dari Hamming code untuk multiple error correction. Kode BCH merupakan Cyclic codes dengan beberapa karakter tersusun dari m-bit yang berurutan, dengan m adalah bilangan bulat positif yang lebih besar dari 2. Pada binary BCH code terdapat beberapa parameter sebagai berikut:

Panjang blok : n = 2m - 1 Panjang bit informasi : k

Jumlah bit error maksimal : t

Checkbit :c= m*t

Jumlah digit parity-check : n k m*t Jarak minimal : n 2t + 1

Kode ini mampu mengoreksi sebanyak t atau lebih kecil dalam blok n digit, yang disebut kode BCH t-error-correcting. Sebuah kode BCH digambarkan dengan format pada Gambar 2.17. Sebuah kode BCH seperti Gambar 2.17 di bawah dapat dituliskan dalam bentuk BCH (n,k), contohnya BCH (15,7), berarti setiap 7 bit informasi akan dikelompokan (di-framekan) dan dikodekan secara BCH dengan panjang kode 15. Hal ini berarti terdapat 8 bit parity yang ditambahkan, untuk jelasnya dapat dilihat di Gambar 2.18.

Tambahan 8 bit ini akan diletakkan di belakang informasi. Fungsinya adalah untuk melakukan deteksi dan koreksi pada bagian penerima. Jika terdapat kesalahan pada 7 bit informasi maka bit parity-check akan dapat mengembalikan data yang rusak ke nilai awal sebelum terjadi kesalahan. Jumlah kesalahan yang dapat dikoreksi pada BCH (15,7) adalah t = 2 (n-k = mt).

Gambar 2.17. Elemen BCH Code.


(25)

2.9. Convolution Code

Terdapat dua tipe utama kode pengoreksi error yang umum yang digunakan yaitu kode blok dan kode konvensional. Dengan kode blok (n,k), bit-bit data (atau informasi) dikelompokan menjadi blok-blok sepanjang k bit , dan kemudian penyandiannya untuk membentuk kode-kode biner (atau blok-blok kode) sepanjang n bit, dengan (n-k) bit yang ditambahkan ke bit-bit data aslinya berfungsi sebagai cek paritas. Salah satu karakteristik kode blok linier adalah bahwa blok data k bit yang disandikan pada saat tertentu secara langsung menentukan kode biner n bit yang akan dihasilkan oleh penyandi.

Di sisi lain sebuah penyandi untuk kode konvolusional (n,k,m) juga menerima masukan berupa blok data k bit dan menghasilkan keluaran kode biner sebanyak n bit. Namun berbeda halnya dengan kode blok, pembentukan sebuah kode biner n bit tidak lagi hanya ditentukan oleh blok data k bit yang diumpankan ke penyandi pada titik waktu yang sama, namun juga oleh (m-1) blok data k bit yang diumpankan sebelumnya. Sehingga, karakteristik penting kode konvensional yang membedakannya dari kode blok linier adalah digunakannya memori di dalam proses penyandian. Dalam prakteknya, n maupun k adalah bilangan-bilangan bulat yang bernilai kecil dan tetap, sedangkan nilai m akan diubah-ubah nilainya untuk mengatur redundansi pada kode.

Di dalam kasus khusus dengan k=1, rangkaian bit data tidak perlu dibagi terlebih dulu menjadi blok-blok dan diolah terus-menerus secara berkesinambungan. Dalam uraian selanjutnya mengenai kode konvolusional, hanya akan dibahas kasus khusus k =1 ini.

Kode-kode konvolusional sangat praktis. Beberapa metode yang berbeda bahkan dapat digunakan untuk menjabarkan proses penyandian konvolusional, diantaranya diagram koneksi, polinom koneksi, diagram keadaan (state diagram). Diagram pohon (tree diagram), dan diagram teralis (trellis diagram). Gambar 2.19 memperlihatkan sebuah penyandi konvolusional (2,1,2) sederhana denga n =2,k=1,dan m=2. Setiap kali sebuah bit data dimasukkan ke register pertama pada penyandi, dua bit kode akan dihasikan sebagai keluaran secara berurutan.


(26)

Gambar 2.19. Penyandian Convolution Code (2,1,2).

Tabel 2.7. Penyandian Convolution Code (2,1,2).

INPUT PRESENT STATES NEXT STATES OUTPUT S1 S2 KONDISI S ’ S ’ KONDISI V1 V2

0 0 0 A 0 0 A 0 0

1 0 0 A 1 0 B 1 1

0 1 0 B 0 1 C 1 0

1 1 0 B 1 1 D 0 1

0 0 1 C 0 0 A 1 1

1 0 1 C 1 0 B 0 0

0 1 1 D 0 1 C 0 1

1 1 1 D 1 1 D 1 0


(27)

2.10 Reed Salomon Code

Kode Reed Solomon mendeskripsikan sebuah cara sistematis untuk membentuk kode yang mampu mengoreksi error yang muncul secara acak dan tak terduga (bursty) pada paket data yang diterima.

Sebuah kode Reed Solomon ditulis dalam bentuk RS(n,k) dengan n adalah panjang blok atau panjang kode yang terdiri dari susunan beberapa karakter, sedangkan k adalah panjang informasi atau jumlah karakter data yang akan dikodekan. Panjang block code ini dinyatakan oleh n = 2m-1 dengan m adalah jumlah bit per karakter sedangkan jumlah karakter parity yang harus ditambahkan untuk mengoreksi sejumlah error sebanyak n-k = 2t dengan t adalah jumlah karakter error yang mampu dikoreksi.

Penyandian Reed Solomon mengganti karakter yang salah dengan karakter yang sebenarnya tanpa memperdulikan apakah error yang terjadi pada karakter tersebut disebabkan oleh satu bit yang rusak atau semua bit pada karakter tersebut mengalami kerusakan. Alasan inilah yang menyebabkan kode Reed Solomon dianggap lebih baik dibanding binary codes. Proses pendekodean Reed Solomon dijalankan dengan mencari sindrom error pada data informasi.

Gambar 2.21. Gambar Elemen Reed Salomon Code. 2.10.1. Penyandi Reed-Solomon

Bentuk umum kode RS dituliskan dengan (n,k)=(2m -1, 2m-1-2t), dengan n-k= 2t adalah banyaknya karakter parity dan t merupakan kemampuan untuk mengoreksi karakter error. Sedangkan bentuk generator polinomial kode RS dituliskan sebagai berikut:

g(x)= g0+ g1x+ g2x2+ g2t-1x2t-1 (2.5) Derajat generator polinomial sama dengan banyaknya karakter parity yang ditambahkan yaitu 2t. Sehingga akar generator polinomial, yang dilambangkan dengan , mempunyai derajat yang sama. Akar-akar g(x) dituliskan sebagai , 2, 3,... 2t.

Sebagai contoh, kode RS (7,3) dengan n= 7 dan k= 3,mempunyai kemampuan untuk mengoreks error karakter 2t= n-k= 4, maka kode tersebut mempunyai 4 akar.


(28)

Berdasarkan derajat polinomialnya dari rendah ke tinggi dan dalam field biner +1= -1, maka generator g(x) dapat dituliskan dengan:

g(x)=3+1x+0x2+3x3+x4 (2.6) Untuk pembentukan polinomial codewordnya dilakukan dengan persamaan: U(x)= P(x)+ x^(n-k)m(x) (2.7) Dengan:

U(x) = codeword yang dibentuk;

m(x) = karakter informasi yang akan disandikan; dan

p(x) = karakter parity yang didapatkan dari sisa pembagian antara perkalian karakter informasi yang akan disandikan dan polinomial xn-k dengan generator polinomial g(x) yang secara matematis p(x) dapat dituliskan dengan p(x)= xn-1 m(x) mod g(x).

2.10.2. Pengawasandi Reed-Solomon

Pada Reed-Solomon decoder, codeword yang diterima mempunyai persamaan sebagai berikut:

c(x)= U(x)+ h(x) (2.8) dengan

h(x)= ∑ (2.9) h(x) merupakan error yang direpresentasikan dalam bentuk polinomial.

Jika menggunakan pengawasandian biner,maka perlu diketahui hanya lokasi errornya saja. Dengan mengetahui error, maka yang harus dilakukan adalah mengubah bit pada lokasi tersebut dari 0 menjadi 1 atau dari 1 menjadi 0. Sementara pengawasandian secara non biner, mengetahui letak errornya saja tidaklah cukup, tetapi juga harus mengetahui nilai karakter yang sebenarnya pada lokasi tersebut.


(29)

2.11 Elemen Galois Field

Elemen galois field terdiri dari sekumpulan elemen yang dinotasikan oleh  , dan bernilai n

0, 0, 1, 2,... n-1 (2.10) untuk membentuk sebuah set elemen 2m, dengan n = 2m -1. Nilai  biasanya dipilih bernilai 2, meskipun nilai lain dapat digunakan. Tiap elemen field yang ditunjukkan pada persamaan (1) dapat direpresentasikan dalam bentuk polinomial :

m-1

xm-1+ 1x1+ 0 (2.11) Untuk m=4 memiliki persamaan elemen Galois Field berikut :

3

x3+ 2x2+1x1+ 0 (2.12)

2.12. Polynomial Generator Field

Polynomial Generator Field sering juga disebut polinomial primitif, p(x), dengan pangkat m. Untuk galois field dengan ukuran tertentu, memiliki bentuk polinomial yang secara umum sudah sering digunakan, seperti ditunjukan pada Tabel 2.8.


(30)

2.13. Pembentukan Galois Field (GF)

Pada Tabel 2.9 ditunjukkan nilai dari elemen field untuk GF(2m) dalam bentuk indeks, polinomial, biner, dan desimal. Berdasarkan Tabel 2.8, tiap tahap pembentukan polinomial selalu dikalikan dengan „x‟, sedangkan untuk pembentukan bilangan biner mewakili nilai-nilai koefisien polinomial.


(1)

2.9. Convolution Code

Terdapat dua tipe utama kode pengoreksi error yang umum yang digunakan yaitu kode blok dan kode konvensional. Dengan kode blok (n,k), bit-bit data (atau informasi) dikelompokan menjadi blok-blok sepanjang k bit , dan kemudian penyandiannya untuk membentuk kode-kode biner (atau blok-blok kode) sepanjang n bit, dengan (n-k) bit yang ditambahkan ke bit-bit data aslinya berfungsi sebagai cek paritas. Salah satu karakteristik kode blok linier adalah bahwa blok data k bit yang disandikan pada saat tertentu secara langsung menentukan kode biner n bit yang akan dihasilkan oleh penyandi.

Di sisi lain sebuah penyandi untuk kode konvolusional (n,k,m) juga menerima masukan berupa blok data kbit dan menghasilkan keluaran kode biner sebanyak n bit. Namun berbeda halnya dengan kode blok, pembentukan sebuah kode biner n bit tidak lagi hanya ditentukan oleh blok data k bit yang diumpankan ke penyandi pada titik waktu yang sama, namun juga oleh (m-1) blok data kbit yang diumpankan sebelumnya. Sehingga, karakteristik penting kode konvensional yang membedakannya dari kode blok linier adalah digunakannya memori di dalam proses penyandian. Dalam prakteknya, n maupun k adalah bilangan-bilangan bulat yang bernilai kecil dan tetap, sedangkan nilai m akan diubah-ubah nilainya untuk mengatur redundansi pada kode.

Di dalam kasus khusus dengan k=1, rangkaian bit data tidak perlu dibagi terlebih dulu menjadi blok-blok dan diolah terus-menerus secara berkesinambungan. Dalam uraian selanjutnya mengenai kode konvolusional, hanya akan dibahas kasus khusus k =1 ini.

Kode-kode konvolusional sangat praktis. Beberapa metode yang berbeda bahkan dapat digunakan untuk menjabarkan proses penyandian konvolusional, diantaranya diagram koneksi, polinom koneksi, diagram keadaan (state diagram). Diagram pohon (tree diagram), dan diagram teralis (trellis diagram). Gambar 2.19 memperlihatkan sebuah penyandi konvolusional (2,1,2) sederhana denga n =2,k=1,dan m=2. Setiap kali sebuah bit data dimasukkan ke register pertama pada penyandi, dua bit kode akan dihasikan sebagai keluaran secara berurutan.


(2)

Gambar 2.19. Penyandian Convolution Code (2,1,2).

Tabel 2.7. Penyandian Convolution Code (2,1,2).

INPUT PRESENT STATES NEXT STATES OUTPUT S1 S2 KONDISI S ’ S ’ KONDISI V1 V2

0 0 0 A 0 0 A 0 0

1 0 0 A 1 0 B 1 1

0 1 0 B 0 1 C 1 0

1 1 0 B 1 1 D 0 1

0 0 1 C 0 0 A 1 1

1 0 1 C 1 0 B 0 0

0 1 1 D 0 1 C 0 1

1 1 1 D 1 1 D 1 0


(3)

2.10 Reed Salomon Code

Kode Reed Solomon mendeskripsikan sebuah cara sistematis untuk membentuk kode yang mampu mengoreksi error yang muncul secara acak dan tak terduga (bursty) pada paket data yang diterima.

Sebuah kode Reed Solomon ditulis dalam bentuk RS(n,k) dengan n adalah panjang blok atau panjang kode yang terdiri dari susunan beberapa karakter, sedangkan k adalah panjang informasi atau jumlah karakter data yang akan dikodekan. Panjang block code ini dinyatakan oleh n = 2m-1 dengan m adalah jumlah bit per karakter sedangkan jumlah karakter parity yang harus ditambahkan untuk mengoreksi sejumlah error sebanyak n-k = 2t dengan t adalah jumlah karakter error yangmampu dikoreksi.

Penyandian Reed Solomon mengganti karakter yang salah dengan karakter yang sebenarnya tanpa memperdulikan apakah error yang terjadi pada karakter tersebut disebabkan oleh satu bit yang rusak atau semua bit pada karakter tersebut mengalami kerusakan. Alasan inilah yang menyebabkan kode Reed Solomon dianggap lebih baik dibanding binary codes. Proses pendekodean Reed Solomon dijalankan dengan mencari sindrom error pada data informasi.

Gambar 2.21. Gambar Elemen Reed Salomon Code. 2.10.1. Penyandi Reed-Solomon

Bentuk umum kode RS dituliskan dengan (n,k)=(2m -1, 2m-1-2t), dengan n-k= 2t adalah banyaknya karakter parity dan t merupakan kemampuan untuk mengoreksi karakter error. Sedangkan bentuk generator polinomial kode RS dituliskan sebagai berikut:

g(x)= g0+ g1x+ g2x2+ g2t-1x2t-1 (2.5) Derajat generator polinomial sama dengan banyaknya karakter parity yang ditambahkan yaitu 2t. Sehingga akar generator polinomial, yang dilambangkan dengan

, mempunyai derajat yang sama. Akar-akar g(x) dituliskan sebagai , 2, 3,... 2t. Sebagai contoh, kode RS (7,3) dengan n= 7 dan k= 3,mempunyai kemampuan untuk mengoreks error karakter 2t= n-k= 4, maka kode tersebut mempunyai 4 akar.


(4)

Berdasarkan derajat polinomialnya dari rendah ke tinggi dan dalam field biner +1= -1, maka generator g(x) dapat dituliskan dengan:

g(x)=3+1x+0x2+3x3+x4 (2.6) Untuk pembentukan polinomial codewordnya dilakukan dengan persamaan: U(x)= P(x)+ x^(n-k)m(x) (2.7) Dengan:

U(x) = codeword yang dibentuk;

m(x) = karakter informasi yang akan disandikan; dan

p(x) = karakter parity yang didapatkan dari sisa pembagian antara perkalian karakter informasi yang akan disandikan dan polinomial xn-k dengan generator polinomial g(x) yang secara matematis p(x) dapat dituliskan dengan p(x)= xn-1 m(x) mod g(x).

2.10.2. Pengawasandi Reed-Solomon

Pada Reed-Solomon decoder, codeword yang diterima mempunyai persamaan sebagai berikut:

c(x)= U(x)+ h(x) (2.8) dengan

h(x)= ∑ (2.9) h(x) merupakan error yang direpresentasikan dalam bentuk polinomial.

Jika menggunakan pengawasandian biner,maka perlu diketahui hanya lokasi errornya saja. Dengan mengetahui error, maka yang harus dilakukan adalah mengubah bit pada lokasi tersebut dari 0 menjadi 1 atau dari 1 menjadi 0. Sementara pengawasandiansecara non biner, mengetahui letak errornya saja tidaklah cukup, tetapi juga harus mengetahui nilai karakter yang sebenarnya pada lokasi tersebut.


(5)

2.11 Elemen Galois Field

Elemen galois field terdiri dari sekumpulan elemen yang dinotasikan oleh  , dan bernilai n

0, 0, 1, 2,... n-1 (2.10) untuk membentuk sebuah set elemen 2m, dengan n = 2m -1. Nilai  biasanya dipilih bernilai 2, meskipun nilai lain dapat digunakan. Tiap elemen field yang ditunjukkan pada persamaan (1) dapat direpresentasikan dalam bentuk polinomial :

m-1

xm-1+ 1x1+ 0 (2.11) Untuk m=4 memiliki persamaan elemen Galois Field berikut :

3

x3+ 2x2+1x1+ 0 (2.12)

2.12. Polynomial Generator Field

Polynomial Generator Field sering juga disebut polinomial primitif, p(x), dengan pangkat m. Untuk galois field dengan ukuran tertentu, memiliki bentuk polinomial yang secara umum sudah sering digunakan, seperti ditunjukan pada Tabel 2.8.


(6)

2.13. Pembentukan Galois Field (GF)

Pada Tabel 2.9 ditunjukkan nilai dari elemen field untuk GF(2m) dalam bentuk indeks, polinomial, biner, dan desimal. Berdasarkan Tabel 2.8, tiap tahap pembentukan polinomial selalu dikalikan dengan „x‟, sedangkan untuk pembentukan bilangan biner mewakili nilai-nilai koefisien polinomial.


Dokumen yang terkait

Institutional Repository | Satya Wacana Christian University: Simulator Penyandian dan Pengawasandian pada Sistem Komunikasi Berbasis Perangkat Lunak Visual C

0 0 13

Institutional Repository | Satya Wacana Christian University: Simulator Penyandian dan Pengawasandian pada Sistem Komunikasi Berbasis Perangkat Lunak Visual C T1 612010011 BAB I

0 0 3

Institutional Repository | Satya Wacana Christian University: Simulator Penyandian dan Pengawasandian pada Sistem Komunikasi Berbasis Perangkat Lunak Visual C T1 612010011 BAB IV

0 0 19

Institutional Repository | Satya Wacana Christian University: Simulator Penyandian dan Pengawasandian pada Sistem Komunikasi Berbasis Perangkat Lunak Visual C T1 612010011 BAB V

0 0 2

Institutional Repository | Satya Wacana Christian University: Simulator Penyandian dan Pengawasandian pada Sistem Komunikasi Berbasis Perangkat Lunak Visual C

0 1 38

Institutional Repository | Satya Wacana Christian University: Simulator Modulasi dan Demodulasi Digital Menggunakan Perangkat Lunak MATLAB T1 612009011 BAB II

0 1 11

Institutional Repository | Satya Wacana Christian University: Sistem Informasi Akademik Berbasis Web T1 672004181 BAB II

0 0 10

T1__BAB II Institutional Repository | Satya Wacana Christian University: Kontrol dan Sistem Pemantauan Air Sampler T1 BAB II

0 0 6

T1__BAB II Institutional Repository | Satya Wacana Christian University: Prototype Sistem Peminjaman Ruang Kelas Berbasis RFID T1 BAB II

0 0 8

T1__BAB II Institutional Repository | Satya Wacana Christian University: Sistem Penelusuran Barang Menggunakan Barcode Berbasis Web T1 BAB II

0 0 4