NỀN TẢNG LÝ THUYẾT THÔNG TIN.

Một phần của tài liệu Chuẩn nén âm thanh và biến đổi file đuôi Wave sang file đuôi MP3 (có mã nguồn chương trình bằng VB) (Trang 48 - 55)

Theo Shannon, entropy của một nguồn thông tin S được định nghĩa: H(S) = η = Σipilog2(1/pi)

Trong đó:

• pi là xác xuất mà ký hiệu Si xuất hiện trong S.

• log2(1/pi) chỉ ra số lượng thông tin chứa đựng trong Si , nghĩa là số bit cần thiết để mã hóa Si.

• Ví dụ: một hình ảnh được tô đều với cùng một cường độ màu xám, tức là pi=1/256, thì số bit cần thiết để mã hóa cho mỗi mức xám là 8 bits. Entropy của hình này là 8.

Giải thuật Shannon - Fano:

Ta dùng một ví dụ đơn giản để mô tả giải thuật:

Ký hiệu A B C D E

---

Số lần 15 7 6 6 5

Mã hóa cho giải thuật Shannon - Fano: Dùng cách tiếp cận từ trên xuống.

• Sắp thứ tự các ký hiệu theo tần số xuất hiện của nó, nghĩa là: ABCDE.

• Chia thành hai phần, mỗi phần tương đương với cùng số lần đếm.

Ký hiệu Số lần log(1/p) Mã Cộng(số bit) --- --- --- --- --- A 15 1.38 00 30 B 7 2.48 01 14 C 6 2.70 10 12 D 6 2.70 110 18 E 5 2.96 111 15 Tổng cộng(số bit) : 89 V.2. CÁC GIẢI THUẬT NÉN KHÔNG CÓ TỔN THẤT. 1. Mã hóa Huffman.

• Khởi tạo: đưa tất cả các node vào danh sách OPEN theo thứ tự tại mọi thời điểm. Ví dụ: ABCDE.

• Lặp lại cho đến khi danh sách OPEN chỉ còn một node bên trái như sau: - Từ danh sách OPEN, chọn hai node có xác xuất thấp nhất, tạo node cha cho chúng.

- Gán tổng các xác xuất cho node cha và đưa node cha vào danh sách OPEN.

- Gán các mã 0, 1 vào các nhánh của cây, xóa các node con khỏi danh sách OPEN.

Ký hiệu Số lần log(1/p) Mã Cộng(số bit) --- --- --- --- --- A 15 1.38 0 30 B 7 2.48 100 14 C 6 2.70 101 12 D 6 2.70 110 18 E 5 2.96 111 15 Tổng cộng (số bit) : 87

• Việc giải mã cho cả hai giải thuật trên là tầm thường chừng nào mà bảng

mã (thống kê) được gởi trước dữ liệu . Có một bit bên trên công việc truyền này, nhưng không đáng kể nếu file dữ liệu lớn.

• Tính chất tiền tố duy nhất: không có mã nào là tiền tố cho một mã khác (tất cả các ký hiệu đều là node lá) → rõ ràng là lớn đối với bộ giải mã.

• Nếu việc thống kê có thể tiến hành được trước đó và với độ chính xác cao, thì mã Huffman là rất tốt.

Trong ví dụ trên:

Entropy = (15x1.38 + 7x2.48 + 6x2.7 + 6x2.7 + 5x2.96)/39

= 85.26 / 39 = 2.19.

Số bit cần thiết cho mã hóa Huffman là : 87 / 39 = 2.23 2. Mã Huffman sửa đổi.

(a) Các giải thuật trên đây yêu cầu kiến thức về thống kê là điều mà khó có thể thực hiện (ví dụ âm thanh, hình ảnh sống..).

(b) Ngay cả khi nếu điều đó là có thể làm được thì chi phí cho nó khá nặng, đặc biệt khi có nhiều bảng phải được truyền mà mô hình non-order() được sử dụng, nghĩa là việc đưa vào tính toán sự ảnh hưởng của các ký hiệu trước đó với xác xuất của ký hiệu hiện hành (ví dụ: “qu” thường đi với nhau,..).

Giải pháp đưa ra là dùng giải thuật sửa đổi cho thích hợp. Như ví dụ, việc mã hóa Huffman sửa đổi được khảo sát sau đây với ý tưởng là làm thế nào có thể áp dụng vào các giải thuật nén thích hợp khác.

Bộ mã hóa

Initialize_model();

while ((c = getc (input)) != eof) { encode(c, output); update_model(c); } Bộ giải mã Initialize_model();

while ((c = decode (input)) != eof) {

putc(c, output); update_model(c); }

• Mấu chốt ở đây là cả hai bộ mã hóa và giải mã đều dùng cùng các hàm Initialize_model và update_model .

