Mã hóa Huffman [12]

Một phần của tài liệu Mã hóa và nén tín hiệu âm thanh ứng dụng trong phát thanh số (Trang 39)

Mã hóa Huffman là một thuật toán mã hóa dữ liệu ngẫu nhiên được sử dụng để nén không mất dữ liệu. Thuật ngữ này đề cập đến việc sử dụng một bảng mã có chiều dài biến đổi để mã hóa một dữ liệu nguồn (chẳng hạn như các ký tự trong một tập tin) mà bảng mã chiều dài thay đổi đã được bắt nguồn một cách cụ thể dựa trên

ước tính xác suất xảy ra cho mỗi giá trị có thể của dữ liệu nguồn. Phương pháp mã hóa Huffman

Sử dụng vài bits để biểu diễn một ký tự (gọi là “mã bit”) Độ dài “mã bit” cho các ký tự không giống nhau:

 Ký tự xuất hiện nhiều lần  biểu diễn bằng mã ngắn.

 Ký tự xuất hiện ít lần  biểu diễn bằng mã dài.

 Mã hóa bảng mã có độ dài thay đổi (Variable Length Encoding)

 Thuật toán nén

Bước 1: duyệt file  lập bảng thống kê số lần xuất hiện của mỗi loại ký tự Bước 2: Phát sinh cây cây Huffman  dựa vào bảng thống kê

Bước 3: Tạo cây Huffman phát sinh bảng mã bit cho các ký tự Bước 4: Duyệt file thay thế các ký tự bảng mã bit tương ứng Bước 5: Lưu lại thông tin của cây để giải nén

 Tạo cây Huffman:

Mô tả cây : Một cây Huffman: mã Huffman được biểu diễn bằng một cây nhị phân Mọi nút lá chứa 1 ký tự

Nút cha sẽ chứa các ký tự của những nút con

 Mọi nút được gán một trọng số.

 Nút lá có trọng số bằng số lần xuất hiện các ký tự trong file.

 Nút cha có trọng số bằng tổng trọng số các nút con Tính chât cây Huffman:

Nhánh trái tương ứng với mã hoá bit „0‟; nhánh phải tương ứng với mã hoá bit „1‟ Các nút có tần số thấp nằm ở xa gốc  mã bit dài

Các nút có tần số lớn nằm ở gần gốc  mã bit ngắn Sô nút của cây: (2n-1)

Thuật toán phát sinh cây:

[b1]: Chọn trong bảng 2 phần tử x,y có trọng số thấp  tạo thành nút cha z [b2] Loại bỏ nút x và y khỏi bảng.

[b3] Thêm nút z vào bảng.

[b4] Lặp lại bước [b1] - [b3] cho đến khi chỉ còn lại 1 nút duy nhất trong bảng

(*) Qui ƣớc:

Nút có trọng số nhỏ nằm nhánh trái; nút có trọng số lớn nằm nhánh phải.

Nếu trọng số bằng nhau, nút có ký tự nhỏ nằm nhánh trái; nút có ký tự lớn nằm nhánh phải

Nếu các nút có trọng số bằng nhau  ưu tiên xử lý các nút có ký tự ASCII nhỏ trước

Phát sinh mã bit cho các ký tự:

Mã của mỗi ký tự được tạo bằng cách duyệt từ nút gốc đến nút lá chứa ký tự đó; Khi duyệt sang trái, tạo ra 1 bit 0;

Khi duyệt sang phải, tạo ra 1 bit 1

Ví dụ: Giả sử có dữ liệu như sau:

f = “ADDAABBCCBAAABBCCCBBBCDAADDEEAA” Biểu diễn bình thường (8 bits/ký tự ):

Sizeof(f) = 10*8 + 8*8 + 6*8 + 5*8 + 2*8 = 248 bits Bảng 2.1: Thống kê các ký tự với số lần xuất hiện (adsbygoogle = window.adsbygoogle || []).push({});

Tạo cây Huffman

Hình 2.1: Các bước tạo cây Huffman Ký tự SL XH A 10 B 8 ED 7 C 6 Ký tự Số lần xuất hiện A 10 B 8 C 6 D 5 E 2 Ký tự SLXH CDE 13 A 10 B 8 Ký tự SL XH AB 18 CDE 13 Ký tự Số lần xuất hiện trong file f A 10 B 8 C 6 D 5 E 2 1 1

Hình 2.2: Cây Huffman sau khi tạo

Bảng 2.2: Mã hóa các ký tự bằng phương pháp mã hóa Huffman

f nén =

11011011111110100000101111111010000000 1010100001111110110110100101111

 Biểu diễn bảng mã có độ dài thay đổi (theo bảng):

Sizeof(f) = 10*2 + 8*2 + 6*2 + 5*3 + 2*3 = 69 bits

