luận văn 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++

79 670 2
luận văn 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++

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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ã hoá nén âm theo chuẩn Mpeg, từ dựa số source code (viết C) viết lại ngôn ngữ Visual C++ SVTH: Đỗ Văn Tuấn Trang Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Mục lục Lời nói đầu PHẦN I LÝ THUYẾT CHƯƠNG 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 mơi trường đàn hồi 1.2 Các đặc trưng sóng 1.3 Phương trình sóng II SĨNG ÂM VÀ ĐẶC TÍNH ÂM THANH 2.1 Dao động âm truyền dao động 2.2 Đơn vị vật lý âm 2.3 Đặc tính sinh lý cảm thụ âm 12 CHƯƠNG 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 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 Giới thiệu 25 Đáp ứng xung hệ TTBB 25 Tính chất tổng chập hệ TTBB 26 Hệ nhân 27 Tính ổn định 27 Phương trình sai phân tuyến tính hệ số 28 Biểu diễn hệ rời rạc miền tần số 28 Định lý lấy mẫu Shannon 30 II PHÉP BIẾN ĐỔI FOURIER RỜI RẠC 30 Chuỗi Fourier rời rạc tín hiệu rời rạc tuần hoàn 30 Biến đổi Fourier rời rạc tín hiệu có độ dài hữu hạn 31 Phép biến đổi nhanh Fourier (FFT) 32 CHƯƠNG GIỚI THIỆU VỀ MPEG 33 I GIỚI THIỆU 33 MPEG gì? 33 So sánh chuẩn MPEG 33 Am MPEG 34 Các khái niệm 35 Hoạt động 38 II CÁC KHÁI NIỆM TRONG ÂM THANH MPEG 40 Lược đồ mã hóa Perceptual Sub-band 40 Giải thích hiệu qủa che (masking efficiency) 41 Các lớp âm MPEG 43 III CÁC THÔNG SỐ 45 CHƯƠNG 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 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 Mã hóa Huffman 51 Mã hóa Huffman sửa đổi 53 Mã hóa số học 54 Giải thuật Lempel-Ziv-Welch (LZW) 55 III CÁC GIẢI THUẬT NÉN CÓ TỔN THẤT 57 Các phương pháp nén âm đơn giản 57 Nén âm dùng mơ hình âm tâm lý 57 Nén âm theo chuẩn MPEG 58 PHẦN II THIẾT KẾ CHƯƠNG TRÌNH 60 CHƯƠNG 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 Các cấu trúc file 62 2.Các cấu trúc dịng bít liệu 63 3.Các cấu trúc để định dạng dịng bít 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 truy xuất liệu 68 2.Các định nghĩa dùng tính tốn FFT 68 3.Các định nghĩa dùng định dạng dòng liệu 68 4.Các định nghĩa dùng mã hoá Huffman 68 5.Các định nghĩa dùng phân tích liệu 69 6.Các định nghĩa dùng mơ hình âm tâm lý 69 7.Các định nghĩa dùng truy xuất nhập liệu 69 8.Các định nghĩa dùng cấu trúc file Wave 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 Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Lời nói đầu Cơng nghệ thơng tin ngành cơng nghiệp mũi nhọn giới nói chung việt nam nói riêng, phát triển mạnh mẽ không ngừng năm gần Khi đời sống nâng lên khoa học kỹ thuật phát triển nhu cầu giải trí đa dạng lên, loại hình giải trí khơng ngừng gia tăng ngày phong phú, đa dạng loại hình giải trí như: trò chơi điện tử, nghe nhạc xem phim, xem ca nhạc(video), đặc biệt chơi dạng không gian ba chiều Sự phát triển ạt dẫn tới ngành công nghệ phần cứng đáp ứng đòi hỏi lưu trữ, đồng hành với phát triển mạng máy tính Internet ngày phát triển số lượng người tham gia truy cập ngày lớn nhu cầu họ ngày phong phú đa dạng tất loại hình nói Do tốc độ truy cập, tốc độ truyền tải mạng quan tâm người dùng sốt ruột ngồi chờ trang web mà truy cập, họ khơng phải bực download file âm hát mà họ ưa thích đường truyền q chậm cơng nghệ phần cứng phát triển mạnh Chính nhà nghiên cứu phần mềm ý đến việc phát triển phần mềm để hỗ trợ phần cứng Họ tạo chương trình phần mềm hỗ trợ tích cực phần cứng, từ đời phần mềm nén âm thanh, hình ảnh, nén video, tách âm từ file video…để tạo dạng âm thanh, hình ảnh, video mindi, mpeg, mp3, mp4… file ảnh dạng gif, jpeg…với dung lượng lưu trữ vơ nhỏ chất lượng có giảm đôi chút không đáng kể so với đạt để truyền tải, truy cập nhanh Sự tồn chuẩn JPEG (Joint Photographic Experts Group) để giảm tốc độ bit chủ yếu phục vụ cho hình ảnh, rõ ràng khơng đủ đáp ứng cho hình ảnh động có kèm âm Để đáp ứng nhu cầu thị trường, nhóm chuyên gia hình ảnh động (Moving Picture Experts Group), gọi tắt MPEG, thành lập để nghiên cứu đưa lược đồ mã hóa phù hợp cho việc truyền hình ảnh động ghi lại chúng theo tiêu chuẩn thiết bị lưu trữ số CD-ROM, Video CD Phần trình bày luận văn nằm khn khổ "Am thanh" Do vấn đề liên quan tới hình ảnh khơng đề cập tới, dù chuẩn MPEG dùng cho âm hình ảnh Mục tiêu đề tài chủ yếu để tìm hiểu phương pháp mã hoá nén âm theo chuẩn Mpeg, từ dựa số source code (viết C) có mạng Internet viết lại ngơn ngữ Visual C++, nhằm hiểu sâu giải thuật, đồng thời tạo giao diện thân thiện Do trình độ kiến thức có hạn nên khơng tránh khỏi thiếu sót, em kính mong thầy tham gia giúp đỡ em để em hoàn thành tốt SVTH: Đỗ Văn Tuấn Trang 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 giúp em hoàn thành báo cáo PHẦN I LÝ THUYẾT CƠ BẢN SVTH: Đỗ Văn Tuấn Trang Khoa CNTT – ĐHBKHN CHUƠNG GVHD thầy: Dư Thanh Bình 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 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 mơi trường đàn hồi Mơi trường đàn hồi coi môi trường liên tục gồm phân tử liên kết chặt chẽ với nhau, lúc bình thường phân tử có vị trí cân bền b Sự hình thành sóng mơi trường đàn hồi: Do tính chất mơi trường đàn hồi, tác dụng lên phân tử mơi trường phân tử rời khỏi vị trí cân bền Do tương tác, phân tử lân cận mặt kéo phân tử A vị trí cân bằng, mặt khác nhận phần lượng phân tử A truyền sang, dao động theo, tượng xảy liên tiếp tạo thành sóng Sóng đàn hồi (sóng cơ) lan truyền dao động mơi trường đàn hồi Sóng khơng thể truyền chân khơng, chân khơng khơng phải môi trường đàn hồi Cần lưu ý truyền dao động, phân tử môi trường không di chuyển theo dao động lan truyền mà dao động quanh vị trí cân c Một số khái niệm sóng: Nguồn sóng: ngoại vật gây kích động sóng Tia sóng: phương truyền sóng Mơi trường sóng: khơng gian mà sóng truyền qua Mặt sóng: mặt chứa điểm (phân tử) có trạng thái dao động thời điểm Tia sóng ln vng góc với mặt sóng Sóng cầu: mặt sóng mặt cầu phân bố khơng gian, tâm nguồn sóng Trong mơi trường đồng chất đẳng hướng có sóng cầu Đối với sóng cầu tia sóng trùng với bán kính mặt cầu Sóng phẳng: mặt sóng mặt phẳng song song nhau, tia sóng vng góc với mặt sóng Nếu nguồn sóng xa mơi trường xét mặt sóng coi mặt phẳng song song SVTH: Đỗ Văn Tuấn Trang Khoa CNTT – ĐHBKHN GVHD thầy: Dư Thanh Bình Sóng dọc: sóng phân tử mơi trường dao động quanh vị trí cân phương trùng với tia sóng Khi có sóng dọc, phương tia sóng phân tử mơi trường bị nén chặt, giãn làm cho phân tử mơi trường có chỗ dày chỗ thưa Sóng ngang: sóng phân tử mơi trường dao động quanh vị trí cân phương vng góc với tia sóng d Ngun nhân gây sóng ngang sóng dọc: Tùy tính chất mơi trường đàn hồi mà xuất sóng ngang hay sóng dọc - Khi lớp môi trường bị lệch lớp khác làm xuất lực đàn hồi có xu hướng kéo lớp bị lệch vị trí cân mơi trường truyền sóng ngang Vậy vật rắn mơi trường có tính chất - Nếu mơi trường khơng có lực đàn hồi lớp song song bị lệch sóng ngang khơng thể hình thành Chất lỏng chất khí mơi trường - Khi bị biến dạng nén hay căng mà mơi trường có lực đàn hồi xuất mơi trường truyền sóng dọc Chẳng hạn bị nén, chất lỏng hay chất khí tăng áp suất, lực nén giữ vai trị lực đàn hồi Như chất lỏng chất khí có sóng dọc truyền được, cịn chất rắn truyền hai loại sóng 1.2 Các đặc trưng sóng a Vận tốc truyền sóng (C) : Là quãng đường mà sóng truyền đơn vị thời gian b Bước sóng : Là quãng đường mà sóng truyền sau thời gian chu kỳ T Như  khoảng cách bé phân tử dao động pha Theo định nghĩa ta có :  = CT c Chu kỳ tần số: Chu kỳ T thời gian cần thiết để sóng truyền bước sóng  Tần số f số chu giây : SVTH: Đỗ Văn Tuấn Trang 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 phương trình sóng biểu thị mối quan hệ độ chuyển dời X phân tử dao động kể từ vị trí cân với thời gian t khoảng cách y đến vị trí cân phân tử dao động phương truyền sóng 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 : X = asin(t + y/c) Đối với sóng cầu biên độ a dao động sóng vị trí cách nguồn bán kính r, tỉ lệ nghịch với r, phương trình sóng có dạng: X = a/r sin(t – r/c) II SÓNG ÂM 2.1 Dao động âm truyền dao động  Sóng âm loại sóng có biên độ dao động nhỏ mà thính giác nhận biết Thí dụ dao động phát từ dây đàn, mặt trống rung động Sóng âm loại sóng nên khái niệm tượng dao động sóng áp dụng cho sóng âm Trong khơng khí chất khí khác, dao động truyền dạng sóng dọc, đến tai người dao động có tần số từ 16 đến 20000 Hz gây cảm giác đặc biệt âm Các dao động đàn hồi có tần số f>20.000 Hz sóng siêu âm Các dao động đàn hồi có tần số f Đ Update_stastus(frames_processed ++); L3_FlushBitstream( ); buffer_windows[0] = buffer[0]; buffer_windows[1] = buffer[1]; close_bit_stream_w( ); wave_close( ) ; Kết thúc S frac_slots_per_frame < > Đ slot_lag > (frac_slots_per_frame - 1) S Đ slot_lag -= frac_slots_per_frame; config.mpeg.padding = ; slot_lag -= frac_slots_per_frame; config.mpeg.padding = ; 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 ; SVTH: Đỗ Văn Tuấn Trang 65 Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình gr = ; channel = ; Đ L3_psycho_analise( ) ; channel ++ ; channel < config.wave.channels Đ S gr ++ ; gr < config.mpeg.mod_gr S gr = ; channel = ; Đ Đ Đ i=0; L3_window_subband( ); L3_filter_subband( ); i ++ ; i < 18 S channel ++ ; channel < config.wave.channels S gr ++ ; gr < config.mpeg.mod_gr SVTH: Đỗ Văn Tuấn S Trang 66 Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình L3_mdct_sub( ); L3_iteration_loop( ); L3_format_bitstream( ); frame_bits = sstell(&bs) - sent_bits ; (frame_bits) mod (config.mpeg.bits_per_slot) < > S Đ sent_bits += frame_bits; Báo lỗi SVTH: Đỗ Văn Tuấn Trang 67 Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình CHƯƠNG GIAO DIỆN VÀ THUYẾT MINH CHƯƠNG TRÌNH I Giới thiệu Giao diện 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 ln ưa chuộng Đó ưu điểm tuyệt vời Windows Lập trình Windows hỗ trợ công cụ cho phép ta tạo giao diện dễ dàng thân thiện Tuy nhiên, thiết kế giao diện sử dụng khơng bị nhầm lẫn khơng phải chuyện dễ dàng Nó địi hỏi ta phải có nhìn bao qt, chí phải hiểu sâu giải thuật chương trình loại trừ sai lầm sử dụng Lập trình Windows lập trình theo tình Mọi nút nhấn, ô đối thoại giao diện truy cập tới lúc mà khơng theo trình tự định Do người lập trình cần phải dự trù đến tình cần phải đưa số đề nghị dạ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 lúc II Giao diện Dựa sơ đồ khối lưu đồ giải thuật Giao diện bao gồm phần hình vẽ sau: 14 13 12 11 10 Input group Nhóm thơng tin cấu hình lệnh tập tin nguồn ( *.wav) Bao gồm thông tin : bitrates, samplerates, mode, File path name SVTH: Đỗ Văn Tuấn Trang 68 Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình Open button Mở hộp thoại File Open Windows để chọn file cần nén Phần mở rộng mặc định wav Text Edit box Dùng gõ file nguồn tay Mặc định *.wav Bitrates Cho biết số tốc độ bit tập tin nguồn wav chọn mục Chỉ số mặc định 128 Không sửa tay Samplerates Cho biết tần số lấy mẫu tập tin nguồn wav chọn mục Tần số mặc định 44100 Hz Không sửa tay Các tần số bao gồm : 32000, 44100 48000 Hz Output Nhóm thơng tin cấu hình lệnh tập tin đích ( *.mp3) Bao gồm thông tin : bitrates, samplerates, mode, File path name Save button Mở hộp thoại File Save Windows để ghi đường dẫn tên file nén Phần mở rộng mặc định mp3 Text Edit box Dùng gõ đường dẫn tên tập tin đích tay Mặc định *.mp3 Khi chọn tập tin nguồn phần ô tự động xuất đường dẫn tên tập tin đích Bitrates Định số tốc độ bit tập tin đích chọn mục Chỉ số mặc định 128 Có thể chọn số khác ô kéo xuống, bao gồm 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 tập tin đích, phụ thuộc với tần số lấy mẫu tập tin nguồn Tần số mặc định 44100 Hz Không sửa tay 11 Mode group SVTH: Đỗ Văn Tuấn Trang 69 Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình Nhóm chế độ Stereo hay Mono Mặc định Stereo 12 Progress bar Thanh tiến trình, xuất trình nén từ tập tin nguồn wav sang tập tin đích mp3 13 Compress button Nút nhấn sau chọn định cấu hình đầy đủ cho tập tin nguồn đích Nghĩa nhấn nút sau nhấn nút Update Khi nhấn nút này, trình nén từ tập tin nguồn sang tập tin đích thực bắt đầu Đồng thời tiến trình bắt đầu hoạt động Kết thúc q trình nén có thơng điệp báo cho biết hồn tất cơng việc 14 Update button Phím nhấn sau chọn tập tin nguồn đích để cập nhật thơng số chuẩn bị cho q trình nén kích hoạt phím Compress III Chương trình Chương trình có hộp thoại MP3 COMPRESSOR hiển thị phím nhấn cho người sử dụng lựa chọn chạy ứng dụng Do đó, tất hàm đặt lớp CMp3Dlg Sau ta lần lược khảo sát số hàm quan trọng OnInitDialog( ) : Hàm khởi tạo số giá trị mặc định cho hộp thoại, nhằm giúp cho người sử dụng có nhìn tồn cục hiểu ứng dụng, để từ chọn lựa thơng số thích hợp cho ứng dụng Đồng thời, cài đặt sẵn số giá trị ban đầu cho đối tượng 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 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 cho đố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 } OnFileOpen( ) : Hàm mở hộp thoại Open Windows để chọn file nguồn có phần mở rộng mặc định wav, gán cho biến m_file_in đường dẫn tên file chọn Đồng thời tạo đường dẫn tên file mặc định cho tập tin đích có phần mở rộng mp3 gán cho biến m_file_out void CMp3Dlg::OnFileOpen() { // Mở hộp thoại File Open Windows hàm thành viên dlgOpen // lớp CFileDialog thư viện MFC SVTH: Đỗ Văn Tuấn Trang 71 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); } } OnFileWrite( ) : Hàm mở hộp thoại Save Windows để chọn đường dẫn tên tập tin đích trường hợp khơng muốn đường dẫn tên file mặc định hàm OnFileOpen( ) tạo ra, gá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; } } OnUpdate( ) : Hàm cập nhật tất thông số chọn hộp thoại, đưa vào đối tượng dùng chương trình Đồng thời kích hoạt phím nhấn COMPRESS cho phép phím bắt đầu sử dụng Nếu thông số nhập không hợp lệ cho 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 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 trỏ // đế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 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ố // hoạt động if (bWaveOpen) GetDlgItem(IDC_COMPRESS)->EnableWindow(); UpdateData(FALSE); } OnCompress( ) : Khi gọi hàm này, trình nén từ tập tin nguồn wav sang tập tin đích mp3 bắt đầu thực Kết thúc q trình nén có hộp thoại xuất 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 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 tiến trình vị trí đầu GetDlgItem(IDC_COMPRESS)->EnableWindow(FALSE); } Wave_open( ) : Hàm mở file nguồn kiểm tra xem định dạng file có hợp lệ khơng, khơng thơng bào 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 Khoa CNTT – ĐHBKHN config.wave.samplerate dAvgBytesPerSec wBlockAlign GVHD Thầy:Dư Thanh Bình = Read32BitsLowHigh(config.wave.file); = Read32BitsLowHigh(config.wave.file); = Read16BitsLowHigh(config.wave.file); /* PCM specific */ if(config.wave.channels>2) { MessageBox("More than 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 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; } L3_compress( ) : Đây hàm quan trọng chương trình, mơ tả tồn giải thuật ứng dụng Vòng lặp nén nằm hàm Mỗi vịng lặp thực cơng việc nén cho frame liệu đọc từ file nguồn Cũng từ vịng lặp này, ta cho tiến trình hoạt động nhờ vào kích thước biết trước file đọc vào Vịng lặp kết thúc lúc tiến trình điền đầy thông báo “Compress complete !” xuất 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 Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình memset((char *)&side_info,0,sizeof(L3_side_info_t)); L3_psycho_initialise(); L3_subband_initialise(); L3_mdct_initialise(); L3_loop_initialise(); config.mpeg.mode_gr = 2; config.mpeg.samples_per_frame = 1152; config.mpeg.total_frames = config.wave.total_samples/config.mpeg.samples_per_frame; total_frames = config.mpeg.total_frames; config.mpeg.bits_per_slot = 8; frames_processed = 0; sideinfo_len = 32; if(config.wave.channels==1) sideinfo_len += 136; else sideinfo_len += 256; if(config.mpeg.crc) sideinfo_len += 16; /* Figure average number of 'slots' per frame */ 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; if(frac_slots_per_frame==0) config.mpeg.padding = 0; while(wave_get(buffer)) { frames_processed++; m_step = (int)(10000 * frames_processed / total_frames); m_pbar.SetPos(m_step); buffer_window[0] = buffer[0]; buffer_window[1] = buffer[1]; if(frac_slots_per_frame!=0) if(slot_lag>(frac_slots_per_frame-1.0)) { /* No padding for this frame */ slot_lag -= frac_slots_per_frame; config.mpeg.padding = 0; } else { /* Padding for this frame */ slot_lag += (1-frac_slots_per_frame); config.mpeg.padding = 1; } config.mpeg.bits_per_frame = 8*(whole_slots_per_frame + config.mpeg.padding); SVTH: Đỗ Văn Tuấn Trang 77 Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình mean_bits = (config.mpeg.bits_per_frame - sideinfo_len) / config.mpeg.mode_gr; /* psychoacousic model */ for(gr=0;gr

Ngày đăng: 27/03/2014, 21:25

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan