MỤC LỤC
Thay vì thông báo vị trí đoạn văn lặp lại trong quá khứ, mã LZ78 đánh số tất cả các đoạn văn sao cho mỗi đoạn ghi nhận số hiệu đoạn văn lặp lại trong quá khứ cộng với một ký tự mà nó làm cho đoạn đó khác với đoạn trong quá khứ. Như chúng ta đã biết, một file ảnh GIF có thể có chứa nhiều ảnh.Mỗi một ảnh sẽ được mã hoá riêng.Chương trình giải mã sẽ lặp lại thao tác giải mã từng ảnh cho đến khi gặp mã kết thúc thông tin thì dừng lại.
Xác định các tham số khác nhau về tốc độ, dòng số sau khi nén, số mẫu trong header cho một kênh, cấu trúc thời gian khung, phương pháp mã hoá dự đoán và các chế độ làm việc. SMR (signal-mask rate) được sử dụng để xác định số bit cho quá trình lượng tử hoá đối với mỗi băng con với mục đích giảm thiểu dung lượng. – Side Info: Gồm phân bố bit: lớp 1 với 4 bits tuyến tính cho các băng con, lớp II 4 bits cho các băng con tần thấp, 3 bit tần trung và 2 bits tần cao; hệ số tỷ lệ là 6 bits/băng con kết hợp với phân bố bits và các bits mã hóa cho băng con đó để xác định giá trị, lớp III mã hóa âm thanh nổi.
• MPEG-2 sử dụng mã hoá cường độ cao, giảm xuyên âm, mã hoá dự đoán liên kênh và mã hoá ảo ảnh kênh trung tâm để nhận được tốc độ bit kết hợp 384 kbps. • Khung MPEG-2 được chia thành 2 phần, phần đầu là MPEG-1stereo, phần mở rộng MPEG-2 chứa tất cả những dữ liệu surround khác.
Thuật toán Shannon-Fano có hệ số nén tương đối tốt với các file dạng text nhưng do đặc tính của thuật toán và yêu cầu khá phức tạp nên hiếm khi được sử dụng. 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. Từ các đặc tính thuật toán của các loại mã nén trên, em nhận thấy rằng thuật toán mã hóa của Shannon-Fano và Huffman có nét tương đồng.
Tuy nhiên sự khác nhau về thuật toán làm cho hiệu suất nén (hệ số entropy) của Huffman và Shannon-Fano khác nhau. Do vậy, em sẽ tập trung nghiên cứu, xây dựng mô phỏng và đánh giá 2 loại mã nộn này để làm rừ ưu và nhược của 2 loại mó nộn trờn.
- Bước đầu tiên trong việc xây dựng mã Shannon-Fano là đếm số lần xuất hiện của mỗi kí tự trong tập tin sẽ được mã hoá (trong phần này chỉ ví dụ hạn chế một số ký tự). Nhược điểm của phương pháp này là bên nhận muốn giải mã được thông điệp thì phải có một bảng mã giống như bảng mã ở bên gửi, do đó khi nén các tập tin bé hệ số nén không được cao. Chương trình mã hóa nguồn dùng mã Shannon-Fano là chương trình dùng thuật toán Shannon-Fano (có trong lý thuyết truyền tin hay kỹ thuật truyền số liệu) để giải quyết bài toán mã hóa theo xác suất xuất hiện của các ký tự có trong bảng mã ASCII. Sau đó, dựa vào bảng mã này ta có thể mã hóa các chuỗi ký tự hay dòng văn bản ra thành mã máy tính gồm các ký tự 0 và 1. Các ký tự được mã hóa sẽ có độ dài khác nhau, tuy nhiên xét về tổng thể thì độ dài của chuỗi hay của văn bản đã được mã hóa sẽ ngắn hơn khi ta chưa mã hóa. Như vậy, khi lưu trữ sẽ ít tốn bộ nhớ hơn cũng như khi truyền tin sẽ chiếm ít băng thông hơn. Tổng thể cấu trúc của chương trình lần lượt sẽ thực hiện như sau :. Khai báo các hằng, biến toàn cục, các cấu trúc sẽ thực hiện trong suốt chương trình. char kytu;. float xacsuat;. Khai báo các chương trình con hay cấu trúc của các chương trình con : a) Hàm read: đọc file và thống kê xác suất hiện của nó : Ta tiến hành. đọc các ký tự từ file rồi tăng số lần xuất hiện lên, lưu vào trong mảng a. Mảng a là nơi để lưu trữ số lần xuất hiện của ký tự có trong file, vị trí trong mảng a là mã ASCII của ký tự đó. b) Hàm sapxeptang : Để sắp xếp theo số lần xuất hiện của ký tự trong mảng a theo hướng tăng dần. c) Hàm mahoa : Hàm này sẽ mã hóa nguồn dùng mã Shannon-Fano các ký tự có số lần xuất hiện lớn hơn 0 trong file. Mỗi ký tự đều có 1 mã bằng nhị phân riêng. d) Hàm giaima: Giải mã file đã mã hóa theo bảng mã. e) Hàm insapxep: In các ký tự sau khi đã sắp xếp theo xác suất xuất hiện ra màn hỡnh để tiện theo dừi. f) Hàm thuchien: Đây là hàm làm công việc chính của chương trình. Hàm này sẽ thực hiện công việc mã hóa file rồi lưu vào file khác mã của chương trình nén. g) Hàm main: chứa các thông tin cần thiết của đề tài và thực hiện gọi các chương trình con. a) Hàm sắp xếp : Hàm này sẽ tiến hành sắp xếp lại các ký tự theo xác suất xuất hiện đã có ở trên theo thứ tự giảm dần nhằm phục cho quá trình mã hóa các ký tự này theo thuật toán Shannon-Fano. b) Hàm mã hóa : Hàm này có nhiệm vụ tối quan trọng đối với bài toán này.
• Như vậy, sau khi hoàn tất các bước trên, ta có được 1 bảng mã với các chữ cái được gắn với một mã tương ứng nhất định, các mã này sẽ không trùng nhau. Nếu có thì lưu vào trong mảng d và tiếp tục làm bước 1 nhưng vị trí đầu tiên là vị trí kế tiếp (chưa kiểm tra) , nếu không có thì tiếp tục bước 2. • Bước 3 : Kiểm tra xem nếu kiểm tra đến phần tử cuối cùng mà không thấy trùng với phần tử nào trong bảng mã thì phát thông báo “ Dữ liệu nhập vào bị lỗi”. Làm đến khi không còn phần tử nào trong mảng thì dừng. • Bước 4 : in các ký tự vừa được giải mã hoặc thông báo lỗi lên màn hình. d) Hàm main : Hàm này hiển thị thông tin người thực hiện đề tài….
• Như vậy thực chất quá trình trên là ta xây dựng một cây nhị phân từ tập hợp các ký tự muốn mã hoá, cuối cùng ta được một cây nhị phân có lá là các ký tự đó. Ý tưởng của giải thuật mã hoá cũng hết sức đơn giản, ta tìm bộ mã cho các kí tự sao cho các kí tự có tần suất xuất hiện cao (xác suất xuất hiện là lớn) sẽ được mã ngắn (gần với gốc) để độ dài trung bình để mã hoá một kí tự là nhỏ nhất. - Duyệt từng ký tự còn lại của xâu, nếu gặp ký tự nào đã có trong mảng a[i].kytu thì tăng a[i].tansuat lên 1, nếu chưa có ký tự đó thì thêm phần tử mới vào mảng và cho tần số tương ứng bằng 1.
- Đọc từng ký tự của chuỗi (hoặc file), gặp phần tử nào thì hiển thị xâu mã hóa tương ứng hoặc ghi thêm xâu mã hóa tương ứng của ký tự đó vào file đã mã hóa (fileout). - Duyệt cây Huffman từ trên xuống, gặp 0 thì nhảy xuống con trái, gặp 1 thì nhảy xuống con phải, cho tới khi gặp node có thành phần kytu khác -1.
- Đảo ngược a[i].code bằng hàm strrev(), ta được xâu mã hóa của ký tự tương ứng. Gọi hàm “insapxep” để mã hóa nguồn tin và in bảng mã ra màn hình. Gọi hàm “thuchien” để thực hiện mã hóa nguồn tin, đưa ra tỉ lệ nén.
Thống kê tần suất xuất hiện và bảng mã của Shannon-Fano trong ví dụ 1.
- Hai thuật toán nén trên đều sử dụng phương pháp nén dữ liệu bằng cách mã hóa các ký tự sao cho số lần xuất hiện của ký tự tỉ lệ nghịch với số bits được mã hóa, làm cho dữ liệu được lưu trữ hay truyền đi có kích thước nhỏ hơn rất nhiều so với ban đầu. Với những file text có dung lượng tương đối lớn trở lên thì chúng ta có thể nhìn thấy rằng mã nén Huffman vượt trội về khả năng nén dữ liệu do thuật toán nén của Huffman giảm được lượng tin tốt hơn. Với phần mô phỏng thuật toán nén dữ liệu với mã Shannon-Fano và Huffman, em đã phần nào đúc kết được ưu và nhược điểm của 2 thuật toán này qua việc so sánh thuật toán và tỉ lệ nén của nó.
- Chưa thực hiện được việc so sánh một cách tổng quát và trực quan của tất cả các loại mã nén hiện nay, dẫn đến việc chưa đua ra được kết luận loại mã nén nào là tối ưu, mã nén nào là thông dụng nhất hiện nay. Một số nội dung trong phần hạn chế em sẽ tiếp tục hoàn thành trong thời gian tới như nén dữ liệu với nhiều dạng file khác, nén dữ liệu với folder và nghiên cứu, cải tiến thuật toán nén nhanh hơn, có giao diện đẹp mắt hơn và dễ sử dụng vào thực tế hơn.