Thuật toán Huffman có ưu điểm là hệ số nén tương đối cao, phương pháp thực hiện tương đối đơn giản, đòi hỏi ít bộ nhớ, có thể xây dựng dựa trên các mảng bé hơn 64KB.

Nhược điểm của nó là phải chứa cả bảng mã vào tập tin nén thì phía nhận mới có thể giải mã được do đó hiệu suất nén chỉ cao khi ta thực hiện nén các tập tin lớn. Nhược điểm của phương pháp nén này có thể khắc phục bằng cách thực hiện nén một lần nhiều tập tin chuẩn bị truyền, làm như vậy coi như chúng ta đang thực hiện nén một tập tin lớn. 2.1.2.2- Mã hóa số học Ký tự Mã A 11 B 10 C 00 D 011 E 010

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: giả sử mẫu thứ tự là [X,Y] và P(X) = 2/3, P(Y) = 1/3.

Bảng 2.3: Các trường hợp xảy ra khi kết hợp các mẫu

X Y

XX XY YX YY

 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]

 Để 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].

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

 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 suấ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.

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

LZW là một phương pháp nén được phát minh bởi Lempel - Zip và Welch. Nó hoạt động đựa trên một ý tưởng rất đơn giản là người mã hoá và người giải mã cùng xây dựng bảng mã. Bảng mã này không cần được lưu kèm với dữ liệu trong quá trình nén, mà khi giải nén, người giải nén sẽ xây dựng lại nó.

Nguyên tắc hoạt động như sau:

Một xâu kí tự là một tập hợp từ hai kí tự trở lên.

Nhớ tất cả các xâu kí tự đã gặp và gán cho nó một dấu hiệu (token) riêng. Nếu lần sau gặp lại xâu kí tự đó, xâu kí tự sẽ được thay thế bằng dấu hiệu của nó.

Phần quan trọng nhất của phương pháp nén này là phải tạo một mảng rất lớn dùng để lưu giữ các xâu kí tự đã gặp (Mảng này được gọi là "Từ điển"). Khi các byte dữ liệu cần nén được đem đến, chúng liền được giữ lại trong một bộ đệm chứa (Accumulator) và đem so sánh với các chuỗi đã có trong "từ điển". Nếu chuỗi dữ liệu trong bộ đệm chứa không có trong "từ điển" thì nó được bổ sung thêm vào "từ điển" và chỉ số của chuỗi ở trong "từ điển" chính là dấu hiệu của chuỗi. Nếu chuỗi trong bộ đệm chứa đã có trong "từ điển" thì dấu hiệu của chuỗi được đem ra thay cho chuỗi ở dòng dữ liệu ra.

Có bốn qui tắc để thực hiên việc nén dữ liệu theo thuật toán LZW là: (adsbygoogle = window.adsbygoogle || []).push({});

Qui tắc 1: 256 dấu hiệu đầu tiên được dành cho các kí tự đơn (0 - 0ffh).

Qui tắc 2: So sánh với "từ điển" khi trong bộ đệm chứa đã có nhiều hơn hai kí tự. Qui tắc 3: Các kí tự ở đầu vào (Nhận từ tập tin sẽ được nén) được bổ sung vào bộ đệm chứa đến khi chuỗi kí tự trong bộ đệm chứa không có trong "từ điển".

Qui tắc 4: Khi bộ đệm chứa có một chuỗi mà trong "từ điển" không có thì chuỗi trong bộ đệm chứa được đem vào "từ điển". Kí tự cuối cùng của chuỗi kí tự trong bộ đệm chứa phải ở lại trong bộ đệm chứa để tiếp tục tạo thành chuỗi mới.

Trong thuật toán nén này, phần lớn thời gian khi bắt đầu nén chủ yếu mất vào việc tạo "từ điển". Khi "từ điển" đủ lớn, xác suất gặp chuỗi ở bộ đệm chứa trong "từ điển" tăng lên và càng nén được nhiều hơn. Một điều cần chú ý là mỗi một dấu hiệu, thì phải lưu một chuỗi trong "từ điển" để so sánh. Vì dấu hiệu được biểu diễn bằng một số 12 bits nên "từ điển" sẽ có 4096 lối vào, khi tăng số bit để biểu diễn dấu hiệu lên thì hiệu quả nén sẽ tốt hơn nhưng lại bị giới hạn bởi bộ nhớ của máy tính.

Ví dụ: khi dùng 16 bits để biểu diễn một dấu hiệu thì "từ điển" phải có đến 65536 lối vào, nếu mỗi lối vào có khoảng 20 kí tự thì "từ điển" phải lớn khoảng 1,2 MB. Với một từ điển có dung lượng như vậy rất khó có thể thực hiện trên các máy tính PC hoạt động dưới hệ điều hành DOS vì giới hạn của một đoạn (Segment) là 64KB.

