Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 70 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
70
Dung lượng
651,94 KB
Nội dung
Khoa CNTT – ĐHBKHN LÝ THUYẾT CƠ BẢN CHUƠ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 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 SVTH: Đỗ Văn Tuấn Trang LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN • 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 • 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 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 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 λ SVTH: Đỗ Văn Tuấn Trang LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN • 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 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 • Vì qng tần số âm qui định độ cao âm nên cịn gọi qng độ 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 SVTH: Đỗ Văn Tuấn Trang LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN • Mức to, độ to âm sức mạnh cảm giác âm gây nên tai người, khơng 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: - Để 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 đố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 Aâ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ố chúng quanh SVTH: Đỗ Văn Tuấn Trang LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN âm Âm sắc có quan hệ mật thiết với cường độ, âm điệu thời gian âm vang, trưởng thành tắt dần trường âm • Khi hai ca sĩ hát câu độ cao, ta phân biệt giọng hát người Khi đàn ghi-ta, sáo, kèn tấu lên đoạn nhạc độ cao, ta phân biệt tiếng nhạc cụ Mỗi người, nhạc cụ phát âm có sắc thái khác mà tai ta phân biệt Đặc tính âm âm sắc • Âm sắc đặc tính sinh lý âm, hình thành sở đặc tính vật lý âm tần số biên độ Thực nghiệm chứng tỏ nhạc cụ phát âm có tần số f1 đồng thời phát âm có tần số f2=2f1, f3=3f1 • Âm có tần số f1 gọi âm hay họa âm thứ nhất, âm có tần số f2 , f3 gọi họa âm thứ hai, thứ ba Âm mạnh nhất, họa âm có tác dụng định âm sắc âm bản, giúp ta phân biệt nguồn âm khác Chẳng hạn tiếng đàn Pi-a-nô tiếng sáo âm lại dễ phân biệt, nguyên nhân số lượng, cấu trúc họa âm quanh âm chúng khác Họa âm nhiều âm nghe du dương phong phú Thính giác định vị (hiệu ứng Stereo): • Khi nghe âm mắt khơng nhìn thấy nguồn âm xác định xác vị trí nguồn âm Đặc điểm kết qủa hai tác dụng: - Do cường độ, độ to, âm sắc âm đến hai tai không giống - Do âm đến hai tai lệch pha nhau, thời gian đến hai tai khơng giống • Cường độ, độ to âm đến hai tai chênh lệch nhiễu xạ gây Âm có tần số f < 1000 Hz chênh lệch cường độ nhiễu xạ gây bé tần số cao, chênh lệch đạt tới 20 - 30 db • Do khả định vị tai nghe âm tập trung ý vào nguồn âm cần nghe, bỏ qua cách tự nhiên âm không cần nghe Nhờ hiệu qủa mà tiếng ồn bị phủ lấp giảm nhỏ cách tự nhiên Nếu nghe âm tai hiệu qủa Nghe âm chênh lệch thời gian: • Tương tự tác dụng lưu ảnh mắt, tai người 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, hai âm đến tai người cách < 50 ms tai người không phân biệt được, nghe âm SVTH: Đỗ Văn Tuấn Trang LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN CHƯƠNG TẬP TIN DẠNG SÓNG (WAVE FILE) I MULTIMEDIA WINDOWS • Từ phiên Windows 3.1, Multimedia trở thành tính Windows Multimedia Windows bổ sung tính mới: độc lập thiết bị việc xử lý âm Sự độc lập thiết bị thể qua API (Applycation Program Interface – Bộ giao diện lập trình ứng dụng) Bộ API độc lập thiết bị phần cứng chức quan trọng Windows Người lập trình lập trình điều khiển phần cứng Windows dựa chức phần cứng chi tiết cụ thể Các nhà cung cấp phần cứng cần cung cấp điều khiển thiết bị (device driver) cho Windows, nhờ ứng dụng Windows điều khiển phần cứng thơng qua Windows API • Với Multimedia Windows, hãng Microsoft thực ba điều : • Định nghĩa tiêu chuẩn phần cứng tối thiểu cho loại máy Multimedia PC (viết tắt MPC) Tiêu chuẩn dựa chức tổng quát sản phẩm cụ thể Ví dụ PC có thêm ổ đĩa CD-ROM card âm trở thành MPC cấp • Microsoft cung cấp phần mềm Multimedia Extension cho Windows 3.0 ghép vào hệ điều hành Windows từ phiên 3.1 Phần mềm bao gồm điều khiển thiết bị dành cho việc truy xuất đến phần cứng gắn thêm vào MPC • Microsoft đưa cơng cụ phát triển Multimedia Development Kit (MDK) Lập trình viên kết hợp cơng cụ với Windows Software Development Kit (SDK) để viết ứng dụng Multimedia • Có hai dạng xử lý âm số hóa Windows Loại thứ microsoft gọi “Wave Form Audio” (Aâm dạng sóng), dựa nguyên tắc số hóa sóng âm, MPC lưu chúng nhớ hay tập tin WAV đĩa Các liệu số thơng qua phần cứng biến đổi lại thành âm • Dạng thứ hai MIDI Khác với âm dạng sóng, MIDI lưu lại thông điệp điều khiển tổng hợp phát âm Do kích thước tập tin MID nhỏ nhiều so với tập tin.WAV II CẤU TRÚC WAVE FILE RIFF file Wave File tập tin chứa liệu mẫu âm số hóa Phương pháp số hóa âm phương pháp PCM Phương pháp lấy mẫu âm với tần số khoảng 11.025 kHz 44.1 kHz Mỗi lần lấy mẫu, số liệu lại lượng tử hóa hay hai byte cho mẫu âm Như tần số lấy mẫu SVTH: Đỗ Văn Tuấn Trang LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN cao, số byte dùng lượng tử hóa nhiều âm phát lại trung thực, lại tăng số byte cần lưu trữ Với mẫu âm phát phút cần phải lưu trữ 660 kB Đó lý File Wave ln có kích thước lớn so với MIDI File Cấu trúc Wave File thuộc vào lớp file sử dụng hàm Multimedia Windows: RIFF FILE RIFF chũ viết tắt Resource Interchange File Format (dạng file trao đổi tài nguyên) Một RIFF file gồm nhiều loại chunks, chunk lại chứa trỏ đến chunk Mỗi chunk bao gồm loại chunk liệu theo sau loại chunk Một ứng dụng muốn đọc RIFF file qua chunk, đọc liệu chunk quan tâm bỏ qua chunk mà không quan tâm, chunk RIFF file bắt đầu header có cấu trúc sau: Typedef struct { FOURCC ckid; DWORD ckSize; } CK; Trường FOURCC có bytes loại chunk Đối với File Wave, trường có giá trị “WAVE” Nếu loại chunk ký tự ký tự lại bên phải đệm thêm vào khoảng trắng Cần ý ký tự FOURCC có phân biệt chữ hoa chữ thường Trường DWORD chứa kích thước vùng liệu chunk, vùng liệu nằm sau header có kích thước ckSize bytes Chunk chứa subchunks Subchunk chunk Một RIFF file bắt đầu chunk loại “RIFF” Cấu trúc Wave file Wave file bắt đầu chunk loại “RIFF” Hai subchunk wave chunk đặc tả thông tin âm wave file tiếp liệu subchunk Đó subchunk “fmt” subchunk “data” a subchunk “fmt”: Dữ liệu “fmt” chunk đối tượng WAVEFORMAT có cấu trúc sau: Typedef struct waveformat_tag { WORD wFormatTag; WORD nChannels; SVTH: Đỗ Văn Tuấn 10 Trang LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 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 ; = - frac_slots_per_frame ; slot_lag frac_slots_per_frame = S Đ config.mpeg.padding = S wave_get(buffer) < > Đ Update_stastus(frames_processed ++); L3_FlushBitstream( ); buffer_windows[0] = buffer[0]; buffer_windows[1] = buffer[1]; close_bit_stream_w( ); wave_close( ) ; SVTH: Đỗ Văn Tuấn frac_slots_per_frame < > S Kết thúc Trang 56 Đ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN SVTH: Đỗ Văn Tuấn GVHD Thầy:Dư Thanh Bình Trang 57 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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 L3_mdct_sub( ); gr ++ ; L3_iteration_loop( ); S gr < config.mpeg.mod_gr L3_format_bitstream( ); S frame_bits = sstell(&bs) - sent_bits ; SVTH: Đỗ Văn Tuấn Trang 58 S LUAN VAN CHAT(frame_bits) LUONG download : add mod (config.mpeg.bits_per_slot) < > 0luanvanchat@agmail.com 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 Open button SVTH: Đỗ Văn Tuấn Trang 59 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 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 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 SVTH: Đỗ Văn Tuấn Trang 60 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 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 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"; 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); SVTH: Đỗ Văn Tuấn Trang 61 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 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 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( ) : SVTH: Đỗ Văn Tuấn Trang 62 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 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; 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; SVTH: Đỗ Văn Tuấn Trang 63 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 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 // 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) { SVTH: Đỗ Văn Tuấn Trang 64 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 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; 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"); } SVTH: Đỗ Văn Tuấn Trang 65 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 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); 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; SVTH: Đỗ Văn Tuấn Trang 66 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình 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)); 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)) * SVTH: Đỗ Văn Tuấn Trang 67 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Khoa CNTT – ĐHBKHN GVHD Thầy:Dư Thanh Bình ((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); mean_bits = (config.mpeg.bits_per_frame - sideinfo_len) / config.mpeg.mode_gr; /* psychoacousic model */ for(gr=0;gr