Phương pháp mã hoá và nén âm thanh theo chuẩn Mpeg, từ đó dựa trên một số source code (viết bằng C) viết lại bằng ngôn ngữ Visual C++ - Đỗ Văn Tuấn

pdf 79 trang huongle 4270
Bạn đang xem 20 trang mẫu của tài liệu "Phương pháp mã hoá và nén âm thanh theo chuẩn Mpeg, từ đó dựa trên một số source code (viết bằng C) viết lại bằng ngôn ngữ Visual C++ - Đỗ Văn Tuấn", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfphuong_phap_ma_hoa_va_nen_am_thanh_theo_chuan_mpeg_tu_do_dua.pdf

Nội dung text: Phương pháp mã hoá và nén âm thanh theo chuẩn Mpeg, từ đó dựa trên một số source code (viết bằng C) viết lại bằng ngôn ngữ Visual C++ - Đỗ Văn Tuấn

  1. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình  CHUYÊN ĐỀ THỰC TẬP TỐT NGHIỆP Phương pháp mã hố và nén âm thanh theo chuẩn Mpeg, từ đĩ dựa trên một số source code (viết bằng C) viết lại bằng ngơn ngữ Visual C++ SVTH: Đỗ Văn Tuấn Trang 1
  2. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Mục lục 1 Lời nĩi đầu 3 PHẦN I . LÝ THUYẾT 4 CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN VỀ ÂM THANH 5 I. NHỮNG KHÁI NIỆM CƠ BẢN - SĨNG CƠ 6 1.1. Sự hình thành sĩng trong mơi trường đàn hồi 6 1.2. Các đặc trưng của sĩng 7 1.3. Phương trình sĩng 8 II. SĨNG ÂM VÀ ĐẶC TÍNH ÂM THANH 8 2.1 Dao động âm và sự truyền dao động. 8 2.2 Đơn vị vật lý của âm thanh. 9 2.3. Đặc tính sinh lý về sự cảm thụ âm. 12 CHƯƠNG 2. WAVE FILE 16 I. MULTIMEDIA WINDOWS. 16 II. CẤU TRÚC WAVE FILE. 17 2.1 RIFF file 17 2.2 Cấu trúc File Wave 17 III. ĐỌC RIFF FILES 21 CHƯƠNG 3. LÝ THUYẾT XỬ LÝ TÍN HIỆU SỐ 25 I. TÍN HIỆU VÀ HỆ THỐNG RỜI RẠC 25 1. Giới thiệu 25 2. Đáp ứng xung trong hệ TTBB 25 3. Tính chất của tổng chập của hệ TTBB 26 4. Hệ nhân quả 27 5. Tính ổn định 27 6. Phương trình sai phân tuyến tính hệ số hằng 28 7. Biểu diễn các hệ rời rạc trong miền tần số 28 8. Định lý lấy mẫu Shannon 30 II. PHÉP BIẾN ĐỔI FOURIER RỜI RẠC 30 1. Chuỗi Fourier rời rạc của tín hiệu rời rạc tuần hồn 30 2. Biến đổi Fourier rời rạc của tín hiệu cĩ độ dài hữu hạn 31 3. Phép biến đổi nhanh Fourier (FFT) 32 CHƯƠNG 4. GIỚI THIỆU VỀ MPEG. 33 I. GIỚI THIỆU. 33 1. MPEG là gì? 33 2. So sánh các chuẩn MPEG 33 3. Am thanh MPEG 34 4. Các khái niệm cơ bản 35 5. Hoạt động 38 II. CÁC KHÁI NIỆM TRONG ÂM THANH MPEG 40 1. Lược đồ mã hĩa Perceptual Sub-band 40 2. Giải thích hiệu qủa che (masking efficiency) 41 3. Các lớp của âm thanh MPEG 43 III. CÁC THƠNG SỐ 45 CHƯƠNG 5. CÁC GIẢI THUẬT NÉN ÂM THANH 50 I. LÝ THUYẾT THƠNG TIN 50 SVTH: Đỗ Văn Tuấn Trang 2
  3. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình II. CÁC GIẢI THUẬT NÉN KHƠNG CĨ TỔN THẤT 51 1. Mã hĩa Huffman 51 2. Mã hĩa Huffman sửa đổi 53 3. Mã hĩa số học 54 4. Giải thuật Lempel-Ziv-Welch (LZW) 55 III. CÁC GIẢI THUẬT NÉN CĨ TỔN THẤT 57 1. Các phương pháp nén âm thanh đơn giản 57 2. Nén âm thanh dùng mơ hình âm tâm lý 57 3. Nén âm thanh theo chuẩn MPEG 58 PHẦN II. THIẾT KẾ CHƯƠNG TRÌNH 60 CHƯƠNG 6. LƯU ĐỒ GIẢI THUẬT VÀ CẤU TRÚC DỮ LIỆU 61 I. SƠ ĐỒ KHỐI. 61 II. CẤU TRÚC DỮ LIỆU VÀ ĐỊNH NGHĨA 62 A. CẤU TRÚC DỮ LIỆU 62 1. Các cấu trúc về file 62 2.Các cấu trúc về dịng bít dữ liệu 63 3.Các cấu trúc để định dạng dịng bít dữ liệu 63 4.Các cấu trúc huffmancodetab. 67 5.Các cấu trúc tính MDCT 67 6.Các cấu trúc scalefac_struct 67 B. CÁC ĐỊNH NGHĨA 68 1.Các định nghĩa dùng trong truy xuất dữ liệu 68 2.Các định nghĩa dùng trong tính tốn FFT 68 3.Các định nghĩa dùng trong định dạng dịng dữ liệu 68 4.Các định nghĩa dùng trong bộ mã hố Huffman 68 5.Các định nghĩa dùng trong phân tích dữ liệu 69 6.Các định nghĩa dùng trong mơ hình âm tâm lý 69 7.Các định nghĩa dùng trong truy xuất nhập dữ liệu 69 8.Các định nghĩa dùng trong cấu trúc file Wave và file Mpeg 69 III. LƯU ĐỒ 71 CHƯƠNG 7: GIAO DIỆN VÀ THUYẾT MINH CHƯƠNG TRÌNH 75 I. GIỚI THIỆU 75 II. GIAO DIỆN 75 III.CHƯƠNG TRÌNH 77 TÀI LIỆU THAM KHẢO 87 SVTH: Đỗ Văn Tuấn Trang 3
  4. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Lời nĩi đầu Cơng nghệ thơng tin là ngành cơng nghiệp mũi nhọn của thế giới nĩi chung và của việt nam nĩi riêng, nĩ đã phát triển mạnh mẽ khơng ngừng trong những năm gần đây. Khi đời sống được nâng lên khoa học kỹ thuật phát triển nhu cầu về giải trí cũng đa dạng lên, các loại hình giải trí khơng ngừng gia tăng và ngày càng phong phú, đa dạng các loại hình giải trí như: trị chơi điện tử, nghe nhạc xem phim, xem ca nhạc(video), và đặc biệt là những trong chơi dạng khơng gian ba chiều. Sự phát triển ồ ạt này đã dẫn tới ngành cơng nghệ phần cứng đã khơng thể đáp ứng được những địi hỏi về lưu trữ, đồng hành với sự phát triển này là mạng máy tính đĩ chính là Internet ngày càng phát triển số lượng người tham gia truy cập ngày càng lớn và nhu cầu của họ thì ngày càng phong phú và đa dạng về tất cả các loại hình nĩi trên. Do đĩ tốc độ truy cập, tốc độ truyền tải trên mạng được quan tâm hơn để cho người dùng khơng phải sốt ruột ngồi chờ những trang web mà mình truy cập, họ khơng phải bực mình khi download những file âm thanh và những bài hát mà họ ưa thích vì đường truyền quá chậm trong khi cơng nghệ phần cứng đã phát triển mạnh. Chính vì vậy các nhà nghiên cứu phần mềm đã chú ý đến việc phát triển phần mềm để hỗ trợ phần cứng. Họ đã tạo ra những chương trình phần mềm hỗ trợ tích cực phần cứng, từ đĩ đã ra đời những phần mềm nén âm thanh, hình ảnh, nén video, tách âm thanh từ những file video để tạo ra những dạng âm thanh, hình ảnh, video như mindi, mpeg, mp3, mp4 những file ảnh dạng gif, jpeg với dung lượng lưu trữ vơ cùng nhỏ mặc dù chất lượng cĩ giảm đi đơi chút nhưng khơng đáng kể so với những gì nĩ đạt được để truyền tải, truy cập nhanh hơn. Sự tồn tại của chuẩn JPEG (Joint Photographic Experts Group) chỉ để giảm tốc độ bit và chủ yếu phục vụ cho hình ảnh, rõ ràng là khơng đủ đáp ứng cho hình ảnh động cĩ kèm âm thanh. Để đáp ứng nhu cầu của thị trường, một nhĩm các chuyên gia về hình ảnh động (Moving Picture Experts Group), gọi tắt là MPEG, được thành lập để nghiên cứu đưa ra những lược đồ mã hĩa phù hợp cho việc truyền hình ảnh động và ghi lại chúng theo tiêu chuẩn trong các thiết bị lưu trữ số như CD-ROM, Video CD Phần trình bày của luận văn chỉ nằm trong khuơn khổ "Am thanh". Do đĩ mọi vấn đề liên quan tới hình ảnh sẽ khơng được đề cập tới, dù chuẩn MPEG là dùng cho cả âm thanh và hình ảnh. Mục tiêu của đề tài chủ yếu chỉ để tìm hiểu về các phương pháp mã hố và nén âm thanh theo chuẩn Mpeg, từ đĩ dựa trên một số source code (viết bằng C) đã cĩ trên mạng Internet viết lại bằng ngơn ngữ Visual C++, nhằm hiểu sâu hơn về giải thuật, đồng thời tạo ra một giao diện thân thiện hơn. Do trình độ và kiến thức cĩ hạn nên khơng tránh khỏi những thiếu sĩt, em kính mong thầy tham gia và giúp đỡ em để em hồn thành được tốt hơn. SVTH: Đỗ Văn Tuấn Trang 4
  5. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Em xin chân thành cám ơn thầy đã tạo điều kiện thuân lợi nhất giúp em hồn thành báo cáo này. PHẦN I LÝ THUYẾT CƠ BẢN SVTH: Đỗ Văn Tuấn Trang 5
  6. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình CHUƠNG 1. CÁC KIẾN THỨC CƠ BẢN VỀ ÂM THANH. I. NHỮNG KHÁI NIỆM CƠ BẢN - SĨNG CƠ 1.1. Sự hình thành sĩng trong mơi trường đàn hồi. a. Định nghĩa: Các mơi trường chất khí, chất lỏng, chất rắn là mơi trường đàn hồi. Mơi trường đàn hồi cĩ thể coi là những mơi trường liên tục gồm những phân tử liên kết chặt chẽ với nhau, lúc bình thường mỗi phân tử cĩ một vị trí cân bằng bền. b. Sự hình thành sĩng trong mơi trường đàn hồi: Do tính chất của mơi trường đàn hồi, cho nên nếu tác dụng lên phân tử nào đĩ của mơi trường thì phân tử này rời khỏi vị trí cân bằng bền. Do tương tác, các phân tử lân cận một mặt kéo phân tử A về vị trí cân bằng, mặt khác nhận một phần năng lượng do phân tử A truyền sang, do đĩ cũng dao động theo, hiện tượng này xảy ra liên tiếp tạo thành sĩng. Sĩng đàn hồi (sĩng cơ) là sự lan truyền dao động trong mơi trường đàn hồi. Sĩng cơ khơng thể truyền được trong chân khơng, vì chân khơng khơng phải là mơi trường đàn hồi. Cần lưu ý trong khi truyền dao động, các phân tử của mơi trường khơng di chuyển theo các dao động được lan truyền mà chỉ dao động quanh vị trí cân bằng của nĩ. c. Một số khái niệm về sĩng: Nguồn sĩng: là ngoại vật gây ra kích động sĩng. Tia sĩng: là phương truyền sĩng. Mơi trường sĩng: là khơng gian mà sĩng truyền qua. Mặt sĩng: là mặt chứa những điểm (phân tử) cĩ cùng trạng thái dao động tại một thời điểm nào đĩ. Tia sĩng luơn vuơng gĩc với mặt sĩng. Sĩng cầu: mặt sĩng là những mặt cầu phân bố đều trong khơng gian, tâm là nguồn sĩng. Trong mơi trường đồng chất và đẳng hướng sẽ cĩ sĩng cầu. Đối với sĩng cầu tia sĩng trùng với bán kính của mặt cầu. Sĩng phẳng: mặt sĩng là những mặt phẳng song song nhau, tia sĩng vuơng gĩc với mặt sĩng. Nếu nguồn sĩng ở rất xa mơi trường đang xét thì mặt sĩng cĩ thể coi là những mặt phẳng song song. SVTH: Đỗ Văn Tuấn Trang 6
  7. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Sĩng dọc: là sĩng trong đĩ các phân tử của mơi trường dao động quanh vị trí cân bằng trên phương trùng với tia sĩng. Khi cĩ sĩng dọc, trên phương của tia sĩng các phân tử của mơi trường khi thì bị nén chặt, khi thì giãn ra làm cho các phân tử của mơi trường cĩ chỗ dày chỗ thưa. Sĩng ngang: là sĩng trong đĩ các phân tử của mơi trường dao động quanh vị trí cân bằng trên phương vuơng gĩc với tia sĩng. d. Nguyên nhân gây ra sĩng ngang và sĩng dọc: Tùy tính chất của mơi trường đàn hồi mà trong đĩ cĩ thể xuất hiện sĩng ngang hay sĩng dọc. - Khi một lớp của mơi trường bị lệch đối với lớp khác làm xuất hiện các lực đàn hồi cĩ xu hướng kéo lớp bị lệch về vị trí cân bằng thì trong mơi trường đĩ cĩ thể truyền được sĩng ngang. Vậy vật rắn là một mơi trường cĩ tính chất đĩ. - Nếu trong mơi trường khơng cĩ các lực đàn hồi khi các lớp song song bị lệch đối với nhau thì sĩng ngang khơng thể hình thành được. Chất lỏng và chất khí là những mơi trường đĩ. - Khi bị biến dạng nén hay căng mà trong mơi trường cĩ các lực đàn hồi xuất hiện thì trong mơi trường đĩ cĩ thể truyền được sĩng dọc. Chẳng hạn khi bị nén, chất lỏng hay chất khí sẽ tăng áp suất, lực nén giữ vai trị lực đàn hồi. Như vậy trong chất lỏng và chất khí chỉ cĩ sĩng dọc truyền được, cịn trong chất rắn cĩ thể truyền được cả hai loại sĩng. 1.2. Các đặc trưng của sĩng. a. Vận tốc truyền sĩng (C) : Là quãng đường mà sĩng truyền được trong một đơn vị thời gian. b. Bước sĩng : Là quãng đường mà sĩng truyền được sau một thời gian bằng 1 chu kỳ T. Như vậy  là khoảng cách bé nhất giữa các phân tử dao động cùng pha. Theo định nghĩa ta cĩ :  = CT. c. Chu kỳ và tần số: Chu kỳ T là thời gian cần thiết để sĩng truyền được 1 bước sĩng . Tần số f là số chu kỳ thực hiện được trong 1 giây : SVTH: Đỗ Văn Tuấn Trang 7
  8. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình F = 1/T (Hz) 1.3. Phương trình sĩng. Sĩng phẳng truyền dọc theo phương OY với vận tốc C thì phương trình sĩng biểu thị mối quan hệ giữa độ chuyển dời X của phân tử dao động kể từ vị trí cân bằng với thời gian t và khoảng cách y đến các vị trí cân bằng các phân tử dao động trên phương truyền sĩng như sau : X = asin(t – y/c) Nếu sĩng phẳng truyền theo hướng ngược với hướng tính khoảng cách y thì : X = asin(t + y/c) Đối với sĩng cầu thì biên độ a của dao động sĩng tại vị trí cách nguồn bằng bán kính r, tỉ lệ nghịch với r, phương trình sĩng cĩ dạng: a X = /r sin(t – r/c) II. SĨNG ÂM. 2.1. Dao động âm và sự truyền dao động. Sĩng âm là một loại sĩng cơ cĩ biên độ dao động nhỏ mà thính giác nhận biết được. Thí dụ dao động phát ra từ dây đàn, mặt trống đang rung động. Sĩng âm là một loại sĩng cơ nên mọi khái niệm và hiện tượng về dao động và sĩng cơ trên đây đều áp dụng cho sĩng âm. Trong khơng khí cũng như trong mọi chất khí khác, những dao động truyền đi dưới dạng sĩng dọc, khi đến tai người những dao động cĩ tần số từ 16 đến 20000 Hz sẽ gây cảm giác đặc biệt về âm. Các dao động đàn hồi cĩ tần số f>20.000 Hz là sĩng siêu âm. Các dao động đàn hồi cĩ tần số f<16 Hz là sĩng hạ âm Mỗi âm cĩ một tần số riêng, đơn vị của tần số là héc (Hz) với định nghĩa:”Héc là tần số của một qúa trình dao động âm trong đĩ mỗi giây thực hiện được một dao động”. 1 Héc (Hz) = 1 dao động / 1 giây Việc phân chia sĩng hạ âm, sĩng siêu âm và sĩng âm (âm thanh) liên quan tới khả năng sinh lý của thính giác 2.2. Đơn vị vật lý của âm thanh. SVTH: Đỗ Văn Tuấn Trang 8
  9. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Âm thanh hay tiếng động mà con người nhận biết được do tác động của sĩng âm lên màng nhĩ tai. Các dao động âm phát ra từ nguồn lan truyền trong mơi trường đàn hồi như khơng khí dưới dạng sĩng đàn hồi gọi là sĩng âm. Sĩng âm đến kích động màng nhĩ tai gây cảm giác về âm, do đĩ cần phân biệt hai loại đại lượng về âm: - Đại lượng âm khách quan: những đại lượng thuần túy vật lý, khơng phụ thuộc vào tai người. - Đại lượng âm chủ quan: những đại lượng tâm lý vật lý phụ thuộc vào tai người. 2.2.1. Đơn vị âm khách quan: a. Ap suất âm: Khi sĩng âm tới một mặt nào đĩ, do các phân tử mơi trường dao động tác dụng lên mặt đĩ một lực gây ra áp suất. Ap suất ở đây là áp suất dư do sĩng âm gây ra ngồi áp suất khí quyển. Trong phạm vi nghe được, áp suất âm trong khoảng từ 2.10-4 đến 2.102 bar, chênh lệch 106 lần, đĩ là một phạm vi rất rộng. b. Cường độ âm (I): - Cường độ âm ở một điểm nào đĩ trên phương đã cho trong trường âm là số năng lượng âm đi qua đơn vị diện tích của mặt S vuơng gĩc với phương truyền âm, tại điểm đĩ trong đơn vị thời gian. - Một vài cường độ âm đáng chú ý: Người nĩi thường I = 2.10-3 W/m2 Cịi ơ-tơ I = 5 W/m2 Cịi báo động I = 3.000 W/m2 - Trong điều kiện chuẩn (to = 20oC, áp suất 760mmHg): Vận tốc âm trong khơng khí : C = 340 m/s = 0,00121 gr/cm3.  = Cp/Cv = 1,4 SVTH: Đỗ Văn Tuấn Trang 9
  10. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình - Trong tính tốn người ta quy ước lấy âm đơn tần số f = 1000 Hz làm chuẩn để so sánh (gọi là âm chuẩn). - Đối với âm chuẩn, trong phạm vi nghe được -4 Áp suất âm nhỏ nhất Pmin = 2.10 bar -16 2 Cường độ âm nhỏ nhất Imin = 10 W/cm . - Ap suất âm và cường độ âm lớn nhất mà tai người cĩ thể chịu được là: 2 Pmax = 2.10 bar -4 2 Imax = 10 W/cm . -12 - Cơng suất âm nhỏ nhất cĩ thể nghe thấy được Wmin = 10 Watt. 2.2.2. Đơn vị âm chủ quan: Tai người trung bình cĩ thể nhận được những sĩng âm cĩ tần số từ 16 đến 20000 Hz, hiệu qủa này cĩ liên quan tới khả năng sinh lý của tai người. Như vậy, âm thanh là một hiện tượng tâm lý vật lý, khơng phải bất cứ sĩng âm nào tới tai cũng gây ra cảm giác âm thanh như nhau. Am cĩ tần số khác nhau gây ra cảm giác khác nhau. Cường độ âm nhỏ nhất của một sĩng âm xác định mà tai người nghe thấy được gọi là “Ngưỡng nghe”. Am cĩ tần số khác nhau giá trị ngưỡng nghe cũng khác nhau. Tai người thính nhất với âm cĩ tần số trong khoảng từ 1000 đến 3000 Hz, trong phạm vi này cường độ âm ngưỡng nghe nhỏ nhất. Những tần số khác, tai kém thính hơn, ngưỡng nghe cĩ giá trị lớn hơn. Đối với âm chuẩn, cường độ và áp suất ở ngưỡng nghe bằng: -5 2 Po = 2.10 N/ m . -12 2 Io = 10 W/m . Do cảm giác âm thanh phụ thuộc vào đặc tính sinh lý của tai người, cho nên phải cĩ một số đại lượng đặc trưng cho cảm giác âm thanh phụ thuộc vào tai người, những đại lượng như vậy gọi là đại lượng âm chủ quan. a. Bel và decibel (db): SVTH: Đỗ Văn Tuấn Trang 10
  11. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Theo định lý sinh lý của Vebe-Fécne, cảm giác nghe to đối với một âm khơng tỉ lệ thuận với cường độ âm của âm đĩ. Khi cường độ âm tăng từ Io tới I thì cảm giác nghe to tăng tỉ lệ với lg(I/Io). Do đĩ người ta dùng thang lơ-ga-rít cơ số 10 để đo mức cảm giác so với mức ngưỡng. Mức ngưỡng gọi là mức zero qui ước : -12 -12 lg(I/Io) = lg(10 / 10 ) = 0 bel. Đơn vị là Bel hay db. 10db = 1 bel. b. Mức cường độ âm (LI): Nếu gọi I là cường độ âm của âm đang xét và Io là cường độ âm của mức zero qui ước của âm chuẩn thì mức cường độ âm LI bằng : LI = 10lg(I/Io) db I tính bằng W/m2. c. Mức áp suất âm (Lp): Mức áp suất âm suy dẫn từ mức cường độ âm Lp = 20lg(P/Po) db. Trong đĩ: P :áp suất âm cĩ ích của âm đang xét (N/m2) Po:áp suất âm của âm chuẩn ở ngưỡng nghe. Thực tế áp suất âm là đại lượng cơ bản hơn cường độ âm, nên thường dùng mức áp suất âm sau đĩ suy ra mức cường độ âm. Đơn vị chung là bel hay db. Đơn vị này cũng dùng để đo mức cơng suất, mức năng lượng âm. Vài mức áp suất âm đáng chú ý : Nĩi chuyện thường : 30db. Nĩi chuyện to : 70db. 2.2.3. Quãng độ cao (quãng tần số): Quãng tần số của hai âm là khoảng cách tần số của hai âm đĩ. Nếu một x âm tần số là f1, một âm khác tần số là f2 (f2 > f1) thì f2 / f1 = 2 . Khi x=1 tức f2 / f1 = 2 gọi là 1 quãng tần số (hay 1 ốc-ta). Khi x=1/2 tức f2 / f1 = 1.41 gọi là nửa ốc-ta. SVTH: Đỗ Văn Tuấn Trang 11
  12. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Khi x=1/3 tức f2 / f1 = 1.26 gọi là 1/3 ốc-ta. - Mức áp suất âm của 1 ốc-ta bằng mức áp suất âm của 1/2 ốc-ta cộng thêm 3db. - Mức áp suất âm của 1 ốc-ta bằng mức áp suất âm của 1/3 ốc-ta cộng thêm 5db. Vì quãng tần số của một âm qui định độ cao của âm đĩ nên cịn gọi là quãng độ cao. Theo tập quán âm nhạc thì quãng độ cao gọi là quãng 8 (bát độ). Chẳng hạn âm LA, tần số f=440 Hz tăng 1 bát độ là tăng gấp đơi tần số, tức là 880 Hz. Trong thực tế thường gặp những âm phức tạp bao gồm nhiều tần số. Tập hợp tất cả những tần số cấu tạo trong một âm thanh gọi là “tần phổ” của âm đĩ, tần phổ cĩ thể gián đoạn hay liên tục. Một âm cĩ tần phổ liên tục được đặc trưng bằng “Mức tần phổ B” với định nghĩa: - Mức tần phổ là mức áp suất âm trong chiều rộng của dải tần số bằng 1. - Một âm cĩ mức tần phổ B khơng đổi với mọi tần số gọi là tiếng ồn trắng. - Một âm cĩ tần phổ gián đoạn được đặc trưng bằng “mức dải tần số” với định nghĩa: mức dải tần số là mức áp suất âm trong chiều rộng của dải tần số lớn hơn 1 Hz. 2.3. Đặc tính sinh lý về sự cảm thụ âm thanh. 2.3.1. Mức to, độ to, mức âm cảm giác: Mức áp suất âm, mức cường độ âm trên đây vừa mang tính chất chủ quan vừa mang tính chất khách quan vì những đại lượng này xác định từ những đại lượng thuần túy vật lý. Vấn đề cĩ ý nghĩa to lớn trong thực tế là cần biết được sức mạnh của âm thanh đo bằng tai người. Mức to, độ to của một âm là sức mạnh cảm giác do âm thanh gây nên trong tai người, nĩ khơng những phụ thuộc vào áp suất âm mà cịn phụ thuộc vào tần số của âm đĩ. Thí dụ 2 âm cĩ tần số 100 Hz và 1000 Hz áp suất âm đều bằng 0,02 bar nhưng nghe to nhỏ khác nhau, âm 1000 Hz nghe to hơn âm 100 Hz. Muốn nghe to bằng âm 1000 Hz thì âm 100 Hz phải cĩ áp suất bằng 0,25 bar. Như vậy tai người khơng nhạy đối với âm 100 Hz bằng âm 1000 Hz. Tần số càng thấp tai người càng kém nhạy. a. Mức to: SVTH: Đỗ Văn Tuấn Trang 12
  13. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình - Để biểu thị mức to trên cảm giác chủ quan, ta dùng đại lượng “mức to”, đơn vị là “Fơn” với định nghĩa như sau : Fơn là mức to của âm chuẩn, về giá trị bằng mức áp suất âm của âm chuẩn tức là : L = 20lg P/Po (Fơn). - Vậy mức to của một âm bất kỳ đo bằng Fơn, về giá trị bằng mức áp suất âm của âm chuẩn đo bằng db cĩ cùng mức to với âm đĩ. Thí dụ: âm cĩ tần số 500 Hz mức áp suất âm bằng 25 db và âm cĩ tần số 50 Hz mức áp suất âm bằng 64 db sẽ cĩ cùng mức to bằng 20 Fơn, bằng mức to của âm 1000 Hz mức áp suất bằng 20 db. - Muốn biết mức to của một âm bất kỳ phải so sánh với âm chuẩn. - Đối với âm chuẩn, mức to ở ngưỡng nghe là 0 Fơn, ngưỡng chĩi tai là 120 Fơn. - Cùng một giá trị áp suất, âm tần số càng cao, mức to càng lớn. b. Độ to: - Khi so sánh âm này to hơn âm kia bao nhiêu lần, dùng khái niệm “độ to” đơn vị là “Sơn” với định nghĩa như sau: Số lượng Sơn biểu thị số lần mạnh hơn của một âm nào đĩ so với âm chuẩn mà tai người cĩ thể phân biệt được. - Độ to là một thuộc tính của thính giác, cho phép phán đốn tính chất mạnh yếu của âm thanh. Căn cứ vào độ to mà sắp xếp âm từ nhỏ tới to. - Mức to tăng 10 Fơn thì độ to tăng gấp đơi và ngược lại. 2.3.2. Am điệu và âm sắc: Âm điệu chỉ âm cao hay thấp, trầm hay bổng. Âm điệu chủ yếu phụ thuộc vào tần số của âm, tần số càng cao, âm nghe càng cao, tần số càng thấp âm nghe càng trầm. Âm sắc chỉ sắc thái của âm du dương hay thơ kệch, thanh hay rè, trong hay đục. Âm sắc phụ thuộc vào cấu tạo của sĩng âm điều hịa, biểu thị bằng số lượng các loại tần số, cường độ và sự phân bố của chúng quanh âm cơ bản. Âm sắc cĩ quan hệ mật thiết với cường độ, âm điệu và thời gian âm vang, sự trưởng thành và tắt dần của trường âm. SVTH: Đỗ Văn Tuấn Trang 13
  14. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Khi hai ca sĩ cùng hát một câu ở cùng một độ cao, ta vẫn phân biệt được giọng hát của từng người. Khi đàn ghi-ta, sáo, kèn cùng tấu lên một đoạn nhạc ở cùng một độ cao, ta vẫn phân biệt được tiếng của từng nhạc cụ. Mỗi người, mỗi nhạc cụ phát ra những âm cĩ sắc thái khác nhau mà tai ta phân biệt được. Đặc tính đĩ của âm chính là âm sắc. Âm sắc là một đặc tính sinh lý của âm, được hình thành trên cơ sở các đặc tính vật lý của âm là tần số và biên độ. Thực nghiệm chứng tỏ rằng khi một nhạc cụ phát ra một âm cĩ tần số f1 thì đồng thời cũng phát ra các âm cĩ tần số f2=2f1, f3=3f1 Âm cĩ tần số f1 gọi là âm cơ bản hay họa âm thứ nhất, các âm cĩ tần số f2 , f3 gọi là các họa âm thứ hai, thứ ba Âm cơ bản bao giờ cũng mạnh nhất, các họa âm cĩ tác dụng quyết định âm sắc của âm cơ bản, giúp ta phân biệt các nguồn âm khác nhau. Chẳng hạn tiếng đàn Pi-a-nơ và tiếng sáo tuy cùng một âm cơ bản nhưng lại rất dễ phân biệt, nguyên nhân là do số lượng, cấu trúc những họa âm quanh âm cơ bản của chúng khác nhau. Họa âm càng nhiều âm nghe càng du dương phong phú. 3. Thính giác định vị (hiệu ứng Stereo): Khi nghe âm tuy mắt khơng nhìn thấy nguồn âm nhưng cĩ thể xác định chính xác vị trí của nguồn âm. Đặc điểm này là kết qủa của hai tác dụng: - Do cường độ, độ to, âm sắc của âm đến hai tai khơng giống nhau. - Do âm đến hai tai lệch pha nhau, vì thời gian đến hai tai khơng giống nhau. Cường độ, độ to của âm đến hai tai chênh lệch nhau là do nhiễu xạ gây ra. Âm cĩ tần số f < 1000 Hz sự chênh lệch cường độ do nhiễu xạ gây ra rất bé nhưng ở những tần số cao, sự chênh lệch này cĩ thể đạt tới 20 - 30 db. Do khả năng định vị của tai như vậy cho nên khi nghe âm cĩ thể tập trung chú ý vào nguồn âm cần nghe, bỏ qua một cách tự nhiên những âm khơng cần nghe. Nhờ hiệu qủa này mà tiếng ồn bị phủ lấp hoặc giảm nhỏ một cách tự nhiên. Nếu chỉ nghe âm một tai thì hiệu qủa này mất. 4. Nghe âm và chênh lệch thời gian: Tương tự như tác dụng lưu ảnh của mắt, tai người cũng cĩ tác dụng lưu âm. Thí nghiệm với nhiều thính giác bình thường cho thấy rằng, nếu hai âm như nhau đến tai người cách nhau < 50 ms thì tai người khơng phân biệt được, nghe như một âm duy nhất. SVTH: Đỗ Văn Tuấn Trang 14
  15. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình CHƯƠNG 2. TẬP TIN DẠNG SĨNG (WAVE FILE). I. MULTIMEDIA WINDOWS Từ phiên bản Windows 3.1, Multimedia đã trở thành một tính năng của Windows. Multimedia Windows đã bổ sung một tính năng mới: đĩ là sự độc lập thiết bị trong việc xử lý âm thanh. Sự độc lập thiết bị này thể hiện qua bộ API (Applycation Program Interface – Bộ giao diện lập trình ứng dụng). Bộ API độc lập về thiết bị đối với phần cứng và đĩ là một chức năng quan trọng của Windows. Người lập trình sẽ lập trình điều khiển phần cứng trên Windows dựa trên chức năng của phần cứng hơn là các chi tiết cụ thể của nĩ. Các nhà cung cấp phần cứng chỉ cần cung cấp một bộ điều khiển thiết bị (device driver) cho Windows, nhờ đĩ một ứng dụng trên Windows cĩ thể điều khiển phần cứng thơng qua Windows API. Với Multimedia Windows, hãng Microsoft đã thực hiện được ba điều : Định nghĩa một tiêu chuẩn phần cứng tối thiểu cho loại máy Multimedia PC (viết tắt là MPC). Tiêu chuẩn này dựa trên chức năng tổng quát hơn là sản phẩm cụ thể. Ví dụ nếu PC cĩ thêm ổ đĩa CD-ROM và một card âm thanh thì trở thành MPC cấp 1. Microsoft đã cung cấp phần mềm Multimedia Extension cho Windows 3.0 và đã được ghép luơn vào hệ điều hành Windows từ phiên bản 3.1. Phần mềm này bao gồm các bộ điều khiển thiết bị dành cho việc truy xuất đến các phần cứng gắn thêm vào MPC. Microsoft đưa ra cơng cụ phát triển Multimedia Development Kit (MDK). Lập trình viên kết hợp cơng cụ trên với bộ Windows Software Development Kit (SDK) để viết các ứng dụng về Multimedia. Cĩ hai dạng xử lý âm thanh số hĩa trên Windows. Loại thứ nhất microsoft gọi là “Wave Form Audio” (Am thanh dạng sĩng), dựa trên nguyên tắc số hĩa sĩng âm, MPC lưu chúng trên bộ nhớ hay tập tin .WAV trên đĩa. Các dữ liệu số này cĩ thể thơng qua phần cứng biến đổi lại thành âm thanh. Dạng thứ hai là MIDI. Khác với âm thanh dạng sĩng, MIDI chỉ lưu lại những thơng điệp điều khiển bộ tổng hợp phát ra âm thanh. Do đĩ kích thước của tập tin .MID nhỏ hơn nhiều so với tập tin.WAV. II. CẤU TRÚC WAVE FILE. 1. RIFF file. SVTH: Đỗ Văn Tuấn Trang 15
  16. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Wave File là tập tin chứa các dữ liệu của mẫu âm thanh đã được số hĩa. Phương pháp số hĩa âm thanh hiện nay là phương pháp PCM. Phương pháp này sẽ lấy mẫu âm thanh với tần số khoảng 11.025 kHz cho đến 44.1 kHz. Mỗi lần lấy mẫu, số liệu này lại được lượng tử hĩa bằng một hay hai byte cho một mẫu âm thanh. Như vậy tần số lấy mẫu càng cao, số byte dùng lượng tử hĩa càng nhiều thì âm thanh phát lại càng trung thực, nhưng lại tăng số byte cần lưu trữ. Với một mẫu âm thanh phát ra trong một phút cần phải lưu trữ ít nhất 660 kB. Đĩ là lý do tại sao các File Wave luơn cĩ kích thước khá lớn so với MIDI File. Cấu trúc của Wave File thuộc vào lớp file được sử dụng bởi các hàm Multimedia của Windows: đĩ là RIFF FILE. RIFF là chũ viết tắt của Resource Interchange File Format (dạng file trao đổi tài nguyên). Một RIFF file gồm một hoặc nhiều loại chunks, trong mỗi chunk lại chứa con trỏ chỉ đến chunk kế tiếp. Mỗi chunk bao gồm loại chunk và dữ liệu theo sau loại chunk đĩ. Một ứng dụng muốn đọc RIFF file cĩ thể đi qua lần lượt từng chunk, đọc dữ liệu ở chunk nĩ quan tâm và cĩ thể bỏ qua các chunk mà nĩ khơng quan tâm, một chunk của RIFF file luơn bắt đầu bởi một header cĩ cấu trúc như sau: Typedef struct { FOURCC ckid; DWORD ckSize; } CK; Trường FOURCC cĩ 4 bytes chỉ ra loại chunk. Đối với File Wave, trường này cĩ giá trị là “WAVE”. Nếu loại chunk ít hơn 4 ký tự thì các ký tự cịn lại bên phải sẽ được đệm thêm vào các khoảng trắng. Cần chú ý là các ký tự trong FOURCC cĩ phân biệt chữ hoa và chữ thường. Trường DWORD chứa kích thước vùng dữ liệu của chunk, vùng dữ liệu này nằm ngay sau header và cĩ kích thước là ckSize bytes. Chunk cĩ thể chứa các subchunks. Subchunk cũng là một chunk. Một RIFF file luơn bắt đầu bằng một chunk loại “RIFF”. 2. Cấu trúc Wave file. Wave file bắt đầu là chunk loại “RIFF”. Hai subchunk trong wave chunk đặc tả thơng tin về âm thanh của wave file và tiếp đĩ là dữ liệu của từng subchunk. Đĩ là subchunk “fmt” và subchunk “data”. SVTH: Đỗ Văn Tuấn Trang 16
  17. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình a. subchunk “fmt”: Dữ liệu của “fmt” chunk là đối tượng WAVEFORMAT cĩ cấu trúc như sau: Typedef struct waveformat_tag { WORD wFormatTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPerSec; WORD nBlockAlign; } WAVEFORMAT; - wFormatTag thường cĩ giá trị là WAVE_FORMAT_PCM được định nghĩa trong tập tin MMSYSTEM.H như sau : #define WAVE_FORMAT_PCM 1 Giá trị này báo cho phần mềm đang đọc Wave File biết kiểu mã hĩa dữ liệu âm thanh sang dữ liệu số là kiểu mã hĩa PCM. Hiện nay đây là kiểu mã hĩa duy nhất của Wave file. - nChannels: cĩ hai giá trị bằng 1 cho âm thanh mono và bằng 2 cho âm thanh stereo. - nSamplesPerSec: cho biết tốc độ lấy mẫu, cĩ các giá trị: 11025 11.025 kHz 22050 22.050 kHz 44100 44.100 kHz - nAvgBytesPerSec: cho biết số bytes yêu cầu trung bình trong một giây để phát lại mẫu dữ liệu của sĩng âm. - nBlockAlign: cho biết số byte dùng để chứa một mẫu âm thanh. Như vậy mẫu 8 bit hay ít hơn sẽ yêu cầu 1 byte, mẫu 9 đến 16 bit sẽ yêu cầu 2 bytes. Nếu âm thanh là Stereo thì yêu cầu gấp 2 lần số byte dùng cho âm thanh mono. SVTH: Đỗ Văn Tuấn Trang 17
  18. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Ta thấy trong WAVEFORMAT chưa cĩ thơng tin về số bit dùng để lượng tử hĩa một mẫu dữ liệu của sĩng âm. Thực tế Wave File sẽ xác lập số bit dùng cho một mẫu dữ liệu bằng một trường gắn vào cuối cấu trúc của WAVEFORMAT. Cấu trúc đĩ như sau: Typedef struct pcmwaveformat_tag { WAVEFORMAT wf; WORD wBitsPerSample; } PCMWAVEFORMAT; - wBitsPerSample: cho biết số bit trong một mẫu dữ liệu. Chú ý rằng các mẫu dữ liệu vẫn phải lưu trữ ở dạng byte hoặc word. Do đĩ, nếu một Wave File dùng 12 bit để lượng tử hĩa một mẫu sĩng âm thì sẽ phải lưu trữ 4 bit thừa khơng dùng đến. b. Subchunk “data”. Dữ liệu của “data” subchunk của wave file chứa các số liệu của âm thanh đã được số hĩa. Đối với mẫu âm thanh 8 bit, dữ liệu của “data” subchunk bao gồm các giá trị 1 byte (cĩ giá trị từ 0 – 255) của các mẫu âm thanh. Đối với mẫu âm thanh 16 bits, mỗi mẫu dữ liệu gồm 2 bytes (cĩ giá trị từ – 32768 đến 32767). Điều này khơng cĩ nghĩa là file wave 16 bits sẽ nghe to hơn 256 lần file wave 8 bits, mà nĩ cĩ nghĩa là âm thanh được lượng tử hĩa chính xác hơn, nghe trung thực hơn. Trong mẫu mono 8 bits, dữ liệu của subchunk “data” gồm chuỗi các giá trị 1 byte. Với stereo 8 bits, mỗi mẫu gồm 2 bytes, dữ liệu sẽ được sắp xếp xen kẽ (interleave), với byte đầu (byte chẵn) là mẫu âm thanh của kênh bên trái, byte sau (byte lẻ) là của kênh bên phải. Tĩm laị cấu trúc của Wave File như sau: Kích thước Giá trị Tên trường (số byte) 4 “RIFF” 4 Kích thước file RIFF 4 “WAVE” 4 “fmt” 4 Kích thước subchunk “fmt” SVTH: Đỗ Văn Tuấn Trang 18
  19. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình 2 Kiểu mã hĩa dữ liệu của file WORD nFormatTag wave (thường là PCM) 2 Số kênh : 1 - mono WORD nChannels 2 - stereo 4 Số mẫu/1giây DWORD nSamplesPerSec 4 Số bytes/1giây DWORD nAvgBytesPerSec 2 Số byte/1mẫu DWORD nBlockAlign 2 Số bit/1mẫu WORD wBitsPerSample 4 “data” 4 Kích thước dữ liệu III. ĐỌC RIFF FILES Để làm việc với file RIFF, ta phải mở nĩ và “descend” vào chunk mà ta cần. Điều này cĩ nghĩa là ta cần phải định vị được chunk này, rồi chuyển con trỏ file vào đầu khối dữ liệu của chunk. Khi làm việc xong với 1 chunk, ta phải “ascend” ra khỏi chunk và “descend” xuống chunk khác. Các hàm dùng xử lý RIFF file đều cĩ tiền tố là mmio và làm việc với file handle dạng HMMIO, để bắt đầu, ta phải mở file bằng đoạn mã sau: HMMIO h; If ((h=mmioOpen(path,NULL,MMIO_READ))==NULL) { /*báo lỗi*/ return(0); } Thơng số path chứa đường dẫn của file wave. Cờ MMIO_READ báo cho mmioOpen mở file để đọc. Ta cũng cĩ thể mở nĩ để ghi bằng thơng số MMIO_WRITE hay cả đọc và ghi bằng thơng số MMIO_READWRITE. Nếu mở file thành cơng, mmioOpen sẽ trả về một SVTH: Đỗ Văn Tuấn Trang 19
  20. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình handle loại HMMIO. Nếu thất bại, nĩ sẽ trả về trị NULL. Sau khi mở file xong, ta bắt đầu định vị WAVE chunk bằng đoạn mã sau: MMCKINFO mmParent; MmParent.fccType=mmioFOURCC(‘W’,’A’,’V’,’E’); If (mmioDescend(h,(LPMMCKINFO)&mmParent, NULL, MMIO_FINDRIFF)) { mmioClose(h,0); /* báo lỗi */ return(0); } Cấu trúc của MMCKINFO chứa các thơng tin về chunk. Nĩ được định nghĩa trong MMSYSTEM.H như sau: Typedef struct { FOURCC ckid; DWORD cksize; FOURCC fcctype; DWORD dwDataOffset; DWORD dwFlags; } MMCKINFO; Để “đi vào” một chunk, ta cho trường ckid của MMCKINFO ở loại chunk mà ta muốn định vị. Cĩ một macro thực hiện việc này là mmioFOURCC. Sau đĩ gọi hàm mmioDescend để định vị chunk. Nếu định vị thành cơng, hàm này trả về zero và đối tượng MMCKINFO truyền cho hàm sẽ được điền vào các thơng tin về chunk. Trường cksize định nghĩa kích thước tính bằng byte của chunk. Đối số thứ ba của mmioDescend là cờ MMIO_FINDRIFF. Cờ này chỉ thị cho mmioDescend tìm một file cĩ ID là RIFF với loại chunk được xác định bởi ckid. Nếu muốn tìm một chunk trong Wave file ta cho cờ này là MMIO_FINDCHUNK. Sau khi đi vào WAVE chunk, ta bắt đầu đi vào fmt subchunk của nĩ: MMIOCKINFO mmSub; MmSub.ckid=mmioFOURCC(‘f’,’m’,’t’); If (mmioDescend(h,(LPMMCKINFO)& mmSub, (LPMMCKINFO)&mmParent,MMIO_FINDCHUNK)) { mmioClose(h,0); SVTH: Đỗ Văn Tuấn Trang 20
  21. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình /* báo lỗi */ return(0); } Đến đây ta đã cĩ thể bắt đầu đọc dữ liệu từ Wave File. Đoạn mã sau đọc đối tượng PCMWAVEFORMAT từ fmt subchunk: PCMWAVEFORMAT waveformat; Int n; n = min ((unsigned int)mmSub.cksize, sizeof(PCMWAVEFORMAT)); if(mmioRead(h,(HPSTR)&waveformat, (long)n) !=(long)n) { /* báo lỗi */ return(0L); } if(waveformat.wf.wFormatTag !=WAVE_FORMAT_PCM) { /* báo lỗi */ mmioClose(h,0); return(0L); } Đối số đầu tiên của mmioRead là handle của file đang đọc. Đối số thứ hai là con trỏ xa trỏ tới vùng đệm để chứa dữ liệu. Đối số thứ ba là số byte cần đọc. Hàm này sẽ trả về số byte thực sự đọc được. Sau khi đã đọc nội dung của chunk, ta đi ra khỏi chunk để chuẩn bị đọc chunk kế tiếp: MmAscend(h,(LPMMCKINFO)&mmSub,0); Đối số thứ hai của mmAscend là đối tượng MMCKINFO của chunk mà ta “đi ra”. Đối số thứ ba là đối số giả. Cơng việc cịn lại là đọc dữ liệu mã hĩa mẫu âm thanh của Wave file vào bộ nhớ. Chú ý rằng giá trị cksize trả về bởi mmioDescend được sử dụng để xác định kích thước vùng đệm cần cấp phát để chứa dữ liệu. GLOBALHANDLE wavehandle; HPSTR wavepointer; MmSub.ckid=mmioFOURCC(‘d’,’a’,’t’,’a’); If(mmioDescend(h,(LPMMCKINFO)&mmSub, (LPMMCKINFO)&mmParent,MMIO_FINDCHUNK)) { mmioClose(h,0); SVTH: Đỗ Văn Tuấn Trang 21
  22. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình /* báo lỗi */ return(0); } if((wavehandle=GlobalAlloc(GMEM_MOVEBLEIGMEM_ SHARE, mmSub.cksize))==NULL) { mmioClose(h,0); /* báo lỗi */ return(0); } if(wavepointer=(HPSTR)GLOBALLOCK(WAVEHANDLE)) ==null) { GlobalFree(wavehandle); mmioClose(h,0); /* báo lỗi */ return(0); } if(mmioRead(h,wavepointer,mSub.cksize) != mSub.cksize) { GlobalUnlock(wavehandle); GlobalFree(wavehandle); mmioClose(h,0); /* báo lỗi */ return(0); } GlobalUnlock(wavehandle); SVTH: Đỗ Văn Tuấn Trang 22
  23. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình CHƯƠNG 3. LÝ THUYẾT XỬ LÝ TÍN HIỆU SỐ. I. TÍN HIỆU VÀ HỆ THỐNG RỜI RẠC 1. Giới thiệu Tín hiệu là biểu hiện vật lý của thơng tin, thường là thơng tin về trạng thái hay hành vi của một hệ vật lý nào đĩ. Về mặt tốn học, tín hiệu được coi là hàm của của một hay vài biến độc lập. Ví dụ: tín hiệu âm thanh là sự thay đổi áp suất khơng khí theo thời gian; tín hiệu hình ảnh là hàm độ sáng theo hai biến khơng gian Theo qui ước chung, tín hiệu được coi là hàm theo một biến độc lập và là biến thời gian. Tín hiệu số (Digital signal) là tín hiệu rời rạc (theo biến độc lập thời gian) đồng thời cĩ biên độ cũng rời rạc hĩa (lượng tử hĩa). 2. Đáp ứng xung trong hệ tuyến tính bất biến. Tín hiệu vào x(n) được gọi là tác động, tín hiệu ra y(n) được gọi là đáp ứng của hệ xử lý. Ta cĩ quan hệ: y(n) Tx(n) T : phép biến đổi x(n) y(n) Một hệ thống là tuyến tính nếu thỏa nguyên lý xếp chồng: giả sử y1(n) và y2(n) là đáp ứng của hệ tương ứng với tác động vào là x1(n) và x2(n). Hệ là tuyến tính nếu và chỉ nếu : Ta.x1 (n) b.x2 (n) a.y1 (n) b.y2 (n) Như vậy, một hệ tuyến tính cĩ thể xử lý tổng tác động như là các tác động này được xử lý độc lập, sau đĩ các đáp ứng tương ứng sẽ được cộng lại. Một tín hiệu x(n) bất kỳ cĩ thể biểu diễn : x(n)  x(k). (n k) k Do vậy đối với hệ tuyến tính: y(n)  x(k).h k (n) k SVTH: Đỗ Văn Tuấn Trang 23
  24. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình hk(n) gọi là đáp ứng xung của hệ đối với tác động là xung (n-k) Theo cơng thức trên, hệ tuyến tính vẫn cịn tùy thuộc vào thời điểm tác động k. Một hệ tuyến tính là bất biến(theo thời gian) nếu tín hiệu vào bị dịch đi một đoạn thời gian là k thì tín hiệu ra cũng chỉ dịch một đoạn k, tức mọi hk(n) trở thành h(n-k). Như vậy mọi hệ tuyến tính bất biến đều được đặc trưng hồn tồn bằng đáp ứng h(n), biết h(n) ta hồn tồn tính được đáp ứng y(n) của tín hiệu vào x(n). y(n)  x(h).h(n k) k Cơng thức trên cịn được gọi là Tổng chập (convolution sum) của hai tín hiệu x(n) và h(n), và cịn được ký hiệu: y(n) x(n) * h(n) 3. Tính chất của tổng chập của hệ TTBB Tính giao hốn: y(n) x(n) * h(n) =  x(k).h(n k) k h(n) * x(n)  h(k).x(n k) k Tính phân phối: x(n) *h1 (n) h2 (n) x(n) * h1 (n) x(n) * h2 (n) Như vậy, từ tính chất giao hốn, ta thấy rằng: hai hệ TTBB cĩ đáp ứng xung là h1(n) và h2(n) được mắc nối tiếp nhau sẽ tương đương với một hệ cĩ đáp ứng xung: h(n) h1 (n) * h2 (n) và thứ tự mắc nối tiếp khơng quan trọng. Từ tính chất phân phối, hai hệ TTBB mắc song song nhau sẽ tương đương với một hệ cĩ đáp ứng xung bằng tổng hai đáp ứng xung: SVTH: Đỗ Văn Tuấn Trang 24
  25. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình h(n) h1 (n) h2 (n) h (n) x(n) 1 y(n) h2 (n) x(n) h1 (n) h2 (n) y(n) 4. Hệ nhân quả (causal system) Các hệ cĩ tín hiệu ra chỉ phụ thuộc vào tín hiệu trong quá khứ và hiện tại được gọi là các hệ nhân quả, tức phải cĩ tác động vào (nguyên nhân) thì mới cĩ tác động ra (kết quả). Định lý: Hệ tuyến tính bất biến (TTBB) là nhân quả nếu đáp ứng xung h(n) = 0 với mọi n<0. Đối với một hệ TTBB và nhân quả, dạng chung của cơng thức tổng chập y(n)  x(k).h(n k) k hoặc viết cách khác: y(n)  x(n k).h(k) k 0 Nếu đáp ứng xung h(n) cĩ độ dài hữu hạn N thì: N 1 y(n)  x(n k).h(k) k 0 Mở rộng cho tín hiệu: tín hiệu nhân qủa là tín hiệu bắt đầu khác 0 từ thời điểm 0. 0 khi n<0 x(n) 0 khi n 0 5. Tính ổn định. Định nghĩa: một hệ là ổn định nếu đáp ứng của hệ luơn bị chặn đối với tác động vào bị chặn. Định lý: Một hệ TTBB là ổn định nếu và chỉ nếu đáp ứng xung thỏa mãn điều kiện sau: S | h(n) | n SVTH: Đỗ Văn Tuấn Trang 25
  26. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình 6. Phương trình sai phân tuyến tính hệ số hằng Ta chỉ khảo sát các hệ thống tuyến tính bất biến và cĩ thể đặc trưng bởi các phương trình sai phân cĩ hệ số hằng. Mối liên hệ giữa tín hiệu vào x(n) và tín hiệu ra y(n) cĩ dạng như sau: N M ak y(n k) br x(n r) k 0 r 0 Trong đĩ tập các hệ số ak và br đặc trưng cho hệ TTBB. 7. Biểu diễn các hệ rời rạc trong miền tần số. 7.1. Phép biến đổi Fourier của tín hiệu rời rạc. y(n)  h(k).x(n k) h(k).e j(n k ) k k Với tín hiệu vào x(n)= ejn (cĩ tần số =2 f) và đáp ứng xung h(n), ta cĩ tín hiệu ra: y(n) e jn.H (e j ) Hàm H(ej) gọi là đáp ứng tần số của hệ, biểu diễn đáp ứng của hệ thống theo hàm của tần số đối với dãy tác động ejn, nĩ cho biết sự thay đổi về biên độ và pha theo tần số khi tín hiệu đi qua hệ. H(ej) là một hàm số phức và cĩ thể biểu diễn theo phần thực và ảo: j j j H(e )= Hr(e )+ jHi(e ). (r: real; i: image) Hoặc theo biên độ và pha: H(ej)= | H(ej)| ejargH(ej ) (0  2 ). H(ej) là hàm liên tục theo  và tuần hồn với chu kỳ 2 . Ta cĩ thể khai triển nĩ thành chuỗi Fourier, ngược lại h(n) cĩ thể được tính tốn từ H(ej) bằng các cơng thức tính hệ số khai triển chuỗi Fourier: 1 j jn h(n) 2 H (e ).e .d Trong đĩ : H(e j ) h(n).e jn n SVTH: Đỗ Văn Tuấn Trang 26
  27. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Biến đổi Fourier của dãy rời rạc: ( jk 2 T )t S(t)  Ak .e k Đối với tín hiệu tuần hồn t0 T A 1 s(t).e( jk 2 / T ) .dt k T 0 7.2. Phép biến đổi Fourier thuận. X (e j )  x(k).e jn n 7.3. Phép biến đổi Fourier nghịch. x(n) 1/ 2 X (e j ).e jn d 7.4. Phổ biên độ, phổ pha và phổ năng lượng Do X(f) là một hàm phức nên ta cĩ thể biểu diễn dưới dạng modul và argument: X ( f ) | X( f ) | e j argX ( f ) Hàm modul X(f) theo f được gọi là phổ biên độ của tín hiệu x(n), cịn hàm (f)=arg[X(f)] được gọi là phổ pha. Cuối cùng (f)=|X(f)|2 được gọi là phổ năng lượng, biểu diễn sự phân bố theo tần số của năng lượng tín hiệu x(n). 8. Định lý lấy mẫu Shannon Một tín hiệu tương tự xa(t) cĩ dải phổ hữu hạn với giới hạn trên là Fmax(Hz) (tức là phổ bằng 0 khi f nằm ngồi dải - Fmax Fmax). Ta sẽ chỉ cĩ thể khơi phục lại xa(t) một cách chính xác từ các mẫu xa(n.Ts) nếu như : Fs 2Fmax hay Ts 1/(2Fmax). Khơi phục lại tín hiệu tương tự từ tín hiệu lấy mẫu: SVTH: Đỗ Văn Tuấn Trang 27
  28. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Ta cĩ thể khơi phục lại tín hiệu xa(t) bằng cách cho tín hiệu lấy mẫu đi qua một mạch lọc (tương tự) thơng thấp lý tưởng (low-pass filter) cĩ đáp ứng tần số Hlp(f) với tần số cắt là fc = Fs/2. Phổ của tín hiệu xa(t) sẽ được lọc lại chính xác chỉ với điều kiện : Fs 2Fmax Nghĩa là thỏa mãn định lý lấy mẫu. Khi đĩ trong khơng gian tần số: Xa(f) = X(f).Hlp(f) Cịn trong khơng gian thời gian: Xa(t) = x(nTs)*hlp(t) Trong đĩ hlp(t) là đáp ứng xung của mạch lọc thơng thấp lý tưởng cĩ biên độ dải thơng là Ts. II. PHÉP BIẾN ĐỔI FOURIER RỜI RẠC 1. Chuỗi Fourier rời rạc của tín hiệu rời rạc tuần hồn Tín hiệu tuần hồn xp(n) là tuần hồn với chu kỳ N nếu: xp(n)= xp(n+N), với mọi n. Đối với tín hiệu rời rạc, ta khai triển Fourier theo hàm: j(2 k/N)n k(n) = e , k=0, 1, 2 Các hàm điều hịa phức rời rạc chỉ cĩ N tín hiệu phân biệt nhau vì tín hiệu sai khác nhau là bội của N thì đều như nhau: j(2 k/N)n k(n) = k N(n) = k 2N(n) = e Đối với tín hiệu tuần hồn và rời rạc xp(n), ta cĩ chuỗi Fourier rời rạc (DFS): j (2 k / N )n X p (n)  ak .e k=N Trong đĩ các hệ số ak là các hệ số khai triển chuỗi Fourier rời rạc hay cịn được gọi là các vạch phổ của tín hiệu tuần hồn. 2. Biến đổi Fourier rời rạc của tín hiệu cĩ độ dài hữu hạn(DFT:Discrete Fourier Transform) SVTH: Đỗ Văn Tuấn Trang 28
  29. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Việc biểu diễn Fourier cho tín hiệu rời rạc cĩ độ dài hữu hạn gọi là phép biến đổi Fourier rời rạc (DFT). Tín hiệu cĩ độ dài hữu hạn là tín hiệu cĩ giá trị khác 0 trong một khoảng hữu hạn thời gian nào đĩ, và bằng 0 trong khoảng cịn lại. Đây là loại tín hiệu tồn tại trong thực tế vì chúng ta chỉ cĩ thể quan sát mọi tín hiệu trong một khoảng thời gian là hữu hạn từ N1 đến N2. Để đơn giản hố, ta cĩ thể qui ước tín hiệu x(n) tồn tại trong khoảng thời gian: 0 n M-1, tức là : M = N2 - N1+1. Với tín hiệu x(n) này được dùng như là một chu kỳ tín hiệu, ta cĩ thể xây dựng tín hiệu xp(n) tuần hồn với chu kỳ N bằng cách xếp chồng tuần hồn: x p (n)  x(n iN) i Nếu N M thì khơng xảy ra hiện tượng trùm thời gian giữa các phần của xp(n). Do xp(n) chỉ cĩ duy nhất một cách biểu diễn chuỗi Fourier rời rạc nên x(n) cũng vậy. Từ chuỗi Fourier ta tính ra được 1 chu kỳ tín hiệu của xp(n), trong đĩ cĩ x(n): xp(n) 0 n N-1 x(n)= 0 n cịn lại. 3. Phép biến đổi nhanh fourier Fast Fourier Transform (FFT) là một giải thuật rất hiệu quả để tính DFT. Cơng thức biến đổi DFT: N 1 X (k)  x(n).e j(2 kn) / N k 0 j(2 kn)/ N Đặt Wnk = e N 1 X (k)  x(n).W nk k 0 Chia DFT thành 2 phần : SVTH: Đỗ Văn Tuấn Trang 29
  30. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình N / 2 1 N / 2 1 2nk (2n 1)k X (k)  x(2n).WN  x(2n 1).WN n 0 n 0 Ký hiệu thành phần chẵn là xev và lẻ là xod, ta viết lại: N / 2 1 N / 2 1 nk nk X (k)  xev (n).WN / 2  xod (n).WN n 0 n 0 k X (k) X ev (k) WN / 2 .X od (k) , k = 0 N-1 Để tính X(k) chỉ cần tính trong nửa chu kỳ N/2. Xev(k) và Xod(k) tuần hồn với chu kỳ N/2: Xev(k) = Xev(k - N/2), N/2 k N-1. SVTH: Đỗ Văn Tuấn Trang 30
  31. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình CHƯƠNG 4. GIỚI THIỆU VỀ MPEG. I. GIỚI THIỆU. 1. MPEG là gì? MPEG, viết tắt của cụm từ “Moving Picture Experts Group”, là một nhĩm chuyên nghiên cứu phát triển các tiêu chuẩn về hình ảnh số và nén âm thanh theo chuẩn ISO/IEC. Ngày nay, nhĩm làm việc MPEG đã phát triển và phát hành các tiêu chuẩn MPEG-1, MPEG-2 và MPEG-4. Chuẩn MPEG-3 được kết hợp vào MPEG-2 và khơng cịn tách riêng nữa. Nhĩm MPEG hiện nay đã phát triển đến chuẩn MPEG-7. MPEG chỉ là một tên riêng, tên chính thức của nĩ là : ISO/IEC JTC1 SC29 WG11. ISO : International Organization for Standardization IEC : International Electro-technical Commission JTC1 : Joint Technical Committee 1 SC29 : Sub-committee 29 WG11: Work Group 11 (moving picture with audio). 2. So sánh các chuẩn MPEG: MPEG-1 định nghĩa một tiêu chuẩn cho việc lưu trữ và phục hồi các hình ảnh động và âm thanh trên các thiết bị lưu trữ. Tiêu chuẩn này định nghĩa rằng hình ảnh được phát lại ở tốc độ 30 frames một giây và âm thanh được phát lại ở chất lượng như CD-audio, độ phân giải hình ảnh là 352 x 240. Chuẩn MPEG-1 được dùng điển hình trong các phần mềm huấn luyện bằng máy tính, các game hành động trong máy tính, video chất lượng VHS, Karaoke MPEG-2 định nghĩa cho một tiêu chuẩn kỹ thuật truyền hình số. Chuẩn MPEG-2 khắc phục một vài nhược điểm của chuẩn MPEG-1. Ví dụ, MPEG-2 cĩ thể tạo hình ảnh lớn gấp 4 lần MPEG-1 với độ nét cao hơn và rõ hơn (720 x 480 và 1280 x 720). Các đặc tính của MPEG-2 bao gồm hình ảnh chất lượng cao và âm thanh nổi MPEG-3 định nghĩa một tiêu chuẩn cho High Difinition Television (HDTV), là thế hệ tiếp theo của cơng nghệ truyền hình theo định dạng số đầy đủ. Tiêu chuẩn này đã khơng được phát triển hồn thiện và cuối cùng được kết hợp vào với chuẩn MPEG-2. MPEG-3 đi đến mục tiêu là các ứng dụng HDTV với kích thước mẫu lên đến 1920x1080x30 Hz và được mã hố ở tốc độ bit 20 đến 40 Mbits/s. Cuối cùng người ta đã nhận ra rằng với SVTH: Đỗ Văn Tuấn Trang 31
  32. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình một vài điều chỉnh thích hợp, MPEG-1 và MPEG-2 làm việc rất tốt đối với HDTV. MPEG-4 định nghĩa một tiêu chuẩn cho các ứng dụng Multi-media. Đặc biệt nĩ định nghĩa tiêu chuẩn truyền cho dịng phức tạp các hình ảnh, âm thanh và dữ liệu đồ hoạ và việc tái hợp chúng trên thiết bị thu. MPEG-4 được phát triển theo 2 giai đoạn, 1 và 2. Chuẩn MPEG-4 định nghĩa các đối tượng hình ảnh mà trong đĩ các phần của một cảnh cĩ thể được thao tác trong khi những phần khác vẫn khơng đổi. MPEG-5 và MPEG-6 vẫn chưa được cơng bố. MPEG-7 định nghĩa một tiêu chuẩn về việc biểu diễn nội dung cho các nghiên cứu thơng tin hình ảnh và âm thanh. Tên chính thức là “Multimedia Content Description Interface”. Mục tiêu của MPEG-7 là chuẩn hố việc biểu diễn các mơ tả về nội dung nghe nhìn. Tuy nhiên chuẩn khơng định nghĩa các cơng cụ để nhận ra nội dung nghe nhìn thật sự. 3. Âm thanh MPEG. Khả năng của âm thanh MPEG, về cơ bản, âm thanh MPEG sẽ làm giảm kích thước lưu trữ 1 tâp tin âm thanh đi rất nhiều. Một đĩa Audio-CD lưu trữ được khoảng 650 Mbyte dữ liệu âm thanh thơ với cách mã hĩa 16 bit (bitdepth) và tần số lấy mẫu (sample rate) 44.1 kHz. Nếu đem phát ra thì cũng chỉ được 60 đến 72 phút. - bitdepth: mơ tả mức biên độ lớn nhất mà một mẫu âm thanh cĩ thể đạt tới. Ví dụ: 8 bit = 256 mức, 16 bit = 65536 mức, về hình ảnh thì đĩ chính là độ phân giải. - sample rate: mơ tả số mẫu âm thanh được lấy trong 1 giây. Ví dụ: 22 kHz = 22.000 mẫu/1giây. Phương pháp cổ điển để giảm kích thước lưu trữ là giảm lượng thơng tin. Nếu đổi cách lưu trữ âm thanh từ 16 bit sang 8 bit chúng ta cĩ thể giảm kích thước lưu trữ đi 1 nửa, tuy nhiên như thế chất lượng âm thanh cũng sẽ giảm đi 1 nửa. SVTH: Đỗ Văn Tuấn Trang 32
  33. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Hình 4.1 4. Các khái niệm trong âm thanh MPEG. a. Hiệu ứng che (masking): nĩi đơn giản là âm lớn át âm bé, âm mạnh át âm yếu. b. Ngưỡng nghe và mức nhạy cảm. 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: SVTH: Đỗ Văn Tuấn Trang 33
  34. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Hình 4.2 “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 phản lực bay ngang bên trên, là hồn tồn khơng thể nghe được do lúc này ngưỡng nghe đã bị sai lệch. Khi chiếc phản lục đã đi rồi thì ngưỡng nghe trở lại bình thường. Am 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). c. Che tần số (Frequency Masking) Thí nghiệm: Phát ra 1 âm cĩ tần số 1 kHz với mức to cố định là 60dB, gọi là “âm che” (masking tone). Phát ra một âm khác (gọi là test tone) ở mức tần số khác (ví dụ 1.1kHz), và tăng mức to của âm này cho đến khi cĩ thể nghe được nĩ (phân biệt được âm 1.1 kHz và âm che 1kHz). Làm lại thí nghiệm với các âm thử (test tone) và vẽ ra một ngưỡng mà tại đĩ các âm thử bắt đầu cĩ thể phân biệt được: SVTH: Đỗ Văn Tuấn Trang 34
  35. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Hình 4.3 Làm thí nghiệm với các “masking tones” cĩ các tần số khác nhau, ta cĩ được hình vẽ: Hình 4.4 d. Che nhất thời. (che thời gian) Nếu ta nghe một âm thanh lớn, rồi ngưng nĩ lại, mãi một lúc sau ta mới cĩ thể nghe được một âm lân cận nhỏ hơn . Thí nghiệm: phát ra một âm che “masking tone” cĩ tần số 1kHz ở mức 60dB, kèm một âm thử (test tone) 1.1kHz ở mức 40dB. Ta khơng nghe được âm thử này (nĩ đã bị che). SVTH: Đỗ Văn Tuấn Trang 35
  36. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Dừng âm che lại, đợi một lúc (delay time) ta dừng tiếp âm thử (test tone). Điều chỉnh thời gian delay để cho ta vừa cĩ thể nghe được âm chủ (ví dụ khoảng 5ms). Lặp lại thí nghiệm cho các mức to khác nhau của âm thử, ta vẽ được đồ thị sau: Hình 4.5 Làm thí nghiệm tương tự với các tần số khác nhau cho âm thử. Hiệu qủa che được vẽ như hình. Hình 4.6 5. Hoạt động: SVTH: Đỗ Văn Tuấn Trang 36
  37. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Khi đưa ra phương pháp mã hĩa âm thanh, nền tảng vẫn là yếu tố “hệ thống nghe” của con người. Thật khơng may đĩ khơng phải 1 thiết bị hồn hảo để nhận biết âm thanh nhưng là thiết bị duy nhất chúng ta cĩ được. Nhưng chúng ta cĩ thể chuyển những khuyết điểm của nĩ thành ưu điểm : đĩ là đặc tính phi tuyến của ngưỡng nghe và khả năng thích hợp của nĩ. MPEG hoạt động dựa trên hệ thống nghe của con người, đĩ là cảm giác về âm mang đặc tính sinh lý và tâm lý. Am thanh CD ghi lại tất cả tần số, kể cả những tần số bị ‘che’. Am thanh MPEG chỉ ghi lại những tần số mà tai người cĩ thể nghe. Như vậy, MPEG sẽ bỏ qua những thơng tin khơng quan trọng. Dựa trên nghiên cứu về nhận thức âm thanh của con người, bộ mã hĩa sẽ quyết định những thơng tin nào là căn bản và những thơng tin nào cĩ thể bỏ qua. Hiệu qủa này là bao quát nhưng đặc biệt quan trọng trong âm nhạc. Nếu trong một dàn nhạc cĩ một nhạc cụ chơi cực mạnh, làm át tiếng của các nhạc cụ khác ta khơng thể nghe được. Nhưng máy thâu âm vẫn ghi lại đầy đủ tất cả tần số của tất cả nhạc cụ, nghĩa là thiết bị thâu âm hồn tồn khơng cĩ khả năng thích nghi động như con người. Nhưng khi phát lại, ta vẫn khơng nghe được âm thanh của những nhạc cụ bị át. Vì vậy việc lưu trữ/ghi lại những tần số này là thừa, làm chiếm dung lượng khá nhiều. Cách ghi âm tuyến tính trên đĩa CD là hồn tồn khơng hiệu qủa về khía cạnh này. Do đĩ thay vì phải ghi lại thơng tin của những âm khơng nghe được, ta sẽ dành chỗ cho các âm cĩ thể nghe được. Theo cách này, dung lượng của thiết bị ghi âm cần thiết cĩ thể xem như giảm đi mà khơng làm giảm chất lượng âm thanh. Trước khi chúng ta nghe được điều gì, thơng tin sẽ được phân tích bởi bộ não của chúng ta. Não bộ sẽ dịch âm thanh và lọc bỏ những thơng tin khơng cần thiết. Kỹ thuật âm thanh MPEG làm việc này thay thế cho não bộ. Như vậy, những thơng tin lẽ ra phải được lọc bởi não bộ bây giờ khơng cịn cần phải lưu trữ chiếm giữ khơng gian đĩa nữa. II. CÁC KHÁI NIỆM CƠ BẢN VỀ MPEG. 1. Lược đồ mã hĩa Perceptual Subband. Bộ mã hĩa âm thanh theo “perceptual subband” phân tích liên tục các tín hiệu vào và xác định ra đường cong che (masking curve), đĩ là mức ngưỡng mà những âm thanh ở dưới nĩ khơng thể nghe được bởi hệ thống nghe của con người. SVTH: Đỗ Văn Tuấn Trang 37
  38. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Hình 4.7 Tín hiệu vào được chia thành 1 số dải tần số, gọi là “subband”. Mỗi tín hiệu “subband” được lượng tử hĩa theo cách mà sự lượng tử hĩa tiếng ồn được bắt đầu bởi việc mã hĩa sẽ khơng vượt qúa đường cong che của subband đĩ. Sự lượng tử hĩa phổ tiếng ồn vì thế thích nghi động với phổ của tín hiệu.Thơng tin trên bộ số hĩa được dùng trong mỗi subband được truyền dọc theo các mẫu subband được mã hĩa. Bộ giải mã sẽ giải mã dịng bit (bitstream) mà khơng cần phải biết cách mà bộ mã hĩa xác định những thơng tin này. Điều này cho phép bộ mã hĩa hoạt động với những mức độ khác nhau về chất lượng và độ phức tạp, và cũng cho phép sự phát triển trong tương lai của bộ mã hĩa. 2. Giải thích về hiệu qủa che (masking effect). a. Nén âm thanh MPEG. MPEG cĩ thể nén 1 dịng bit 32 kbit/s đến 384 kbit/s. Một dịng bit âm thanh PCM thơ thì khoảng 705 kbit/s, do đĩ tỉ số nén tối đa cĩ thể là 22. Tỉ số nén bình thường là 1:6 hay 1:7. 96 kbit/s là xem như trong suốt cho hầu hết các mục đích thực tế. Cĩ nghĩa rằng ta khơng cần phải lưu tâm đến bất SVTH: Đỗ Văn Tuấn Trang 38
  39. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình kỳ sự khác biệt nào giữa tín hiệu gốc và tín hiệu nén đối với nhạc pop hay nhạc rock’n roll. Đối với một số ứng dụng khác như là hịa tấu piano, tốc độ bit cĩ thể lên tới 128 kbit/s. Để đạt được tỉ số nén này, đối với âm thanh, về cơ bản ta cĩ hai chọn lựa: hoặc giảm số lần lấy mẫu, hoặc giảm số bit để lượng tử hố. Con người cĩ thể nghe âm thanh với tần số từ 20 Hz đến 20 kHz. Theo thuyết của Nyquist, ta phải lấy mẫu âm thanh ở tần số tối thiểu là hai lần tần số cao nhất mà ta muốn phát lại. Tần số lấy mẫu 44,1 kHz là thích hợp. Vấn đề cịn lại là phải chọn số bit cho một mẫu mã hĩa là bao nhiêu. Thơng thường là 16 bit. Lý do để chọn con số 16 bit bắt nguồn từ tỉ số tín hiệu và nhiễu (s/n). Nhiễu nĩi ở đây sinh ra do qúa trình số hĩa. Cứ mỗi bit thêm vào, ta cĩ tỉ số s/n tốt hơn 6dB (đối với tai người, 6 dB tương ứng với mức to gấp đơi). Am thanh CD đạt tới khoảng 90 dB s/n. Mức này phù hợp với phạm vi động của tai người cịn tốt. Nghĩa là ta khơng thể nghe được bất kỳ nhiễu nào đến từ bản thân hệ thống. Điều gì xảy ra nếu ta lấy mẫu với 8 bit? Ta sẽ nghe thấy rất nhiều tiếng sơi trong bản ghi. Dễ dàng nghe thấy nhiễu trong khoảng nghỉ của bản nhạc hoặc giữa các từ nếu ta ghi âm một giọng nĩi. b. Hiệu qủa che. Giả sử cĩ một âm mạnh với tần số 1000Hz, và một âm kèm theo cĩ tần số 1100Hz nhưng với cường độ âm nhỏ hơn 18dB. Ta sẽ khơng thể nghe thấy âm này vì nĩ đã bị che hồn tồn bởi âm chủ 1000Hz. Nĩi một cách khác, một âm thanh yếu gần một âm thanh mạnh sẽ bị che. Nếu cĩ một âm thanh khác tần số 2000Hz cũng cĩ mức to thấp hơn âm 1000Hz là 18dB thì ta sẽ nghe được âm này. Để khơng nghe được âm này ta phải giảm mức to của âm này xuống cịn thấp hơn 45dB so với âm chủ 1000Hz. Hiệu qủa che cĩ ý nghĩa rằng ta cĩ thể gia tăng mức ồn nền xung quanh một âm mạnh mà vẫn khơng nghe được tiếng ồn vì chúng sẽ bị che hồn tồn. Tăng mức ồn nền cịn cĩ nghĩa là dùng ít bit để số hĩa. Và điều này cũng giống như là ta đã nén âm thanh vậy. Bây giờ hãy xem bộ mã hố âm thanh MPEG hoạt động như thế nào. Bộ mã hĩa chia phổ tần số (20Hz đến 20kHz) thành 32 dải nhỏ (sub-band). Mỗi sub-band giữ 1 phần nhỏ của phổ. Trong vùng trên của sub-band 8 ta phát một âm cĩ tần số 1000Hz với mức to 60dB. Bộ mã hĩa sẽ tính tốn hiệu qủa che của âm này và nhận ra rằng cĩ một ngưỡng che cho tồn bộ sub-band thứ 8 (tất cả những âm cĩ cùng tần số). Ngưỡng che này thấp hơn âm phát ra 35 dB. Tỉ số s/n cĩ thể chấp nhận được là 60 - 35 = 25 dB, tương đương với 4 bit. Ngồi ra nĩ cịn ảnh hưởng trên các sub-band 9-13 và 5-7 với hiệu qủa che giảm dần từ sub-band 8. Hơn nữa, bộ mã hĩa cũng SVTH: Đỗ Văn Tuấn Trang 39
  40. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình xem xét mức độ nhạy cảm của tai đối với các tần số khác nhau. Tai người ít nhạy cảm với các tần số cao và thấp. Nĩ nhạy cảm nhất đối với tần số 2- 4 kHz, cùng dải tần số với tiếng nĩi con người. Các sub-band nên phù hợp với tai người., nghĩa là mỗi sub-band cần cĩ các tần số cĩ cùng các tính chất âm học tâm lý. Trong MPEG layerII, mỗi sub-band cĩ độ rộng 625Hz, do đĩ cần phải cĩ những bộ lọc băng thơng phức tạp. Để các bộ lọc đỡ phức tạp, người ta thêm FFT (Fast Fourie Transform) vào song song với bộ lọc và sử dụng các thành phần phổ từ FFT như là các thơng tin thêm vào bộ mã hĩa. Bằng cách này ta sẽ lấy mật độ bit cao hơn đối với các tần số thấp mà tai người nhạy cảm hơn. Cịn nhiều vấn đề cần phải bàn tới. Chúng ta chỉ mới giải thích sự che đồng bộ, hiệu qủa che cịn xảy ra trước và sau một âm mạnh. 3. Các lớp của âm thanh MPEG. Cĩ nhiều sự nhầm lẫn về lớp âm thanh MPEG. Tất cả các lớp đều dựa trên cùng một lược đồ mã hĩa (mã hĩa theo nhận thức). Mức độ phức tạp của bộ mã hĩa và giải mã tuỳ thuộc vào mỗi lớp. Sau đây là hình ảnh cho thấy tỉ số nén mà ta cần phải đạt tới 100% chất lượng CD với các bộ mã hĩa và giải mã khác nhau. Hình 4.8 Sau đây là chi tiết về các lớp. SVTH: Đỗ Văn Tuấn Trang 40
  41. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình a. Lớp I (Layer I): Đây là lớp đơn giản nhất phù hợp cho ứng dụng của người dùng. Mơ hình âm học tâm lý của lớp này chỉ sử dụng các tần số che. Điều này cĩ nghĩa rằng nĩ sẽ bỏ qua các tần số bị khuất sau các tần số khác. Phạm vi tốc độ bit từ 32 kbit/s (mono) đến 448 kbit/s (stereo). Tùy thuộc vào mức độ phức tạp của bộ mã hĩa, một âm thanh chất lượng cao (gần với âm thanh CD) yêu cầu tốc độ bit khoảng 256 - 384 kb/s trên một chương trình stereo. Khơng nên mã hĩa với mức nén cao hơn 384 kb/s. Độ phức tạp của bộ giải mã thấp, độ phức tạp của bộ mã hĩa cao hơn 1.5 - 3 lần. Lớp I được dùng nhiều trong DDC và Solid State Audio. b. Lớp II (Layer II): Lớp II đề nghị mức độ nén cao hơn lớp I và mức độ lọc sâu hơn. Nĩ cĩ những ứng dụng số cho cả âm thanh chuyên nghiệp và tài tử, như qua đài phát thanh, TiVi Phạm vi tốc độ bit từ 32 - 192 kb/s cho âm thanh mono, và từ 64 - 384 kb/s cho âm thanh stereo. Tùy thuộc vào mức độ phức tạp của bộ mã hĩa, một âm thanh chất lượng cao (gần với âm thanh CD) yêu cầu tốc độ bit khoảng 256 - 384 kb/s trên một chương trình stereo. Mức độ phức tạp của bộ giải mã 25% cao hơn so với lớp I, và bộ mã hĩa cĩ mức phức tạp cao hơn 2 - 4 lần. c. Lớp III (Layer III). Lớp III cịn đưa ra mức độ nén và lọc cao hơn cả lớp II và sử dụng một bộ mã hĩa Huffman. Layer Complexity Encoder Decoder I 1.5 – 3 1 II 2 – 4 1.25 III > 7.5 2.5 Trong bảng trên, độ phức tạp của bộ giải mã lớp I được dùng để so sánh. III. CÁC THƠNG SỐ DÙNG TRONG MPEG. Chuẩn MPEG cho phép ta chọn lựa các thơng số cho việc nén âm thanh tốt nhất phù hợp với ứng dụng mà ta sử dụng. Lược đồ mã hĩa cho các loại là tổng quát. Các thơng số cĩ thể chọn lựa trong bộ mã hĩa MPEG bao gồm: Mode, Sampling frequency, bitrate, và Layer. SVTH: Đỗ Văn Tuấn Trang 41
  42. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình a. Mode. Chuẩn MPEG cĩ 4 chế độ: Mono. Dual channel. Stereo. Intensity Stereo (cịn gọi là Joint Stereo). Chế độ Mono rõ ràng được dùng cho âm thanh 1 kênh. Để chọn chế độ cho các ứng dụng 2 kênh, đầu tiên ta phải xác định đâu là tín hiệu trái và đâu là tín hiệu phải để chia chúng ra thành 2 files khác nhau, nhằm sau này ta cĩ thể làm việc độc lập trên kênh trái hoặc phải. Lúc đĩ ta sẽ chọn chế độ Mono. Nếu 2 kênh khơng cần hoạt động độc lập, ta chọn Stereo, Dual hay Intensity Stereo để tạo một file duy nhất. Chế độ Stereo hay kênh Dual là hồn tồn đồng nhất khi chúng cùng sinh ra một file duy nhất cho tín hiệu stereo. Tuy nhiên một bit chỉ thị sẽ nhận dạng xem một file là ở chế độ nào và cĩ thể được dùng cho những áp dụng nào Chế độ Intensity Stereo xem xét sự dư thừa giữa các kênh trái và phải nhằm tối ưu mã. Chất lượng chủ quan của Intensity Stereo thay đổi theo hình ảnh stereo của tín hiệu đã mã hĩa. Tuy nhiên nĩ đặc biệt thích hợp cho tốc độ truyền bit thấp. b. Sampling Frequency (tốc độ lấy mẫu). Một số tốc độ lấy mẫu: 32kHz, 44.1kHzvà 48kHz đối với MPEG1 (Tiêu chuẩn ISO/IEC 11172-3). 16kHz, 22.05kHzvà24kHz đối với MPEG2 (Tiêu chuẩn ISO/IEC13818-3). Khi chọn lựa tốc độ lấy mẫu cần xem xét các vấn đề: Tần số lấy mẫu càng lớn thì chất lượng âm thanh càng cao(độ dài frame nhỏ hơn). Băng thơng tín hiệu giới hạn ở mức 15 kHz khi lấy mẫu ở tốc độ 32 kHz và 8 kHz ở tốc độ 16 kHz. SVTH: Đỗ Văn Tuấn Trang 42
  43. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Tần số lấy mẫu (kHz) và tốc độ của âm thanh mã hĩa (kbps) cĩ thể chọn độc lập. Tần số lấy mẫu 44.1 kHz hay 22.05 kHz là khơng thiết thực cho việc chọn lọc vì độ dài frame (byte) là thay đổi. Những file được lấy mẫu ở những tần số khác nhau thì rất khĩ khăn khi hịa trộn. Khi dùng đường nhập số AES/EBU, tần số lấy mẫu bị cố định bởi tín hiệu nhập. Nếu khơng bắt buộc, Digigram yêu cầu lấy mẫu ở 48 kHz hoặc 44.1 kHz cho phát thanh hay ứng dụng multimedia. Nếu ta phải sử dụng tốc độ bit thấp cho sự truyền cĩ hiệu qủa, tốc độ 24 kHz là thích hợp. c. Bit Rate. Mỗi Layer và chế độ cĩ nhiều cách chọn lựa tốc độ bit (bit rate). Việc chọn tốc độ bit tùy thuộc trước tiên vào chất lượng âm yêu cầu. Băng thơng tín hiệu là hẹp hơn nếu tốc độ bit thấp, khiến cho nĩ khơng thực tế đối với một số ứng dụng. Tốc độ bit được đo theo kilobits/sec(kbps). Khi chọn lựa tốc độ bit cần xem xét các vấn đề: Tại 128 kbps trên mỗi kênh (hay 256 kbps stereo), chất lượng âm thanh CD sẽ đạt được với Layer I hay Layer II. Tại 192 kbps trên mỗi kênh, chất lượng âm thanh là hồn tồn trong suốt. Tốc độ 128 kbps/kênh được dùng phổ biến nhất trong phát thanh. Nĩ tương ứng với tỉ số nén 1:6 ở tốc độ lấy mẫu 48 kHz. Tốc độ thấp hơn 128 kbps/kênh được dùng trong các ứng dụng yêu cầu tỉ số nén lớn hơn do giới hạn của băng thơng truyền hay thiết bị lưu trữ. Một số tốc độ bit cung cấp bởi chuẩn âm thanh MPEG : MPEG 1: 32 kHz, 44.1 kHz và 48 kHz - Layer I : 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 kbps. Những tốc độ này là cĩ thể ở chế độ Mono hay stereo - Layer II : SVTH: Đỗ Văn Tuấn Trang 43
  44. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 kbps. 32, 48, 56, 80 kbps chỉ cĩ thể ở chế độ Mono; •64, 96, 112, 128, 160, 192 kbps cĩ thể ở cả hai chế độ Mono và Stereo;•224, 256, 320, 384 kbps chỉ cĩ thể ở chế độ Stereo. MPEG 2 : 16 kHz, 22.05 kHz và 24 kHz - Layer I : 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256 kbps Những tốc độ này là cĩ thể ở chế độ Mono hay stereo - Layer II : 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 kbps. Những tốc độ này là cĩ thể ở chế độ Mono hay stereo. d. Layers. Chuẩn MPEG cĩ ba layer. Khi chọn lựa tốc độ bit cần xem xét các vấn đề: Ở cùng tốc độ bit, Layer II mang lại chất lượng âm thanh tốt hơn Layer I. Kết luận này là chủ quan, vì sự chênh lệch là rất khĩ phân biệt ở tốc độ bit 128 kbps và lớn hơn. Dùng Layer I thì việc chọn lọc chính xác hơn Layer II bởi vì độ phân giải của Layer I gấp ba lần Layer II. Resolution Table Sampling Layer I Layer II frequency (384 samples) (1152 samples) 32 kHz 12 ms 36 ms 44.1 kHz # 8.71 ms # 26.12 ms 48 kHz 8 ms 24 ms 16 kHz 24 ms 72 ms 22.05 kHz # 17.42 ms # 52.24 ms SVTH: Đỗ Văn Tuấn Trang 44
  45. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình 24 kHz 16 ms 48 ms Các điểm kỹ thuật mấu chốt. Chuẩn mã hĩa âm thanh MPEG chỉ định việc ghi một số cố định các mẫu (384 cho Layer I và 1152 cho Layer II) để tạo ra một chuỗi các bytes gọi là “frame”. “Frame” là thực thể nhỏ nhất được điều khiển bởi một ứng dụng. Việc chọn tốc độ bit(kbps) thiết lập nên kích thước của frame đĩ theo byte. Ví dụ: Ở 48 kHz, 128 kbps, chế độ Mono, Layer II: 48,000 mẫu, tương ứng 1000 ms hay 1s, 1152 mẫu tương ứng 24 ms. Ở tốc độ bit 128,000 bits/s, 3072 bits (384 bytes) cần cho 24 ms. Chiều dài frame vì thế là 384 byte. Để lưu 1 phút, cần 960,000 byte (hay khoảng 1 Megabyte) đĩa trống. SVTH: Đỗ Văn Tuấn Trang 45
  46. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình CHƯƠNG 5. CÁC GIẢI THUẬT NÉN ÂM THANH. I. NỀN TẢNG LÝ THUYẾT THƠNG TIN. 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 suấ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. Hình 5.1 Ký hiệu Số lần log(1/p) Mã Cộng(số bit) SVTH: Đỗ Văn Tuấn Trang 46
  47. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình 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 II. 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 suất thấp nhất, tạo node cha cho chúng. - Gán tổng các xác suấ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. Hình 5.2 Ký hiệu Số lần log(1/p) Mã Cộng(số bit) SVTH: Đỗ Văn Tuấn Trang 47
  48. Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình 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 tốn sự ảnh hưởng của các ký hiệu trước đĩ với xác suấ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 Bộ giải mã SVTH: InitializĐỗ Văn e_model();Tuấn Initialize_model(); Trang 48 while ((c = getc (input)) != eof) while ((c = decode (input)) != eof) { { encode(c, output); putc(c, output);
  49. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 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 . - Khi cần thiết trao đổi (swapping), node xa nhất với trọng lượng W được trao đổ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 trao đổi, ví dụ trong cây thứ 3 , node A được trao đổ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: giả 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] X Y XX XY YX YY Để 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. 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. SVTH: Đỗ Văn Tuấn Trang 49
  50. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 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 đố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). Giả 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 SVTH: Đỗ Văn Tuấn Trang 50
  51. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình ^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; } III. CÁC GIẢI THUẬT NÉN CĨ TỔN THẤT. 1. Các phương pháp nén âm thanh đơn giản: Các phương pháp nén khảo sát ở trên khơng hiệu quả trong việc nén âm thanh. Sau đây là các phương pháp nén cĩ tổn thất: - Nén “silence” : dị các khoảng “yên lặng”, giống như mã hố run-length. - LPC (Linear Predictive Coding). - CELP (Code Excited Linear Predictor). 2. Nén âm thanh dùng mơ hình âm - tâm lý. a. Hệ thống nghe và phát âm của con người. SVTH: Đỗ Văn Tuấn Trang 51
  52. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình Phạm vi nghe được từ 20 Hz đến 20 kHz, nhạy cảm ở 2 - 5kHz. Phạm vi phát âm bình thường từ 500 Hz đến 2 kHz. b. Che tần số (Frequency masking) “Ngưỡng che” (Threshold masking): sinh ra từ hiệu ứng che, mỗi âm với một tần số và mức to (dB) xác định sẽ cĩ một “ngưỡng che” (xem hình 4.3 và 4.4) c. Băng giới hạn. Thước đo tần số đồng bộ khơng tương xứng với độ rộng của đường cong che. Băng giới hạn cĩ độ rộng là 100Hz đối với các tần số che 500Hz. Định nghĩa một đơn vị mới cho tần số là bark ( Barkhausen) 1 Bark = bề rộng của băng giới hạn: - Tần số 500Hz : 1 bark = 9 + 4log(freq/1000). Ngưỡng che trên thước đo băng giới hạn: Hình 5.3 d. Che nhất thời (Temporal masking): che theo thời gian. Tai người cũng cĩ đặc tính lưu âm. SVTH: Đỗ Văn Tuấn Trang 52
  53. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình Nếu cĩ một âm thanh lớn, rồi ngưng nĩ lại, mãi một lúc sau ta mới cĩ thể nghe được một âm lân cận nhỏ hơn (xem hình 4.5 và 4.6). 3. Nén âm thanh MPEG. Vài thơng số: MPEG-1 : 1.5Mbits/s cho âm thanh và hình ảnh. Khoảng 1.2 Mbits cho hình ảnh và 0.3Mbits/s cho âm thanh. Am thanh CD khơng nén dùng: (44,100 mẫu/s * 16bit/mẫu * 2 kênh) > 1.4 Mbits/s Am thanh MPEG cung cấp các tần số lấy mẫu là 32, 44.1 và 48 kHz. Giải thuật: 1. Dùng bộ lọc thơng để chia tín hiệu âm thanh thành các sub-band theo tần số, tương ứng với 32 băng giới hạn lọc sub-band. 2. Xác định số lượng che của mỗi band gây bởi các band lân cận bằng các kết qủa bước 1 mơ hình âm - tâm lý. 3. Nếu mức to của một băng mà nhỏ hơn ngưỡng che thì khơng mã hĩa nĩ. 4. Ngược lại, xác định số bit cần thiết để mã hĩa sao cho nhiễu sinh ra bởi việc lượng tử hĩa này thấp hơn đường cong che. 5. Định dạng dịng dữ liệu bit : Hình 5.4 Ví dụ: Sau khi phân tích, 16 band đầu tiên trong số 32 band như sau: ___ Band 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Level(dB) 0 8 12 10 6 2 10 60 35 20 15 2 3 5 3 1 ___ SVTH: Đỗ Văn Tuấn Trang 53
  54. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình Nếu mức to của âm thứ 8 là 60dB, nĩ sẽ che band thứ 7 ở mức 12dB và band thứ 9 ở mức 15dB. Mức to ở band 7 là 10dB ( 15dB) nên được tiếp tục xử lý. Layer I: bộ lọc loại DCT với 1 frame và độ rộng tần số như nhau trên mỗi sub-band. Mơ hình âm-tâm lý chỉ sử dụng hiệu quả che tần số (Frequency masking). Layer II: sử dụng 3 frame trong bộ lọc (trước, hiện tại và kế tiếp, tổng cộng 1152 mẫu). Mơ hình âm-tâm lý cĩ sử dụng hiệu quả che nhất thời (Temporal masking). Layer III: dùng bộ lọc băng giới hạn tốt hơn, mơ hình âm-tâm lý cĩ sử dụng hiệu quả che nhất thời, và cĩ dùng bộ mã hố Huffman. Phần II THIẾT KẾ CHƯƠNG TRÌNH SVTH: Đỗ Văn Tuấn Trang 54
  55. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình CHƯƠNG 6. LƯU ĐỒ GIẢI THUẬT VÀ CẤU TRÚC DỮ LIỆU. I. SƠ ĐỒ KHỐI. Cấu hình mặc định Set_default() Thay đổi hay giữ nguyên cấu hình Đặt input và output file; Mở input file và kiểm tra; Wave_open(); Start compress () Open_bit_stream_w(); Memset(); Chuẩn bị vùng đệm L3_psycho_initialise(); Khởi tạo mơ hình âm-tâm lý L3_subband_initialise(); Tính các hệ số của bộ lọc tần số L3_mdct_initialise(); Khởi tạo dữ liệu tính MDCT L3_loop_initialise(); Khởi tạo mảng pow43[I].0 0 Đ Làm sạch buffer Dùng mơ hình âm-tâm lý để L3_FlushBitstream(); phân tích dữ liệu L3_psycho_analise(); Đĩng thiết bị ghi Dùng bộ lọc nhiều pha để xử lý Close_bit_stream_w(); dữ liệu L3_window_subband(); L3_filter_subband(); Đĩng file nguồn Wave_close(); Tính MDCT cho các đường ra nhiều pha L3_mdct_sub(); Kết thúc Xác định số bit để mã hố một mẫu dữ liệu L3_interation_loop(); Ghi frame vào dịng bit L3_format_bitstream(); SVTH: Đỗ Văn Tuấn Trang 55
  56. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình II. CẤU TRÚC DỮ LIỆU VÀ ĐỊNH NGHĨA. A. Cấu trúc dữ liệu. 1. Các cấu trúc về file: - Tập tin tiêu đề : - Sử dụng : truy xuất các tập tin dạng *.wav và *.mp3. Trong chương trình, các cấu trúc này sử dụng ở các giai đoạn mở file, đọc cấu hình file, truy xuất các thơng tin về cấu hình file. a. Cấu trúc FILE WAVE : typedef struct { FILE *file; int type; int channels; int bits; long samplerate; long total_samples; long length; } wave_t; b. Cấu trúc FILE MPEG: typedef struct { FILE *file; int type; int layr; int mode; int bitr; int psyc; int emph; int padding; long samples_per_frame; long bits_per_frame; long bits_per_slot; long total_frames; int bitrate_index; int samplerate_index; int crc; int ext; int mode_ext; int copyright; int original; int mode_gr; } mpeg_t; c. Cấu trúc config_t : SVTH: Đỗ Văn Tuấn Trang 56
  57. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình typedef struct { time_t start_time; char* infile; wave_t wave; char* outfile; mpeg_t mpeg; } config_t; 2. Cấu trúc dịng bit dữ liệu: bitstream_t - Tập tin tiêu đề : - Sử dụng: dùng trong quá trình đọc hoặc ghi dữ liệu từ file lên vùng đệm và ngược lại. typedef struct bit_stream_struc { FILE *pt; /* con trỏ đến file bit dữ liệu */ unsigned char *buf; /* vùng đệm cho dịng bit dữ liệu */ int buf_size; /* kích thước vùng đệm tính theo số byte */ long totbit; /* đếm bit */ int buf_byte_idx; /* chỉ byte trên cùng trong vùng đệm */ int buf_bit_idx; /* bit trên cùng của byte trên cùng trong vùng đệm */ int mode; /* mở dịng bit ở chế độ đọc hay ghi */ int eob; /* chỉ đến cuối vùng đệm */ int eobs; /* đầu cuối của cờ dịng bit */ char format; /* định dạng file ở chế độ đọc (BINARY/ASCII) */ } bitstream_t; 3. Các cấu trúc để định dạng dịng bit dữ liệu: - Tập tin tiêu đề : a. Kiểu số nguyên: typedef unsigned int uint32; /* định nghĩa số nguyên khơng dấu 32 bit */ typedef unsigned short uint16; /* định nghĩa số nguyên khơng dấu 16 bit */ b. Con trỏ hàm (*BitsFcnPtr): Đây là một nguyên mẫu hàm con trỏ cần phải cĩ để ghi các bit vào dịng dữ liệu. Nĩ ghi “length” bits từ “value” bits, theo cách ghi msb-first. Các bit trong value giả định là right-justified. typedef void (*BitsFcnPtr)( uint32 value, uint16 length ); c. Cấu trúc BF_BitstreamElement: Một BitstreamElement chứa đựng dữ liệu đã mã hố sẽ được ghi vào dịng bit. “length” bit trong số “value” sẽ được ghi vào dịng bit theo msb-first. typedef struct SVTH: Đỗ Văn Tuấn Trang 57
  58. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình { uint32 value; uint16 length; } BF_BitstreamElement; d. Cấu trúc BF_BitstreamPart: Một BitstreamPart bao gồm một nhĩm các “nrEntries” của BitstreamElements. Mỗi BitstreamElement sẽ được ghi vào dịng bit theo thứ tự mà nĩ xuất hiện trong dãy 'element'. typedef struct { uint32 nrEntries; BF_BitstreamElement *element; } BF_BitstreamPart; e. Cấu trúc BF_FrameData Cấu trúc này chứa đựng tất cả những thơng tin cần thiết cho bộ định dạng dịng bit để mã hố một frame dữ liệu. Ta phải điền đầy nĩ và trỏ tới khi định dạng. typedef struct BF_FrameData { BitsFcnPtr putbits; /* your low-level bitstream function */ int frameLength; int nGranules; int nChannels; BF_BitstreamPart *header; BF_BitstreamPart *frameSI; BF_BitstreamPart *channelSI[MAX_CHANNELS]; BF_BitstreamPart *spectrumSI[MAX_GRANULES][MAX_CHANNELS]; BF_BitstreamPart *scaleFactors[MAX_GRANULES][MAX_CHANNELS]; BF_BitstreamPart *codedData[MAX_GRANULES][MAX_CHANNELS]; BF_BitstreamPart *userSpectrum[MAX_GRANULES][MAX_CHANNELS]; BF_BitstreamPart *userFrameData; } BF_FrameData; f. Các cấu trúc liên quan dến bộ định dạng: Cấu trúc này chứa đựng thơng tin được cung cấp bởi bộ định dạng dịng bit. Ta cĩ thể sử dụng nĩ để kiểm tra và xem thử bộ mã của ta cĩ chấp nhận các kết quả của việc gọi bộ định dạng hay khơng. typedef struct BF_FrameResults { int SILength; SVTH: Đỗ Văn Tuấn Trang 58
  59. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình int mainDataLength; int nextBackPtr; } BF_FrameResults; typedef struct BF_PartHolder { int max_elements; BF_BitstreamPart *part; } BF_PartHolder; typedef struct { int frameLength; int SILength; int nGranules; int nChannels; BF_PartHolder *headerPH; BF_PartHolder *frameSIPH; BF_PartHolder *channelSIPH[MAX_CHANNELS]; BF_PartHolder *spectrumSIPH[MAX_GRANULES][MAX_CHANNELS]; } MYSideInfo; 4. Cấu trúc huffcodetab: - Tập tin tiêu đề : - Sử dụng : dùng trong quá trình mã hố dữ liệu theo thuật tốn Huffman. struct huffcodetab { unsigned int xlen; /*max. x-index+ */ unsigned int ylen; /*max. y-index+ */ unsigned int linbits; /*number of linbits */ unsigned int linmax; /*max number to be stored in linbits */ HUFFBITS *table; /*pointer to array[xlen][ylen] */ unsigned char *hlen; /*pointer to array[xlen][ylen] */ }; 5. Các cấu trúc tính MDCT. - Tập tin tiêu đề : - Sử dụng : trong tính tốn MDCT, định dạng dịng bit, tính tốn mơ hình tâm lý, mã hố dữ liệu typedef struct { unsigned part2_3_length; unsigned big_values; unsigned count1; unsigned global_gain; unsigned scalefac_compress; unsigned window_switching_flag; SVTH: Đỗ Văn Tuấn Trang 59
  60. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình unsigned block_type; unsigned mixed_block_flag; unsigned table_select[3]; int /* unsigned */ subblock_gain[3]; unsigned region0_count; unsigned region1_count; unsigned preflag; unsigned scalefac_scale; unsigned count1table_select; unsigned part2_length; unsigned sfb_lmax; unsigned sfb_smax; unsigned address1; unsigned address2; unsigned address3; double quantizerStepSize; /* added for LSF */ unsigned *sfb_partition_table; unsigned slen[4]; } gr_info; typedef struct { int main_data_begin; /* unsigned -> int */ unsigned private_bits; int resvDrain; unsigned scfsi[2][4]; struct { struct { gr_info tt; } ch[2]; } gr[2]; } L3_side_info_t; typedef struct { double l[2][2][21]; double s[2][2][12][3]; } L3_psy_ratio_t; typedef struct { double l[2][2][21]; double s[2][2][12][3]; } L3_psy_xmin_t; typedef struct { int l[2][2][22]; /* [cb] */ int s[2][2][13][3]; /* [window][cb] */ } L3_scalefac_t; 6. Cấu trúc scalefac_struct: - Tập tin tiêu đề : SVTH: Đỗ Văn Tuấn Trang 60
  61. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình struct scalefac_struct { int l[23]; int s[14]; }; B. Các định nghĩa. 1. Các định nghĩa dùng trong truy xuất dịng bit dữ liệu: - Tập tin tiêu đề : #define MINIMUM 4 /* Minimum size of the buffer in bytes */ #define MAX_LENGTH 32 /* Maximum length of word written or read from bit stream */ #define READ_MODE 0 #define WRITE_MODE 1 #define ALIGNING 8 #define BINARY 0 #define ASCII 1 #define TRUE 1 #define FALSE 0 #ifndef BS_FORMAT #define BS_FORMAT ASCII /* BINARY or ASCII = 2x bytes */ #endif #define BUFFER_SIZE 4096 #define MIN(A, B) ((A) (B) ? (A) : (B)) 2. Các định nghĩa dùng trong tính tốn FFT: - Tập tin tiêu đề : #define BLKSIZE_S 256 #define LOGBLKSIZE_S 8 3. Các định nghĩa dùng trong định dạng dịng dữ liệu: - Tập tin tiêu đề: #define MAX_CHANNELS 2 #define MAX_GRANULES 2 4. Các định nghĩa dùng trong bộ mã hố Huffman: - Tập tin tiêu đề: SVTH: Đỗ Văn Tuấn Trang 61
  62. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình #define HUFFBITS unsigned long int #define HTN 34 #define MXOFF 250 5. Các định nghĩa dùng trong phân tích dữ liệu : - Tập tin tiêu đề: #define e 2.71828182845 #define CBLIMIT 21 #define SFB_LMAX 22 #define SFB_SMAX 13 #define PRECALC_SIZE 1024 /* WAS 256 !!! */ 6. Các định nghĩa dùng trong mơ hình âm tâm lý: - Tập tin tiêu đề: #define HBLKSIZE 513 #define CBANDS 63 #define CBANDS_s 42 #define BLKSIZE_s 256 #define HBLKSIZE_s 129 #define TCBMAX_l 63 #define TCBMAX_s 42 #define SBMAX_l 21 #define SBMAX_s 12 /* #define switch_pe 1800 */ #define NORM_TYPE 0 #define START_TYPE 1 #define SHORT_TYPE 2 #define STOP_TYPE 3 #define maximum(x,y) ( (x>y) ? x : y ) #define minimum(x,y) ( (x #define Read32BitsLowHigh(f) Read32Bits(f) #define WriteString(f,s) fwrite(s,strlen(s),sizeof(char),f) #define Read32BitsLowHigh(f) Read32Bits(f) 8. Các định nghĩa dùng trong cấu trúc file wave và file mpeg: #define PI 3.14159265358979 #define PI4 PI/4 #define PI64 PI/64 #define SQRT2 1.41421356237 #define LOGBLKSIZE 10 #define LN_TO_LOG10 0.2302585093 SVTH: Đỗ Văn Tuấn Trang 62
  63. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình #define BLKSIZE 1024 #define HAN_SIZE 512 #define SCALE_BLOCK 12 #define SCALE_RANGE 64 #define SCALE 32768 #define SBLIMIT 32 #define WAVE_RIFF_PCM 0 #define WAVE_PCM_LOHI 1 #define WAVE_PCM_HILO 2 #define WAVE_PCM_AIFF 3 #define TYPE_MPEG_I 1 #define LAYR_III 2 #define MODE_STEREO 0 #define MODE_JSTEREO 1 #define MODE_DUAL 2 #define MODE_MONO 3 #define PSY_NONE 0 #define PSYC_MUSICAM 1 #define PSYC_ATT 2 SVTH: Đỗ Văn Tuấn Trang 63
  64. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình III. LƯU ĐỒ Cấu hình mặc định Set_default() Thay đổi hay giữ nguyên cấu hình Đặt input và output file; Mở input file và kiểm tra; Wave_open(); StartL3-Compress () M thi t b ghi Open_bit_stream_w(); ở ế ị Memset(); Chuẩn bị vùng đệm Kh i t o mơ hình âm-tâm lý L3_psycho_initialise(); ở ạ L3_subband_initialise(); Tính các h s c a b l c t n s ệ ố ủ ộ ọ ầ ố L3_mdct_initialise(); Khởi tạo dữ liệu tính MDCT L3_loop_initialise(); Khởi tạo mảng pow43[I].0<I<1024 Chuẩn bị Frame dữ liệu Config.mpeg.mode_gr=2; Config.mpeg.sample_per_frame=1152; ___ Config.mpeg.total_frames=(config.wave.total _samples /config.mpeg.samples_per_frame); Config.wave.bits_per_slot =8; Frames_processed =0; Sideinfo_len =32; S config,wave.channels=1 Đ Sideinfo_len +=136; Sideinfo_len +=256; 1 SVTH: Đỗ Văn Tuấn Trang 64
  65. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 1 avg_slots_per_frame = ((double)config.mpeg.samples_per_frame / ((double)config.wave.samplerate / 1000))* ((double)config.mpeg.bitr / (double)config.mpeg.bits_per_slot) ; whole_slots_per_frame = (int) avg_slots_per_frame ; frac_slots_per_frame = avg_slots_per_frame - (double) whole_slots_per_frame ; slot_lag = - frac_slots_per_frame ; S frac_slots_per_frame = 0 Đ config.mpeg.padding = 0 4 S wave_get(buffer) 0 Đ Update_stastus(frames_processed ++); L3_FlushBitstream( ); buffer_windows[0] = buffer[0]; close_bit_stream_w( ); buffer_windows[1] = buffer[1]; wave_close( ) ; S Kết thúc frac_slots_per_frame 0 Đ S slot_lag > (frac_slots_per_frame - 1) Đ slot_lag -= frac_slots_per_frame; slot_lag -= frac_slots_per_frame; config.mpeg.padding = 0 ; config.mpeg.padding = 0 ; config.mpeg.bits_per_frame = 8*(whole_slot_per_frame + config.mpeg.padding); mean_bit = (config.mpeg.bits_per_frame - sideinfo_len)/ config.mpeg.mode_gr ; 2 SVTH: Đỗ Văn Tuấn Trang 65
  66. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 2 gr = 0 ; channel = 0 Đ ; L3_psycho_analise( ) ; channel ++ ; channel < config.wave.channels Đ S gr ++ ; gr < config.mpeg.mod_gr S gr = 0 ; channel = 0 ; Đ i = 0 ; L3_window_subband( ); Đ Đ L3_filter_subband( ); i ++ ; i < 18 S channel ++ ; channel < config.wave.channels S gr ++ ; gr < config.mpeg.mod_gr S 3 SVTH: Đỗ Văn Tuấn Trang 66
  67. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 3 L3_mdct_sub( ); L3_iteration_loop( ); L3_format_bitstream( ); frame_bits = sstell(&bs) - sent_bits ; S (frame_bits) mod (config.mpeg.bits_per_slot) 0 Đ sent_bits += frame_bits; Báo lỗi 4 SVTH: Đỗ Văn Tuấn Trang 67
  68. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình CHƯƠNG 7. GIAO DIỆN VÀ THUYẾT MINH CHƯƠNG TRÌNH I. Giới thiệu. Giao diện là cơng cụ trợ giúp đắc lực cho người sử dụng. Những phần mềm cĩ giao diện tốt luơn được ưa chuộng. Đĩ cũng chính là ưu điểm tuyệt vời của Windows. Lập trình trong Windows hỗ trợ những cơng cụ cho phép ta tạo ra những giao diện rất dễ dàng và thân thiện. Tuy nhiên, thiết kế giao diện để cho ai cũng cĩ thể sử dụng được và khơng bị nhầm lẫn khơng phải là chuyện dễ dàng. Nĩ địi hỏi ta phải cĩ một cái nhìn bao quát, thậm chí phải hiểu sâu về giải thuật của chương trình thì mới cĩ thể loại trừ những sai lầm khi sử dụng. Lập trình trong Windows là lập trình theo tình huống. Mọi nút nhấn, ơ đối thoại trên giao diện đều cĩ thể được truy cập tới bất kỳ lúc nào mà khơng theo một trình tự nhất định. Do đĩ người lập trình cần phải dự trù đến mọi tình huống và cần phải đưa ra một số đề nghị dưới dạng những thơng số định sẵn cho người sử dụng theo đĩ mà vận hành. Ngồi ra, giao diện cần cĩ phần trợ giúp để hướng dẫn cho người sử dụng ở bất kỳ lúc nào. II. Giao diện. Dựa trên sơ đồ khối và lưu đồ giải thuật. Giao diện bao gồm các phần như hình vẽ sau: 2 3 5 6 7 8 1 4 2 13 12 14 11 10 9 1. Input group. Nhĩm các thơng tin cấu hình và lệnh về tập tin nguồn ( *.wav). Bao gồm các thơng tin như : bitrates, samplerates, mode, File path name SVTH: Đỗ Văn Tuấn Trang 68
  69. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 2. Open button. Mở hộp thoại File Open của Windows để chọn file cần nén. Phần mở rộng mặc định là .wav 3. Text Edit box. Dùng gõ file nguồn bằng tay. Mặc định là *.wav. 4. Bitrates. Cho biết chỉ số tốc độ bit của tập tin nguồn .wav đã chọn trên mục 2 hoặc 3. Chỉ số mặc định là 128. Khơng sửa bằng tay được. 5. Samplerates. Cho biết tần số lấy mẫu của tập tin nguồn .wav đã chọn trên mục 2 hoặc 3. Tần số mặc định là 44100 Hz. Khơng sửa bằng tay được. Các tần số cĩ thể bao gồm : 32000, 44100 và 48000 Hz. 6. Output. Nhĩm các thơng tin cấu hình và lệnh về tập tin đích ( *.mp3). Bao gồm các thơng tin như : bitrates, samplerates, mode, File path name 7. Save button. Mở hộp thoại File Save của Windows để ghi đường dẫn và tên file nén. Phần mở rộng mặc định là .mp3. 8. Text Edit box. Dùng gõ đường dẫn à tên tập tin đích bằng tay. Mặc định là *.mp3. Khi đã chọn được tập tin nguồn trong phần 2 hoặc 3 thì trong ơ này sẽ tự động xuất hiện đường dẫn và tên tập tin đích. 9. Bitrates. Định chỉ số tốc độ bit của tập tin đích đã chọn trên mục 7 hoặc 8. Chỉ số mặc định là 128. Cĩ thể chọn các chỉ số khác trong ơ kéo xuống, bao gồm các giá trị : 16, 32, 40, 48, 56, 64, 80, 96, 112, 128, 156, 160, 192, 224, 256, 320. 10. Samplerates. Cho biết tần số lấy mẫu của tập tin đích, phụ thuộc và bằng với tần số lấy mẫu của tập tin nguồn. Tần số mặc định là 44100 Hz. Khơng sửa bằng tay được. 11. Mode group. SVTH: Đỗ Văn Tuấn Trang 69
  70. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình Nhĩm các chế độ Stereo hay Mono. Mặc định là Stereo. 12. Progress bar. Thanh tiến trình, xuất hiện trong quá trình nén từ tập tin nguồn .wav sang tập tin đích .mp3 . 13. Compress button. Nút nhấn này chỉ cĩ thể sau khi đã chọn và định cấu hình đầy đủ cho các tập tin nguồn và đích. Nghĩa là chỉ cĩ thể nhấn được nút này sau khi đã nhấn nút Update. Khi nhấn nút này, quá trình nén từ tập tin nguồn sang tập tin đích mới thực sự bắt đầu. Đồng thời thanh tiến trình mới bắt đầu hoạt động. Kết thúc quá trình nén sẽ cĩ thơng điệp báo cho biết đã hồn tất cơng việc 14. Update button. Phím này được nhấn sau khi đã chọn các tập tin nguồn và đích để cập nhật các thơng số chuẩn bị cho quá trình nén và kích hoạt phím Compress. III. Chương trình. Chương trình cĩ nền là hộp thoại MP3 COMPRESSOR hiển thị các phím nhấn cho người sử dụng lựa chọn và chạy ứng dụng. Do đĩ, tất cả các hàm chính đều được đặt trong lớp CMp3Dlg. Sau đây ta sẽ lần lược khảo sát một số hàm quan trọng. 1. OnInitDialog( ) : Hàm này khởi tạo một số giá trị mặc định cho hộp thoại, nhằm giúp cho người sử dụng cĩ một cái nhìn tồn cục và hiểu được ngay ứng dụng, để từ đĩ cĩ thể chọn lựa các thơng số thích hợp cho ứng dụng. Đồng thời, cũng cài đặt sẵn một số giá trị ban đầu cho các đối tượng được dùng cho chương trình. BOOL CMp3Dlg::OnInitDialog() { CDialog::OnInitDialog(); // Khởi tạo giá trị ban đầu cho hộp thoại m_stereo_in = 0; m_stereo_out = 0; m_file_in = "*.wav"; m_file_out = "*.mp3"; m_samplerates_in = "44100"; m_samplerates_out = "44100"; SVTH: Đỗ Văn Tuấn Trang 70
  71. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình m_bitrates_in = "128"; m_bitrates_out.AddString("32"); m_bitrates_out.AddString("40"); m_bitrates_out.AddString("48"); m_bitrates_out.AddString("56"); m_bitrates_out.AddString("64"); m_bitrates_out.AddString("80"); m_bitrates_out.AddString("96"); m_bitrates_out.AddString("112"); m_bitrates_out.AddString("128"); m_bitrates_out.AddString("160"); m_bitrates_out.AddString("192"); m_bitrates_out.AddString("224"); m_bitrates_out.AddString("256"); m_bitrates_out.AddString("320"); m_bitrates_out.SetCurSel(8); UpdateData(FALSE); bOpen = FALSE; bSave = FALSE; // Gán các hằng cho các đối tượng config.mpeg.type = TYPE_MPEG_I; config.mpeg.layr = LAYR_III; config.mpeg.mode = MODE_STEREO; config.mpeg.bitr = 128; config.mpeg.psyc = PSYC_ATT; config.mpeg.emph = EMPH_NONE; config.mpeg.crc = 0; config.mpeg.ext = 0; config.mpeg.mode_ext = 0; config.mpeg.copyright = 0; config.mpeg.original = 0; GetDlgItem(IDC_COMPRESS)->EnableWindow(FALSE); m_pbar.SetRange(0, 10000); return TRUE; // return TRUE unless you set the focus to a control } 2. OnFileOpen( ) : Hàm mở hộp thoại Open của Windows để chọn file nguồn cĩ phần mở rộng mặc định là .wav, gán cho biến m_file_in đường dẫn và tên file đã chọn. Đồng thời cũng tạo đường dẫn và tên file mặc định cho tập tin đích cĩ phần mở rộng .mp3 và gán cho biến m_file_out. void CMp3Dlg::OnFileOpen() { // Mở hộp thoại File Open của Windows bằng hàm thành viên dlgOpen của // lớp CFileDialog trong thư viện MFC. SVTH: Đỗ Văn Tuấn Trang 71
  72. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình CFileDialog dlgOpen(TRUE, "wav", "*.wav"); if (dlgOpen.DoModal() == IDOK) { m_file_in = dlgOpen.GetPathName(); // gán đường dẫn file nguồn // cho đối tượng m_file_in int len; str1 = m_file_in; len = str1.GetLength(); str2 = str1.Left(len - 3); str2 += "mp3"; m_file_out = str2; // gán đường dẫn file đích // cho đối tượng m_file_out bOpen = TRUE; UpdateData(FALSE); } } 3. OnFileWrite( ) : Hàm mở hộp thoại Save của Windows để chọn đường dẫn và tên tập tin đích trong trường hợp khơng muốn đường dẫn và tên file mặc định do hàm OnFileOpen( ) tạo ra, và gán nĩ cho biến m_file_out. void CMp3Dlg::OnFileWrite() { CFileDialog dlgWrite(FALSE, "mp3", str2); if (dlgWrite.DoModal() == IDOK) { m_file_out = dlgWrite.GetPathName(); // gán đường dẫn file đích // cho đối tượng m_file_out UpdateData(FALSE); bSave = TRUE; } } 4. OnUpdate( ) : Hàm cập nhật tất cả các thơng số đã chọn trên hộp thoại, đưa vào các đối tượng được dùng trong chương trình. Đồng thời kích hoạt phím nhấn COMPRESS cho phép phím này đã cĩ thể bắt đầu được sử dụng. Nếu các thơng số nhập khơng hợp lệ sẽ cho hiện ra các thơng báo để nhập lại. void CMp3Dlg::OnUpdate( ) { UpdateData(TRUE); if (!m_file_in.Compare("*.wav")) MessageBox("Enter the Input file, please!"); else if (!m_file_out.Compare("*.mp3")) { int len; str1 = m_file_in; SVTH: Đỗ Văn Tuấn Trang 72
  73. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình len = str1.GetLength(); str2 = str1.Left(len - 3); str2 += "mp3"; m_file_out = str2; } config.infile = m_file_in.GetBuffer(5); // Chuyển giao con trỏ chỉ // đến file nguồn if (!wave_open()) { MessageBox("Unable to open input file "); bWaveOpen = FALSE; } else bWaveOpen = TRUE; // Gán giá trị cấu hình bitrates cho biến config.mpeg.bitr tuỳ theo giá trị đã // chọn trên hộp thoại. if (m_bitrates_out.GetCurSel()==0) config.mpeg.bitr = 32; if (m_bitrates_out.GetCurSel()==1) config.mpeg.bitr = 40; if (m_bitrates_out.GetCurSel()==2) config.mpeg.bitr = 48; if (m_bitrates_out.GetCurSel()==3) config.mpeg.bitr = 56; if (m_bitrates_out.GetCurSel()==4) config.mpeg.bitr = 64; if (m_bitrates_out.GetCurSel()==5) config.mpeg.bitr = 80; if (m_bitrates_out.GetCurSel()==6) config.mpeg.bitr = 96; if (m_bitrates_out.GetCurSel()==7) config.mpeg.bitr = 112; if (m_bitrates_out.GetCurSel()==8) config.mpeg.bitr = 128; if (m_bitrates_out.GetCurSel()==9) config .mpeg.bitr= 160; if (m_bitrates_out.GetCurSel()==10) config.mpeg.bitr = 192; if (m_bitrates_out.GetCurSel()==11) config.mpeg.bitr = 224; if (m_bitrates_out.GetCurSel()==12) config.mpeg.bitr = 256; if (m_bitrates_out.GetCurSel()==13) config.mpeg.bitr = 320; config.mpeg.bitrate_index = find_bitrate_index(config.mpeg.bitr); bOpen = FALSE; bSave = FALSE; // Hàm GetDlgItem(IDC_ ) cho phép phím nhấn cĩ IDC_ làm thơng số cĩ thể // hoạt động được if (bWaveOpen) GetDlgItem(IDC_COMPRESS)->EnableWindow(); UpdateData(FALSE); } 5. OnCompress( ) : Khi gọi hàm này, quá trình nén từ tập tin nguồn .wav sang tập tin đích .mp3 sẽ bắt đầu thực hiện. Kết thúc quá trình nén sẽ cĩ hộp thoại xuất hiện thơng báo đã hồn tất. void CMp3Dlg::OnCompress() { CCompressDlg compDlg; config.outfile = m_file_out.GetBuffer(5); L3_compress(); wave_close(); compDlg.DoModal(); // Cho hiển thị hộp thoại thơng báo SVTH: Đỗ Văn Tuấn Trang 73
  74. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình // cơng việc nén đã hồn tất m_pbar.SetPos(0); // Trả trạng thái thanh tiến trình về vị trí đầu GetDlgItem(IDC_COMPRESS)->EnableWindow(FALSE); } 6. Wave_open( ) : Hàm mở file nguồn và kiểm tra xem định dạng file cĩ hợp lệ khơng, nếu khơng thì sẽ hiện thơng bào và chọn lại file khác. bool CMp3Dlg::wave_open() { static char *channel_mappings[] = {NULL,"mono","stereo"}; unsigned short wFormatTag; unsigned long dAvgBytesPerSec; unsigned short wBlockAlign; long filesize; long header_size; if((config.wave.file = fopen(config.infile,"rb")) == NULL) { MessageBox("Unable to open file"); return false; } if(!checkString(config.wave.file,"RIFF")) { MessageBox("Input not a MS-RIFF file"); return false; } filesize = Read32BitsLowHigh(config.wave.file); // complete wave chunk size if(!checkString(config.wave.file,"WAVE")) { MessageBox("Input not WAVE audio"); return false; } /* WAVE FMT format chunk */ if(!checkString(config.wave.file,"fmt ")) { MessageBox("Can't find format chunk"); return false; } /* my total header size calculations don't work, so this is bogus */ header_size = Read32BitsLowHigh(config.wave.file); /* chunk size */ wFormatTag = Read16BitsLowHigh(config.wave.file); if(wFormatTag!=0x0001) { MessageBox("Unknown WAVE format"); return false; } config.wave.type = WAVE_RIFF_PCM; config.wave.channels = Read16BitsLowHigh(config.wave.file); SVTH: Đỗ Văn Tuấn Trang 74
  75. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình config.wave.samplerate = Read32BitsLowHigh(config.wave.file); dAvgBytesPerSec = Read32BitsLowHigh(config.wave.file); wBlockAlign = Read16BitsLowHigh(config.wave.file); /* PCM specific */ if(config.wave.channels>2) { MessageBox("More than 2 channels\n"); return false; } if(config.wave.channels>1) { m_stereo_in = 0; m_stereo_out = 0; config.mpeg.mode = MODE_STEREO; MessageBox("WAVE audio, mode stereo"); } else { m_stereo_in = 1; m_stereo_out = 1; config.mpeg.mode = MODE_MONO; MessageBox("Microsoft RIFF , WAVE audio, mode mono"); } switch (config.wave.samplerate) { case 32000: m_samplerates_in = "32000"; m_samplerates_out = "32000"; config.mpeg.samplerate_index = 2; break; case 44100: m_samplerates_in = "44100"; m_samplerates_out = "44100"; config.mpeg.samplerate_index = 0; break; case 48000: m_samplerates_in = "48000"; m_samplerates_out = "48000"; config.mpeg.samplerate_index = 1; break; default: MessageBox("Samplerate not supported !!"); exit(-1); } config.wave.bits = Read16BitsLowHigh(config.wave.file); if(config.wave.bits!=16) { MessageBox("NOT 16 Bit !!!"); return false; } if(!checkString(config.wave.file,"data")) { MessageBox("Can't find data chunk"); return false; } header_size = ftell(config.wave.file); fseek(config.wave.file, 0, SEEK_END); SVTH: Đỗ Văn Tuấn Trang 75
  76. Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình filesize = ftell(config.wave.file); fseek(config.wave.file, header_size, SEEK_SET); config.wave.total_samples =(filesize-header_size)/(2*config.wave.channels); config.wave.length = config.wave.total_samples/config.wave.samplerate; return true; } 7. L3_compress( ) : Đây là hàm quan trọng nhất trong chương trình, nĩ mơ tả tồn bộ giải thuật của ứng dụng. Vịng lặp nén cũng nằm trong hàm này. Mỗi vịng lặp thực hiện cơng việc nén cho một frame dữ liệu đọc từ file nguồn. Cũng từ vịng lặp này, ta cho thanh tiến trình hoạt động nhờ vào kích thước biết trước của file đọc vào. Vịng lặp kết thúc cũng là lúc thanh tiến trình được điền đầy và thơng báo “Compress complete !” xuất hiện. void CMp3Dlg::L3_compress() { int frames_processed; int m_step; int total_frames; static short buffer[2][1152]; int channel; int i; int gr; short sam[2][1344]; double snr32[32]; L3_psy_ratio_t ratio; double pe[2][2]; L3_side_info_t side_info; short *buffer_window[2]; double win_que[2][HAN_SIZE]; double l3_sb_sample[2][3][18][SBLIMIT]; double mdct_freq[2][2][576]; int l3_enc[2][2][576]; L3_scalefac_t scalefactor; bitstream_t bs; double vg_slots_per_frame; ouble rac_slots_per_frame; ong hole_slots_per_frame; ouble lot_lag; nt mean_bits; unsigned long sent_bits = 0; unsigned long frame_bits = 0; int sideinfo_len; // Mở thiết bị để ghi vào open_bit_stream_w(&bs, config.outfile, BUFFER_SIZE); memset((char*)snr32,0,sizeof(snr32)); memset((char *)sam,0,sizeof(sam)); SVTH: Đỗ Văn Tuấn Trang 76