Ưu điểm của phương pháp nén LZW là bên nhận có thể tự xây dựng bảng mã mà không cần bên gửi phải gửi kèm theo bản tin nén.

Nhược điểm của thuật toán này là tốn nhiều bộ nhớ, khó thực hiện dựa trên các mảng đơn giản (bé hơn 64KB).

2.1.3- Giải thuật nén có mất dữ liệu

2.1.3.1- Nén âm thanh dùng mô hình tâm lý

Thí nghiệm: đặt một người trong phòng yên tĩnh. Tăng mức to của âm 1kHz lên cho đến ngay khi có thể nghe được rõ ràng. Lặp lại thí nghiệm với các tần số khác nhau, ta vẽ được đồ thị sau:

Hình 2.3: Thí nghiệm đo ngưỡng nghe của tai người

“Ngưỡng nghe”: là mức mà dưới nó 1 âm thanh không thể nghe được. Nó thay đổi theo tần số âm thanh, và dĩ nhiên giữa mỗi người khác nhau. Hầu hết mọi người đều nhạy cảm ở mức 2 đến 5 kHz. Một người có nghe được âm thanh hay không tùy thuộc vào tần số của âm và độ to của âm đó ở trên hay dưới ngưỡng nghe tại tần số đó. Tai nhạy cảm ở mức 2 đến 5 kHz

Ngưỡng nghe cũng có tính thích nghi, thay đổi cố định bởi âm thanh mà ta nghe được. Ví dụ, một cuộc nói chuyện bình thường trong một phòng thì có thể nghe được rõ ràng ở điều kiện bình thường. Tuy nhiên, cũng cuộc trò chuyện đó nằm trong vùng lân cận của những tiếng ồn lớn, như là tiếng ồn do một chiếc máy khoan bên cạnh tai, là hoàn toàn không thể nghe được do lúc này ngưỡng nghe đã bị sai lệch. Khi máy khoan tắt thì ngưỡng nghe trở lại bình thường. Âm thanh mà ta không thể nghe được do sự thích nghi động của ngưỡng nghe gọi là bị “che” (masked).

Hiệu ứng che (masking): là âm lớn át âm bé, âm mạnh át âm yếu.

Hình 2.4: Minh họa cho hiệu ứng che

Âm bị che Âm mạnh 100 dB 80 60 40 20 0 20 50 100 Hz 500 1 2 5 kHz 20 100 phon 80 60 40 20 3

Khi nghe hai âm thanh mạnh yếu khác nhau với tần số khác nhau xảy ra cùng lúc, âm mạnh hơn có thể “che khuất” khiến tai không nghe được âm yếu hơn. Hiệu ứng này gọi là mặt nạ tần số (frequency masking).

Hình 2.5: Minh họa hiệu ứng che khuất tần số - mặt nạ tần số

Hiệu ứng mặt nạ thời gian: Tương tự như vậy, nếu âm yếu hơn được phát ra ngay trước hoặc ngay sau âm mạnh hơn thì cũng bị “che khuất”. Hiệu ứng này gọi là mặt nạ thời gian (temporal masking)

Hình 2.6: Minh họa hiệu ứng che khuất âm yếu - mặt nạ thời gian

Hình 2.7: Kết hợp hiệu ứng mặt nạ tần số với mặt nạ thời gian

Mức áp suất âm

Che sau Che trước

Thời gian che

100-200ms 10-30 Ngưỡng nghe bị dịch chuyển Ngưỡng nghe bị chuyển dịch Tín hiệu che Tín hiệu không

bị che Tín hiệu bị che Ngưỡng nghe f

Phương pháp nén: nghiên cứu thử nghiệm cho thấy: độ nhạy của tai khác nhau đối với các thành phần tần số khác nhau, nên có thể lợi dụng điều này để lượng tử hóa tín hiệu audio với số bit khác nhau cho mỗi băng con, dẫn đến số bit trung bình giảm xuống (hình 2.8)

Hình 2.8: Phân chia dải tần nghe được thành các băng con và lượng tử hóa các mẫu trong từng băng với số bit khác nhau.

2.1.3.2- Mã hóa dải con [3], [5],[7]

Bộ mã hóa dải con M kênh tổng quát được thể hiện trên hình vẽ 2.9. Mỗi kênh có một hệ số phân chia ni (i=0,1,..M-1). Tổ hợp [n0, n1, ...nM-1], gọi là tổ hợp phân chia. Thành phần chính trong SBC là băng lọc nhiều nhịp phân tích và tổng hợp. Trong mỗi băng lọc có 1bộ lọc thông thấp, 1 bộ lọc thông cao và M-2 bộ lọc thông dải. Bộ lọc phân tích chia dải tần của tín hiệu vào thành các dải con. Băng lọc tổng hợp có nhiệm vụ khôi phục lại dải tần tín hiệu vào từ các dải con (adsbygoogle = window.adsbygoogle || []).push({});

