You are on page 1of 8

EN813403 Principles of Digital Communications and Modeling

Laboratory
สาขาวิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์

DTC-08: รหัสแหล่งกําเนิด (Source Coding)

1 วัตถุประสงค์
1. เพื่อเรียนรู้วิธีการบีบอัดแหล่งกำเนิดข้อมูลแบบไม่จดจำวิยุต (DMS:Discrete Memoryless Source) ให้อยู่ในรูปแบบรหัสปราศจากสัญญาณ
รบกวน (noiseless coding) ด้วยจํานวนบิตต่ออักขระที่เข้าใกล้กับเอนโทรปี (Entropy) ของแหล่งกำเนิดข้อมูล
2. เพื่อศึกษาการบีบอัดข้อมูลแบบรหัสปราศจากสัญญาณรบกวนด้วยวิธีการประยุกต์ขั้นตอนวิธี Huffman coding
3. เพื่อศึกษาวิธีการวัดและเพิ่มประสิทธิภาพสําหรับการบีบอัดข้อมูลแบบรหัสปราศจากสัญญาณรบกวน

2 อุปกรณ์การทดลอง
1. คอมพิวเตอร์ notebook ของ Dell รุ่น latitude E6420 ด้วย cpu Intel® Core™ i5-2520M CPU @ 2.50GHz × 4 หน่วยความจำ 8.0 GiB
DDR3 ใช้ graphic รุ่น NVS 4200M/PCIe/SSE2 ขนาดความจุของดิสค์ 500.1 GB
2. ระบบปฏิบัติการ Ubuntu 22.04.1 LTS (AMD64) สำหรับคอมพิวเตอร์ตั้งโต๊ะ
3. เซจแมท รุ่น 9.5 สำหรับ Ubuntu 22.04 LTS (AMD64)
4. Jupyter Notebook ด้วย Python 3.10.6 สำหรับเป็นแพลตฟอร์มคอมพิวเตอร์เชิงโต้ตอบบนเว็บ

3 ทฤษฎี
ปัจจุบันต้นทางสารสนเทศ (information source) นั่นคือ คําพูด, ภาพ และโทรสาร เป็นต้น ซึ่งเป็นต้นทางแอนะล็อก (analog source) มักจะ
ถูกแปลงให้อยู่ในรูปลําดับดิจิทัล (digital sequences) เพราะสามารถนํามาประมวลผลข้อมูลได้สะดวกด้วย คอมพิวเตอร์ การเพิ่มประสิทธิภาพ
ด้วยการลดขนาดของลําดับดิจิทัลในรูปแบบรหัสปราศจากสัญญาณรบกวน (noiseless coding) ด้วยจํานวนบิตต่ออักขระที่เข้าใกล้กับเอนโทรปี
(Entropy) ของต้นทางข้อมูลเป็นสิ่งที่จําเป็น เพราะช่วยลดพื้นที่การจัดเก็บข้อมูล และลดระยะเวลาในการส่งข้อมูลก่อนประมวลผล โดยไม่ทําให้
เกิดการสูญเสียของข้อมูลนั้น ในการศึกษานี้เราจะพิจารณาวิธีการ และเทคนิคต่างๆ ที่ใช้สําหรับบีบอัดลําดับ (compresses sequence) โดยมี
เป้าหมายเพื่อแทน ข้อมูลเหล่านี้ด้วยจํานวนบิตที่ลดลง และทําให้ลําดับข้อมูลต้นฉบับ (original data sequence) สามารถที่จะกู้กลับคืนจากลํา
ดับบีบอัด (compresses sequence) ได้อย่างสมบูรณ์ เราเรียกแนวคิดนี้ว่า การเข้ารหัสต้นทาง (source-coding) ตัวอย่างของวิธีการ เข้ารหัส
ต้นทาง ได้แก่ Huffman coding, Lempel-Ziv coding, และการเข้ารหัสเชิงเลขคณิต เป็นต้น ซึ่งจัดอยู่ในชั้น (class) ของการบีบอัดข้อมูล แบบ
ปราศจากสัญญาณรบกวน โดยข้อจํากัดขั้นพื้นฐานของการบีบอัดที่กระทําโดยชั้นนี้ ถูกกําหนดโดย เอนโทรปี (entropy) ของต้นทาง (source)
ตัวอย่างของการประยุกต์การเข้ารหัสต้นทางสามารถแสดงได้ ดังรูปที่ 1 สัญญาณสารจากต้นทางของสารสนเทศถูกเข้ารหัสต้นทาง แล้วได้รหัส
คํา ของต้นทาง ส่ง ผลให้ ข้อมูล ของต้นทางมี ขนาดเล็ก โดยปราศจากการสูญ เสีย (ซึ่ง ในการทดลองนี้ จะศึกษาเรื่องนี้) จากนั้ นทํา การเข้า รหัส ช่อง
สัญญาณโดยเพิ่มข้อมูล ส่วนเกินเข้าไป ไว้สําหรับตรวจสอบความถูกต้องของข้อมูลที่เครื่องรับ แล้วทําการกล้ำสัญญาณในรูปคลื่นที่เหมาะสมกับ
ช่อง สัญญาณ และส่งผ่านช่องสัญญาณไปเครื่องรับต่อไป เครื่องรับจะทําการกู้ข้อมูลกลับคืนในลักษณะผกผันกับเครื่องส่งในลําดับ ย้อนกลับ

