Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 103 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
103
Dung lượng
1,11 MB
Nội dung
Phương pháp mã hoá nén âm theo chuẩn Mpeg 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ổ "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 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 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 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 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 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 : 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ố fEnableWindow(); 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); } 89 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; 90 } /* 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) { 91 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; 92 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( ) : 93 Đâ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; 94 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; 95 if(config.wave.channels==1) else sideinfo_len += 136; 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 */ 96 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