Hình 2.9: Sơ đồ mã hóa dải con tổng quát M kênh

LPF BPF1 y(n) LPF n0 BPF1 n1 x(n) )) n1 n0 Q, b0 Q, b1 BPFM-2 nM-2 BPFM-2 nM-2 Q, bM-2 HPF nM-1 HPF nM-1 Q, bM-1

Nguyên lý mã hóa dải con

Mã hóa dải con là thuật toán được áp dụng để nén tín hiệu âm thanh, thuật toán dùng mô hình tâm lý thính giác để lượng tử hóa thích nghi chỉ những thành phần tai người nghe được. Những thành phần tín hiệu dưới ngưỡng nghe tuyệt đối hoặc bị che bởi tín hiệu lớn hơn thì không được mã hóa

Tín hiệu âm thanh trong miền thời gian, được lấy trên những khoảng ngắn liên tiếp, đưa vào băng lọc số. Băng lọc số phân chia dải tần tín hiệu thành một số dải con nhất định. Độ rộng và phân bố của các dải con càng gần với các dải tới hạn của tai người càng tốt. Đồng thời các tín hiệu dải con lần lượt được đưa vào mô hình tâm lý thính giác. Mô hình tâm lý thính giác đánh giá phổ của từng dải con, sau đó so sánh với ngưỡng nghe để loại bỏ các thành phần mà tai người không nghe thấy

Hình 2.10: Nguyên lý mã hóa dải con

Các thông số kỹ thuật của mã hóa dải con

- Số kênh: SBC phân chia dải tín hiệu đầu vào tối thiểu thành 2 dải con. M càng lớn độ phân dải tần số càng cao, cấp phát bit cho dải con càng chính xác, hệ số nén tín hiệu sẽ tăng theo số kênh, do vậy số bộ lọc càng nhiều thì hệ thống càng phức tạp.

- Tổ hợp phân chia: Bộ mã hóa dải con M kênh tương ứng với M hệ số phân chia ni (i=0,1,..M-1). Nếu độ rộng dải tần là ∆f thì độ rộng dải con là ∆f/n0, ∆f/n1, ...∆f/nM-1

- Số bít trung bình trên một mẫu: Quá trình lượng tử hóa và mã hóa thực hiện theo từng dải con. Mỗi dải con được cấp phát một số bit nhất định tùy theo năng lượng tín hiệu trong dải con đó

1 M TB TB i o i b b n (2.1)

Mỗi dải con được cấp phát một số bit nhất định, với σ2

là phương sai của tín hiệu dải con thứ i, số bit trung bình trên một mẫu tín hiệu cấp cho dải con thứ i là bTbi(bit/mẫu) được xác định theo công thức [3]

2 2 1 1 2 0 1 log 2 ( ) i TBi TB M M i i b b (2.2)

Lỗi khôi phục: Méo của tín hiệu ra y(n) so với tín hiệu vào x(n) được gọi là lỗi khôi phục. Lỗi khôi phục được đánh giá qua lỗi trung bình bình phương[3]

2

( ) ( )

E x n y n (2.3)

Lỗi khôi phục trong mã hóa dải con M kênh [3]

1 1 2 2 0 . .2 TB i M n b i i c M (2.4)

2.1.3.3- Nén âm thanh theo chuẩn MPEG[6],[10],[2] Thuật toán nén âm thanh theo chuẩn MPEG bao gồm 3 bước: Thuật toán nén âm thanh theo chuẩn MPEG bao gồm 3 bước:

Bƣớc 1: tín hiệu audio PCM được chuyển sang miền tần số, toàn bộ dải phổ của nó được chia thành 32 băng con thông qua bộ lọc băng con

Lọc băng con: phổ của tín hiệu được chia thành các băng con có độ rộng dải thông bằng nhau (32 băng con trong mức I và II chuẩn MPEG). Tương tự như quá trình phân tích tần số của HAS (hệ thống thính giác của con người), chia phổ tín hiệu audio thành các băng giới hạn. Độ rộng của các băng tới hạn có thể thay đổi. Dưới 50Hz, độ rộng băng là 100Hz, và nó tăng tới vài kHz khi tần số tăng trên 10kHz. Dưới 500Hz, một băng con có tới vài băng tới hạn

Các bộ lọc băng con có một phần nhỏ gối lên nhau và thông thường sử dụng

Một phần của tài liệu Mã hóa và nén tín hiệu âm thanh ứng dụng trong phát thanh số (Trang 39)