1
รูปที่ 1 แผนภาพบล็อกของระบบสื่อสารดิจิทัล

การส่งออกของสารสนเทศ (information source) สามารถจำลองด้วยกระบวนการสุ่ม สำหรับ discrete-memoryless ที่เป็นกระบวนการ


สุ่มนิ่ง เราสามารถพิจารณาในรูปของตัวแปรสุ่ม X และเอนโทรปี ซึ่งสามารถนิยามเป็น

H(X) = − p(x) log p(x) (1)
x∈X

เมื่อ X แทนชุดตัวอักษรต้นทาง (source alphabet), p(x) แทนความน่าจะเป็นของตัวอักษร (letter) x และฐานของลอการิทึม หมายถึง ฐาน
สอง ดังนั้นหน่วยของเอนโทรปี จึงเป็น บิต (bits) สำหรับชุดตัวอักษรฐานสอง (binary alphabet) ด้วยความน่าจะเป็น p และ 1 − p นั้น เราจะ
แทนเอนโทรปี ด้วย Hb (p) และกำหนดโดย
Hb (p) = −p log p − (1 − p) log(1 − p) (2)
เอนโทรปี ของต้นทาง ช่วยให้ เราทราบขอบเขตจำนวนของบิต ที่ ต้องการในการแทนต้น ทางใดๆหากต้องการกู้ กลับ คืน ได้ อย่างสมบูรณ์ หรือ
กล่าวว่า ค่า เฉลี่ย จำนวนบิต ต่อ ตัว อักษรที่ ต้องการใช้ เข้า รหัส ต้นทาง (source encode) ให้ สามารถกู้ กลับ คืน โดยปราศจากข้อ ผิด พลาด (error)
สามารถทำด้วยค่าเข้าใกล้ H(X) แต่จะต้องไม่น้อยกว่า H(X)
Noiseless coding หมายถึง วิธีการลดจำนวนของบิตที่ต้องการสำหรับแทนต้นทางขาออกเพื่อให้สามารถกู้กลับคืนมาได้อย่างสมบูรณ์ ทฤษฎี
ของ noiseless coding จากงานของ Shannon กล่าวว่า “เราสามารถสร้างต้นทางขึ้นมาใหม่ได้อย่างสมบูรณ์ ด้วยการใช้รหัสด้วยอัตราเข้าใกล้
เอนโทรปี ของต้นทาง แต่ เป็น ไปไม่ ได้ที่ จะใช้ รหัส ด้วยอัตราน้อยกว่า เอนโทรปี ของต้นทาง” หรือ กล่าวว่า สำหรับ ϵ > 0 นั้น เราสามารถที่ จะมี
รหัส ด้วยอัตราน้อยกว่า H(X) + ϵ แต่ ไม่ สามารถน้อยกว่า H(X) ตัวอย่างของ noiseless source coding ได้แก่ Huffman coding และ
Lempel-Ziv coding เป็นต้น ในที่นี้เราจะศึกษา Huffman coding
ใน Huffman coding เรากำหนด codeword ยาวกว่า สำหรับต้นทางขาออก ที่มีความน่าจะเป็นน้อย และ codeword สั้นกว่า สำหรับต้นทาง
ขาออก ที่มีความน่าจะเป็นสูง การทำงานของขั้นตอนวิธี เริ่มต้นด้วยการผสานต้นทางขาออก (merge source outputs) 2 ชุดที่มีความน่าจะเป็น
น้อยสุดให้เป็นขาออกผสานใหม่ (new merged output) ด้วยความน่าจะเป็นเท่ากับความน่าจะเป็นทั้งสองบวกกัน กระบวนการจะถูกดำเนินการ
ซ้ำไปเรื่อยๆจนกว่าผลรวมของความน่าจะเป็นเท่ากับหนึ่ง ด้วยวิธีการแบบนี้เราจะได้ tree เริ่มต้นจากรากของ tree จะกำหนดบิต 0 และบิต 1
ให้กับ branches ที่ได้จาก node เดียวกันทำจนกระทั่งครบทุก branches ใน tree แล้วได้ code ที่มีความยาวเฉลี่ยต่ำสุดท่ามกลาง class ของ

2
รูปที่ 2 Huffman code tree

prefix-free-codes1 สำหรับค่าความยาว codeword เฉลี่ยสามารถนิยามได้ดังนี้



L̄ = p(x)l(x) (3)
x∈X

เมื่อ l(x) แทนความยาวของ codeword ที่สัมพันธ์กับ source output x


ตัวอย่าง 1. จงออกแบบ Huffman code สำหรับต้นทางมีชุดอักขระเป็น X = {x1 , x2 , . . . , x9 } ด้วยความน่าจะเป็นในรูปของเวกเตอร์

p = (0.2, 0.15, 0.13, 0.12, 0.1, 0.09, 0.08, 0.07, 0.06)


จงหาค่าความยาว codeword เฉลี่ย และเปรียบเทียบกับเอนโทรปีของต้นทาง
วิธีทำ เมื่อใช้ขั้นตอนวิธี จากแนวคิดข้างบนเราจะได้ tree ดังรูปที่ 2 และค่าความยาว codeword เฉลี่ยสำหรับ code นี้สามารถคำนวณได้เป็น
L̄ = 2 × 0.2 + 3 × (0.15 + 0.13 + 0.12 + 0.1) + 4 × (0.09 + 0.08 + 0.07 + 0.06)
= 3.1 บิตต่อตัวอักษร
เอนโทรปีของต้นทาง สามารถคำนวณได้จาก

9
H(X) = − pi log pi = 3.0371 บิตต่อตัวอักษร
i=1

สังเกตุว่า L̄ > H(X) เป็นไปตามทฤษฎี


ปริมาณ
H(X)
η= (4)

เรียกว่า ประสิทธิภาพของ Huffman code เราสามารถแสดงได้ว่าค่าความยาว codeword เฉลี่ยสำหรับ Huffman code ใดๆสอดคล้องกับ
อสมการ
H(X) ≤ L̄ < H(X) + 1 (5)
1 Prefix-free codes หมายถึง codes ที่ซึ่งไม่มี codeword เป็น prefix ของ codeword อื่น

3
ถ้าเราออกแบบ Huffman code สำหรับ blocks ความยาว K แทนที่จะเป็นอักขระเดียว (single letters) เราจะได้
1
H(X) ≤ L̄ < H(X) + (6)
K

และเมื่อเพิ่มค่า K เราจะได้ค่าความยาว codeword เฉลี่ยเข้าใกล้ H(X)

4 การทดลอง
4.1 Huffman Coding
กำหนดให้ต้นทางสารสนเทศ เป็น discrete-memoryless ได้ส่งออกสตริง
There once was a french fry

1. เขียนโปรแกรมด้วยเซจไพธอนเพื่อหาความถี่ของแต่ละตัวอักษร ความน่าจะเป็นของแต่ละตัวอักษร และ ตาราง codeword ของแต่ละตัว


อักษร ด้วยคำสั่งต่อไปนี้ ตามด้วย shift+enter

from sage.coding.source_coding.huffman import Huffman, frequency_table


str1="There once was a french fry"
print("The string: ",str1)
print()
ft = frequency_table(str1)
print("Frequency and probability of each letter in string: ")
Sft=sorted(ft.items())
for j in range(len(ft)):
print(Sft[j],", P(",Sft[j][0],")=",QQ(Sft[j][1])/len(ft))
h1 = Huffman(str1)
print()
print("Codeword of each letter is:")
for letter, code in sorted(h1.encoding_table().items()):
print("'{}' : {}".format(letter, code))

2. สังเกต และบันทึกผลการทดลอง

4
3. จากตาราง codeword จงแสดงบิตสริงที่ส่งออก

4. จงใช้สมการ (1) คำนวณหาเอนโทรปีของต้นทางสารสนเทศในหน่วยบิตต่อตัวอักษร

5
5. จงใช้สมการ (3) คำนวณหาความยาวของ codeword เฉลี่ยในหน่วยบิตต่อตัวอักษร

6. จงใช้สมการ (4) คำนวณหาประสิทธิภาพของ Huffman code

6
7. เขียนโปรแกรมด้วยเซจไพธอนเพื่อสร้าง binary tree ที่แทน Huffman code ด้วยคำสั่งต่อไปนี้ ตามด้วย shift+enter

from sage.coding.source_coding.huffman import Huffman, frequency_table


str1="There once was a french fry"
ft = frequency_table(str1)
print("Frequency and probability of each letter in string: ")
Sft=sorted(ft.items())
for j in range(len(ft)):
print(Sft[j],", P(",Sft[j][0],")=",QQ(Sft[j][1])/len(ft))
h1 = Huffman(str1)
print()
T = h1.tree(); T
print()
T.show(figsize=[15,15])

8. บันทึกผลการทดลอง แล้วให้คำนวณและเขียนค่าความน่าจะเป็นที่ทุกๆ edge ของ tree

7
9. อภิปรายผล

5 สรุปผลการทดลอง

6 คำถาม
1. จงบอกความแตกต่างของวิธีการบีบอัดข้อมูล (Data compression) ระหว่างแบบ Noiseless coding และแบบการแบ่งนับ (Quantization)
มา 2 ประการ
2. จากการสังเกตในผลการทดลอง จงบอกข้อดีของการประยุกต์ใช้ binary tree ในขั้นตอนวิธี Huffman code สำหรับการเข้ารหัสต้นทาง
มา 2 ประการ

You might also like