• Hàm update_model có hai lưu ý:

(a) Tăng biến đếm.

(b) Cập nhật cây Huffman.

- Trong suốt qúa trình cập nhật, cây Huffman sẽ được duy trì tính kế thừa, các nodes (node trong và lá) được sắp xếp theo thứ tự tăng dần của trọng lượng (xem hình 5.3).

- Khi cần thiết tráo đổi (swapping), node xa nhất với trọng lượng W được tráo đổi với node mà trọng lượng của nó tăng lên 1 đơn vị W+1.

Lưu ý: nếu node trọng lượng W có cây con bên dưới nó thì cây con đó cũng phải dời cùng với nó.

Cây Huffman có thể nhìn rất khác so với trước khi tráo đổi, ví dụ trong cây thứ 3, node A được tráo đổi và trở thành node 5. Bây giờ nó được mã hóa chi bằng 2 bit.

3. Mã hóa số học.

Mã hóa Huffman sử dụng một số nguyên k các bit cho mỗi ký hiệu, vì thế k không bao giờ nhỏ hơn 1. Đôi khi, ví dụ phải truyền một hình ảnh 1 bit, thì không thể nén được.

Ý tưởng: gỉa sử mẫu tự là [X,Y] và P(X) = 2/3 P(Y) = 1/3.

• Nếu ta chỉ quan tâm với chiều dài mã hóa là 2 thông điệp, thì ta có thể ánh xạ tất cả thông điệp có thể có vào những đoạn trong phạm vi [0..1]

{ EMBED Excel.Sheet.5 }

• Để mã hóa thông điệp, chỉ dùng vừa đủ số bit cần thiết cho mỗi đoạn.

• Tương tự, ta có thể ánh xạ tất cả chiều dài 3 thông điệp vào các đoạn trong [0..1].

Hình 5.5

• Nói chung, số bit được xác định bằng kích thước của đoạn. Ví dụ:

Đoạn đầu tiên là 8/27, cần 2 bit→ 2/3 bit cho mỗi ký tự. Đoạn cuối là 1/27, cần 5 bit.

• Tóm lại, cần -[logp] bit để biểu diễn cho đoạn có kích thước p.

• Vấn đề đặt ra là làm thế nào để xác định được xác xuất?

Ý tưởng đơn giản là dùng mô phỏng : bắt đầu bằng việc đoán tần số của một ký hiệu. Cập nhật tần số cho mỗi ký hiệu mới.

4. Giải thuật Lempel-Ziv-Welch(LZW).

Gỉa sử chúng ta muốn mã hóa cho một cuốn tự điển Tiếng Anh 159,000 từ. Như vậy mỗi từ cần 18 bit để mã hóa.

Nhược:

- Dùng qúa nhiều bit.

- Chỉ làm việc cho ký tự tiếng Anh. Giải pháp:

- Cần phải tìm một cách để mã hóa cuốn từ điển cho thích hợp.

- Các phương pháp ban đầu được đề xuất bởi Ziv và Lempel vào năm 1978 và 1979. Terry Welch phát triển lược đồ vào năm 1981 và trở thành giải thuật LZW.

Giải thuật: w = NIL;

while (read a character k) {

if wk exists in the dictionary w = wk;

else

add wk to the dictionary; output the code for w; w = k;

}

LZW nguyên gốc sử dụng từ điển với 4K mục từ, 256 từ đầu tiên là mã ASCII. Ví dụ: chuỗi ký tự là “^WED^WE^WEE^WEB^WET”.

w k output index symbol

--- NIL ^ ^ W ^ 256 ^W W E W 257 WE E D E 258 ED D ^ D 259 D^ ^ W ^W E 256 260 ^WE E ^ E 261 E^ ^ W ^W E ^WE E 260 262 ^WEE E ^ E^ W 261 263 E^W W E WE B 257 264 WEB B ^ B 265 B^ ^ W ^W E ^WE T 260 266 ^WET T EOF T

19 ký hiệu nhập được giảm xuống 7 ký tự và 5 mã. Mỗi mã/ký hiệu sẽ cần nhiều hơn 8 bit, ta lấy 9 bit.

Thông thường, công việc nén chỉ được bắt đầu khi có một số lớn byte được đọc vào (ví dụ >100)

Giải thuật giải nén LZW: read a character k; output k;

w = k;

while ( read a character k ) /* k could be a character or a code. */ {

entry = dictionary entry for k; output entry;

add w + entry[0] to dictionary; w = entry;

}

Một phần của tài liệu Chuẩn nén âm thanh và biến đổi file đuôi Wave sang file đuôi MP3 (có mã nguồn chương trình bằng VB) (Trang 48 - 55)