1. Trang chủ
  2. » Luận Văn - Báo Cáo

Nén file âm thanh theo chuẩn MPEG

85 702 0

Đ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

Nội dung

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.

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ọ bực download file âm hát mà họ ưa thích đường truyền 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 khuôn khổ "m 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 Trang PHẦN I LÝ THUYẾT CƠ BẢN CHNG 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 truyền chân không, chân không 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 Trang • 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 vuông 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 vuông 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 • 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 vuông góc với tia sóng d Nguyên 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 lực đàn hồi lớp song song bị lệch sóng ngang 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 Trang • Như chất lỏng chất khí có sóng dọc truyền được, 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 : 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 Trang 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 f1) f2 / f1 = 2x Khi x=1 tức f2 / f1 = gọi quãng tần số (hay ốc-ta) Khi x=1/2 tức f2 / f1 = 1.41 gọi nửa ốc-ta Khi x=1/3 tức f2 / f1 = 1.26 gọi 1/3 ốc-ta - Mức áp suất âm ốc-ta mức áp suất âm 1/2 ốc-ta cộng thêm 3db - Mức áp suất âm ốc-ta mức áp suất âm 1/3 ốc-ta cộng thêm 5db Trang • Vì quãng tần số âm qui định độ cao âm nên gọi quãng độ cao Theo tập quán âm nhạc quãng độ cao gọi quãng (bát độ) • Chẳng hạn âm LA, tần số f=440 Hz tăng bát độ tăng gấp đôi tần số, tức 880 Hz • Trong thực tế thường gặp âm phức tạp bao gồm nhiều tần số Tập hợp tất tần số cấu tạo âm gọi “tần phổ” âm đó, tần phổ gián đoạn hay liên tục Một âm có tần phổ liên tục đặc trưng “Mức tần phổ B” với định nghóa: - Mức tần phổ mức áp suất âm chiều rộng dải tần số - Một âm có mức tần phổ B không đổi với tần số gọi tiếng ồn trắng - Một âm có tần phổ gián đoạn đặc trưng “mức dải tần số” với định nghóa: mức dải tần số mức áp suất âm chiều rộng dải tần số lớn Hz 2.3 Đặc tính sinh lý cảm thụ âm 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 vừa mang tính chất chủ quan vừa mang tính chất khách quan đại lượng xác định từ đại lượng túy vật lý Vấn đề có ý nghóa to lớn thực tế cần biết sức mạnh âm đo tai người • Mức to, độ to âm sức mạnh cảm giác âm gây nên tai người, phụ thuộc vào áp suất âm mà phụ thuộc vào tần số âm Thí dụ âm có tần số 100 Hz 1000 Hz áp suất âm 0,02 µbar nghe to nhỏ khác nhau, âm 1000 Hz nghe to âm 100 Hz Muốn nghe to âm 1000 Hz âm 100 Hz phải có áp suất 0,25 µbar Như tai người không nhạy âm 100 Hz âm 1000 Hz Tần số thấp tai người nhạy a Mức to: Trang - Để biểu thị mức to cảm giác chủ quan, ta dùng đại lượng “mức to”, đơn vị “Fôn” với định nghóa sau : Fôn mức to âm chuẩn, giá trị mức áp suất âm âm chuẩn tức : L = 20lg P/Po (Fôn) - Vậy mức to âm đo Fôn, giá trị mức áp suất âm âm chuẩn đo db có mức to với âm Thí dụ: âm có tần số 500 Hz mức áp suất âm 25 db âm có tần số 50 Hz mức áp suất âm 64 db có mức to 20 Fôn, mức to âm 1000 Hz mức áp suất 20 db - Muốn biết mức to âm phải so sánh với âm chuẩn - Đối với âm chuẩn, mức to ngưỡng nghe Fôn, ngưỡng chói tai 120 Fôn - Cùng giá trị áp suất, âm tần số cao, mức to lớn b Độ to: - Khi so sánh âm to âm lần, dùng khái niệm “độ to” đơn vị “Sôn” với định nghóa sau: Số lượng Sôn biểu thị số lần mạnh âm so với âm chuẩn mà tai người phân biệt - Độ to thuộc tính thính giác, cho phép phán đoán tính chất mạnh yếu âm Căn vào độ to mà xếp âm từ nhỏ tới to - Mức to tăng 10 Fôn độ to tăng gấp đôi ngược lại 2.3.2 m điệu âm sắc: • Âm điệu âm cao hay thấp, trầm hay bổng Âm điệu chủ yếu phụ thuộc vào tần số âm, tần số cao, âm nghe cao, tần số thấp âm nghe trầm • Âm sắc sắc thái âm du dương hay thô kệch, hay rè, hay đục Âm sắc phụ thuộc vào cấu tạo sóng âm điều hòa, biểu thị số lượng loại tần số, cường độ phân bố Trang 10 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 S Trang 71 L3_mdct_sub( ); L3_iteration_loop( ); L3_format_bitstream( ); frame_bits = sstell(&bs) sent_bits ; (frame_bits) mod (config.mpeg.bits_per_slot) < > Ñ sent_bits += frame_bits; Trang 72 S Báo lỗi CHƯƠNG GIAO DIỆN VÀ THUYẾT MINH CHƯƠNG TRÌNH I Giới thieäu Giao dieä 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 ưa chuộng Đó ưu điểm tuyệt vời cuûa Windows Lập trình Windows hỗ trợ công cụ cho phép ta tạo giao diện rấ t dễ dàng thân thiện Tuy nhiên, thiết kế giao diện có thể sử dụng không bị nhầm lẫn chuyện dễ dàng Nó ñoøi hoûi ta phải có nhìn bao quát, 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 treân 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 Ngoài ra, giao diện cần có phần trợ giúp để hướng daãn cho người sử dụng lúc II Giao dieän Dựa trê n sơ đồ khối lưu đồ giải thuật Giao diện bao gồm phần hình vẽ sau: ; Trang 73 14 13 12 11 10 Input group Nhoù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 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 Trang 74 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 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 Trang 75 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 trình nén có thông điệp báo cho biết hoà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 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 toà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"; 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"); Trang 76 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() { Trang 77 // Mở hộp thoại File Open Windows hàm thành viên dlgOpen // lớp CFileDialog thư viện MFC CFileDialog dlgOpen(TRUE, "wav", "*.wav"); if (dlgOpen.DoModal() == IDOK) { m_file_in = dlgOpen.GetPathName(); // gaù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; // gaùn đường dẫn file đích // cho đối tượng m_file_out bOpen = TRUE; UpdateData(FALSE); } } OnFileWrite( ) : Haø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 Trang 78 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; len = str1.GetLength(); str2 = str1.Left(len - 3); str2 += "mp3"; m_file_out = str2; } config.infile = m_file_in.GetBuffer(5); // Chuyeå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; Trang 79 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 trình nén có hộp thoại xuất thông báo hoà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 // công việc nén hoà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 khaù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) { Trang 80 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); 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 channels\n"); return false; } if(config.wave.channels>1) { m_stereo_in = 0; m_stereo_out = 0; Trang 81 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); filesize = ftell(config.wave.file); fseek(config.wave.file, header_size, SEEK_SET); Trang 82 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ả toà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; Trang 83 unsigned long frame_bits = 0; int sideinfo_len; // Mở thiết bị để ghi vaøo open_bit_stream_w(&bs, config.outfile, BUFFER_SIZE); memset((char*)snr32,0,sizeof(snr32)); memset((char *)sam,0,sizeof(sam)); 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 config.mpeg.samples_per_frame config.mpeg.total_frames = 2; = 1152; = 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); Trang 84 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); mean_bits = (config.mpeg.bits_per_frame - sideinfo_len) / config.mpeg.mode_gr; /* psychoacousic model */ for(gr=0;gr

Ngày đăng: 05/12/2016, 13:29

HÌNH ẢNH LIÊN QUAN

Hình 4.6     5. Hoạt động: - Nén file âm thanh theo chuẩn MPEG
Hình 4.6 5. Hoạt động: (Trang 36)
Hình 4.8 Sau đây là chi tiết về các lớp. - Nén file âm thanh theo chuẩn MPEG
Hình 4.8 Sau đây là chi tiết về các lớp (Trang 41)
Hình 5.4 Vớ duù: - Nén file âm thanh theo chuẩn MPEG
Hình 5.4 Vớ duù: (Trang 56)

TỪ KHÓA LIÊN QUAN

w