Chuẩn nén âm thanh và biến đổi file đuôi Wave sang file đuôi MP3

Mục lục 1 Lời nói đầu. 4 Thuật ngữ. 5 PHẦN I . LÝ THUYẾT. 7 Mở đầu. 8 CHƯƠNG 1. Các kiến thức cơ bản về âm thanh . 9 I.1 Những khái niệm cơ bản - sóng cơ. 9 1. Sự hình thành sóng trong môi trường đàn hồi. 9 2. Các đặc trưng của sóng. 10 3. Phương trình sóng. 11 I.2 Sóng âm và đặc tính âm thanh. 11 I.2.1. Dao động âm và sự truyền dao động. 11 I.2.2. Đơn vị vật lý của âm thanh. 12 I.2.3. Đặc tính sinh lý về sự cảm thụ âm. 15 CHƯƠNG 2. WAVE file. 19 II.1 Multimedia Windows. 19 II.2 Cấu trúc Wave File. 20 II.2.1 RIFF file. 20 II.2.2 Cấu trúc Wave File. 21 II.3 Đọc RIFF files 24 CHƯƠNG 3. Lý thuyết xử lý tín hiệu số 28 III. 1 Tín hiệu và hệ thống rời rạc 28 1. Giới thiệu 28 2. Đáp ứng xung trong hệ TTBB 28 3. Tính chất của tổng chập của hệ TTBB 29 4. Hệ nhân quả 30 5. Tính ổn định 30 6. Phương trình sai phân tuyến tính hệ số hằng 31 7. Biểu diễn các hệ rời rạc trong miền tần số 31 8. Định lý lấy mẫu Shannon 33 III.2 Phép biến đổi Fourier rời rạc 33 1. Chuỗi Fourier rời rạc của tín hiệu rời rạc tuần hoàn 33 2. Biến đổi Fourier rời rạc của tín hiệu có độ dài hữu hạn 34 3. Phép biến đổi nhanh Fourier (FFT) 34 CHƯƠNG 4. Giới thiệu về MPEG. 36 IV.1 Giới thiệu. 36 1. MPEG là gì? 36 2. So sánh các chuẩn MPEG 36 3. Am thanh MPEG. 37 4. Các khái niệm cơ bản 38 IV.2 Các khái niệm trong âm thanh MPEG 42 1. Lược đồ mã hóa Perceptual Sub-band. 42 2. Giải thích hiệu qủa che (masking efficiency) 43 3. Các lớp của âm thanh MPEG 45 IV.3 Các thông số. 47 CHƯƠNG 5. Các giải thuật nén âm thanh 51 V.1 Lý thuyết thông tin 51 V.2 Các giải thuật nén không có tổn thất 52 1. Mã hóa Huffman 52 2. Mã hóa Huffman sửa đổi 53 3. Mã hóa số học 55 4. Giải thuật Lempel-Ziv-Welch (LZW) 57 V.3 Các giải thuật nén có tổn thất 59 1. Các phương pháp nén âm thanh đơn giản 59 2. Nén âm thanh dùng mô hình âm tâm lý 59 3. Nén âm thanh theo chuẩn MPEG 60 PHẦN II. XÂY DỰNG PHẦN MỀM 63 CHƯƠNG 6. Lưu đồ giải thuật - cấu trúc dữ liệu. 64 6.1 Sơ đồ khối 64 6.2 Các cấu trúc dữ liệu và định nghĩa 65 6.3 Lưu đồ 74 6.4 Bản đồ hàm 78 CHƯƠNG 7. Giao diện và thuyết minh chương trình 82 7.1 Giới thiệu 82 7.2 Giao diện 82 7.3 Chương trình 86 PHẦN III. CHƯƠNG TRÌNH NGUỒN 96

pdf86 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2507 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Chuẩn nén âm thanh và biến đổi file đuôi Wave sang file đuôi MP3, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
o moät maãu maõ hoùa laø bao nhieâu. Thoâng thöôøng laø 16 bit. Lyù do ñeå choïn con soá 16 bit baét nguoàn töø tæ soá tín hieäu vaø nhieãu (s/n). Nhieãu noùi ôû ñaây sinh ra do quùa trình soá hoùa. Cöù moãi bit theâm vaøo, ta coù tæ soá s/n toát hôn 6dB (ñoái vôùi tai ngöôøi, 6 dB töông öùng vôùi möùc to gaáp ñoâi). Aâm thanh CD ñaït tôùi khoaûng 90 dB s/n. Möùc naøy phuø hôïp vôùi phaïm vi ñoäng cuûa tai ngöôøi coøn toát. Nghóa laø ta khoâng theå nghe ñöôïc baát kyø nhieãu naøo ñeán töø baûn thaân heä thoáng. Ñieàu gì xaûy ra neáu ta laáy maãu vôùi 8 bit? Ta seõ nghe thaáy raát nhieàu tieáng soâi trong baûn ghi. Deã daøng nghe thaáy nhieãu trong khoaûng nghæ cuûa baûn nhaïc hoaëc giöõa caùc töø neáu ta ghi aâm moät gioïng noùi. b. Hieäu quûa che. {PAGE } Gæa söû coù moät aâm maïnh vôùi taàn soá 1000Hz, vaø moät aâm keøm theo coù taàn soá 1100Hz nhöng vôùi cöôøng ñoä aâm nhoû hôn 18dB. Ta seõ khoâng theå nghe thaáy aâm naøy vì noù ñaõ bò che hoaøn toaøn bôûi aâm chuû 1000Hz. Noùi moät caùch khaùc, moät aâm thanh yeáu gaàn moät aâm thanh maïnh seõ bò che. Neáu coù moät aâm thanh khaùc taàn soá 2000Hz cuõng coù möùc to thaáp hôn aâm 1000Hz laø 18dB thì ta seõ nghe ñöôïc aâm naøy. Ñeå khoâng nghe ñöôïc aâm naøy ta phaûi giaûm möùc to cuûa aâm naøy xuoáng coøn thaáp hôn 45dB so vôùi aâm chuû 1000Hz. Hieäu quûa che coù yù nghóa raèng ta coù theå gia taêng möùc oàn neàn xung quanh moät aâm maïnh maø vaãn khoâng nghe ñöôïc tieáng oàn vì chuùng seõ bò che hoaøn toaøn. Taêng möùc oàn neàn coøn coù nghóa laø duøng ít bit ñeå soá hoùa. Vaø ñieàu naøy cuõng gioáng nhö laø ta ñaõ neùn aâm thanh vaäy. Baây giôø haõy xem boä maõ hoaù aâm thanh MPEG hoaït ñoäng nhö theá naøo. Boä maõ hoùa chia phoå taàn soá (20Hz ñeán 20kHz) thaønh 32 daõi nhoû (sub-band). Moãi sub-band giöõ 1 phaàn nhoû cuûa phoå. Trong vuøng treân cuûa sub-band 8 ta phaùt moät aâm coù taàn soá 1000Hz vôùi möùc to 60dB. Boä maõ hoùa seõ tính toaùn hieäu quûa che cuûa aâm naøy vaø nhaän ra raèng coù moät ngöôõng che cho toaøn boä sub-band thöù 8 (taát caû nhöõng aâm coù cuøng taàn soá). Ngöôõng che naøy thaáp hôn aâm phaùt ra 35 dB. Tæ soá s/n coù theå chaáp nhaän ñöôïc laø 60 - 35 = 25 dB, töông ñöông vôùi 4 bit. Ngoaøi ra noù coøn aûnh höôûng treân caùc sub-band 9-13 vaø 5-7 vôùi hieäu quûa che giaûm daàn töø sub-band 8. Hôn nöõa, boä maõ hoùa cuõng xem xeùt möùc ñoä nhaïy caûm cuûa tai ñoái vôùi caùc taàn soá khaùc nhau. Tai ngöôøi ít nhaïy caûm vôùi caùc taàn soá cao vaø thaáp. Noù nhaïy caûm nhaát ñoái vôùi taàn soá 2-4 kHz, cuøng daõi taàn soá vôùi tieáng noùi con ngöôøi. Caùc sub-band neân phuø hôïp vôùi tai ngöôøi., nghóa laø moãi sub-band caàn coù caùc taàn soá coù cuøng caùc tính chaát aâm hoïc taâm lyù. Trong MPEG layerII, moãi sub-band coù ñoä roäng 625Hz, do ñoù caàn phaûi coù nhöõng boä loïc baêng thoâng phöùc taïp. Ñeå caùc boä loïc ñôõ phöùc taïp, ngöôøi ta theâm FFT (Fast Fourie Transform) vaøo song song vôùi boä loïc vaø söû duïng caùc thaønh phaàn phoå töø FFT nhö laø caùc thoâng tin theâm vaøo boä maõ hoùa. Baèng caùch naøy ta seõ laáy maät ñoä bit cao hôn ñoái vôùi caùc taàn soá thaáp maø tai ngöôøi nhaïy caûm hôn. Coøn nhieàu vaán ñeà caàn phaûi baøn tôùi. Chuùng ta chæ môùi giaûi thích söï che ñoàng boä, hieäu quûa che coøn xaûy ra tröôùc vaø sau moät aâm maïnh. 3. Caùc lôùp cuûa aâm thanh MPEG. Coù nhieàu söï nhaàm laãn veà lôùp aâm thanh MPEG. Taát caû caùc lôùp ñeàu döïa treân cuøng moät löôïc ñoà maõ hoùa (maõ hoùa theo nhaän thöùc). Möùc ñoä phöùc taïp cuûa boä maõ hoùa vaø gæaûi maõ tuyø thuoäc vaøo moãi lôùp. Sau ñaây laø hình aûnh cho thaáy tæ soá {PAGE } neùn maø ta caàn phaûi ñaït tôùi 100% chaát löôïng CD vôùi caùc boä maõ hoùa vaø giaûi maõ khaùc nhau. Hình 4.8 { EMBED Paint.Picture } Sau ñaây laø chi tieát veà caùc lôùp. a. Lôùp I (Layer I): Ñaây laø lôùp ñôn giaûn nhaát phuø hôïp cho öùng duïng cuûa ngöôøi duøng. Moâ hình aâm hoïc taâm lyù cuûa lôùp naøy chæ söû duïng caùc taàn soá che. Ñieàu naøy coù nghóa raèng noù seõ boû qua caùc taàn soá bò khuaát sau caùc taàn soá khaùc. Phaïm vi toác ñoä bit töø 32 kbit/s (mono) ñeán 448 kbit/s (stereo). Tuøy thuoäc vaøo möùc ñoä phöùc taïp cuûa boä maõ hoùa, moät aâm thanh chaát löôïng cao (gaàn vôùi aâm thanh CD) yeâu caàu toác ñoä bit khoaûng 256 - 384 kb/s treân moät chöông trình stereo. Khoâng neân maõ hoùa vôùi möùc neùn cao hôn 384 kb/s. Ñoä phöùc taïp cuûa boä giaûi maõ thaáp, ñoä phöùc taïp cuûa boä maõ hoùa cao hôn 1.5 - 3 laàn. Lôùp I ñöôïc duøng nhieàu trong DDC vaø Solid State Audio. b. Lôùp II (Layer II): Lôùp II ñeà nghò möùc ñoä neùn cao hôn lôùp I vaø möùc ñoä loïc saâu hôn. Noù coù nhöõng öùng duïng soá cho caû aâm thanh chuyeân nghieäp vaø taøi töû, nhö qua ñaøi phaùt thanh, TiVi..Phaïm vi toác ñoä bit töø 32 - 192 kb/s cho aâm thanh mono, vaø töø 64 - 384 kb/s cho aâm thanh stereo. Tuøy thuoäc vaøo möùc ñoä phöùc taïp cuûa boä maõ hoùa, moät aâm thanh chaát löôïng cao (gaàn vôùi aâm thanh CD) yeâu caàu toác ñoä bit khoaûng 256 - 384 kb/s treân moät chöông trình stereo. Möùc ñoä phöùc taïp cuûa boä giaûi maõ 25% cao hôn so vôùi lôùp I, vaø boä maõ hoùa coù möùc phöùc taïp cao hôn 2 - 4 laàn. c. Lôùp III (Layer III). Lôùp III coøn ñöa ra möùc ñoä neùn vaø loïc cao hôn caû lôùp II vaø söû duïng moät boä maõ hoùa Huffman. Layer Complexity Encoder Decoder I 1.5 -- 3 1 II 2 -- 4 1.25 III > 7.5 2.5 {PAGE } Trong baûng treân, ñoä phöùc taïp cuûa boä giaûi maõ lôùp I ñöôïc duøng ñeå so saùnh. IV.3. CAÙC THOÂNG SOÁ DUØNG TRONG MPEG. Chuaån MPEG cho pheùp ta choïn löïa caùc thoâng soá cho vieäc neùn aâm thanh toát nhaát phuø hôïp vôùi öùng duïng maø ta söû duïng. Löôïc ñoà maõ hoùa cho caùc loaïi laø toång quaùt. Caùc thoâng soá coù theå choïn löïa trong boä maõ hoùa MPEG bao goàm : Mode, Sampling frequency, bitrate, vaø Layer. a. Mode. Chuaån MPEG coù 4 cheá ñoä:  Mono.  Dual channel.  Stereo.  Intensity Stereo (coøn goïi laø Joint Stereo). Cheá ñoä Mono roõ raøng ñöôïc duøng cho aâm thanh 1 keânh. Ñeå choïn cheá ñoä cho caùc öùng duïng 2 keânh, ñaàu tieân ta phaûi xaùc ñònh ñaâu laø tín hieäu traùi vaø ñaâu laø tín hieäu phaûi ñeå chia chuùng ra thaønh 2 files khaùc nhau, nhaèm sau naøy ta coù theå laøm vieäc ñoäc laäp treân keânh traùi hoaëc phaûi. Luùc ñoù ta seõ choïn cheá ñoä Mono. Neáu 2 keânh khoâng caàn hoaït ñoäng ñoäc laäp, ta choïn Stereo, Dual hay Intensity Stereo ñeå taïo moät file duy nhaát. Cheá ñoä Stereo hay keânh Dual laø hoaøn toaøn ñoàng nhaát khi chuùng cuøng sinh ra moät file duy nhaát cho tín hieäu stereo. Tuy nhieân moät bit chæ thò seõ nhaän daïng xem moät file laø ôû cheá ñoä naøo vaø coù theå ñöôïc duøng cho nhöõng aùp duïng naøo.. Cheá ñoä Intensity Stereo xem xeùt söï dö thöøa giöõa caùc keânh traùi vaø phaûi nhaèm toái öu maõ. Chaát löôïng chuû quan cuûa Intensity Stereo thay ñoåi theo hình aûnh stereo cuûa tín hieäu ñaõ maõ hoùa. Tuy nhieân noù ñaëc bieät thích hôïp cho toác ñoä truyeàn bit thaáp. b. Sampling Frequency (toác ñoä laáy maãu). Moät soá toác ñoä laáy maãu: - 32 kHz, 44.1 kHz vaø 48 kHz ñoái vôùi MPEG 1 (Tieâu chuaån ISO/IEC 11172-3). {PAGE } - 16 kHz, 22.05 kHz vaø 24 kHz ñoái vôùi MPEG 2 (Tieâu chuaån ISO/IEC 13818-3). Khi choïn löïa toác ñoä laáy maãu caàn xem xeùt caùc vaán ñeà:  Taàn soá laáy maãu caøng lôùn thì caøng nghe thuaän tai (ñoä daøi frame nhoû hôn).  Baêng thoâng tín hieäu giôùi haïn ôû möùc 15 kHz khi laáy maãu ôû toác ñoä 32 kHz vaø 8 kHz ôû toác ñoä 16 kHz.  Taàn soá laáy maãu (kHz) vaø toác ñoä cuûa aâm thanh maõ hoùa (kbps) coù theå choïn ñoäc laäp.  Taàn soá laáy maãu 44.1 kHz hay 22.05 kHz laø khoâng thieát thöïc cho vieäc choïn loïc vì ñoä daøi frame (byte) laø thay ñoåi.  Nhöõng file ñöôïc laáy maãu ôû nhöõng taàn soá khaùc nhau thì raát khoù khaên khi hoøa troän.  Khi duøng ngoõ nhaäp soá AES/EBU, taàn soá laáy maãu bò coá ñònh bôûi tín hieäu nhaäp. Neáu khoâng baét buoäc, Digigram yeâu caàu laáy maãu ôû 48 kHz hoaëc 44.1 kHz cho phaùt thanh hay öùng duïng multimedia. Neáu ta phaûi söû duïng toác ñoä bit thaáp cho söï truyeàn coù hieäu quûa, toác ñoä 24 kHz laø thích hôïp. c. Bit Rate. Moãi Layer vaø cheá ñoä coù nhieàu caùch choïn löïa toác ñoä bit (bit rate). Vieäc choïn toác ñoä bit tuøy thuoäc tröôùc tieân vaøo chaát löôïng aâm yeâu caàu. Baêng thoâng tín hieäu laø heïp hôn neáu toác ñoä bit thaáp, khieán cho noù khoâng thöïc teá ñoái vôùi moät soá öùng duïng. Toác ñoä bit ñöôïc ño theo kilobits/sec(kbps). Khi choïn löïa toác ñoä bit caàn xem xeùt caùc vaán ñeà:  Taïi 128 kbps treân moãi keânh (hay 256 kbps stereo), chaát löôïng aâm thanh CD seõ ñaït ñöôïc vôùi Layer I hay Layer II.  Taïi 192 kbps treân moãi keânh, chaát löôïng aâm thanh laø hoaøn toaøn trong suoát. Toác ñoä 128 kbps/keânh ñöôïc duøng phoå bieán nhaát trong phaùt thanh. Noù töông öùng vôùi tæ soá neùn 1:6 ôû toác ñoä laáy maãu 48 kHz. Toác ñoä thaáp hôn 128 kbps/keânh ñöôïc duøng trong caùc öùng duïng yeâu caàu tæ soá neùn lôùn hôn do giôùi haïn cuûa baêng thoâng truyeàn hay thieát bò löu tröõ. {PAGE } Moät soá toác ñoä bit cung caáp bôûi chuaån aâm thanh MPEG : · MPEG 1: 32 kHz, 44.1 kHz and 48 kHz - Layer I : 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 kbps. Nhöõng toác ñoä naøy laø coù theå ôû cheá ñoä Mono hay stereo.. - Layer II : 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 kbps. 32, 48, 56, 80 kbps chæ coù theå ôû cheá ñoä Mono; •64, 96, 112, 128, 160, 192 kbps coù theå ôû caû hai cheá ñoä Mono vaø Stereo;•224, 256, 320, 384 kbps chæ coù theå ôû cheá ñoä Stereo. · MPEG 2 : 16 kHz, 22.05 kHz and 24 kHz - Layer I : 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256 kbps Nhöõng toác ñoä naøy laø coù theå ôû cheá ñoä Mono hay stereo.. - Layer II : 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 kbps. Nhöõng toác ñoä naøy laø coù theå ôû cheá ñoä Mono hay stereo. d. Layers. Chuaån MPEG coù ba layer. Khi choïn löïa toác ñoä bit caàn xem xeùt caùc vaán ñeà:  ÔÛ cuøng toác ñoä bit, Layer II mang laïi chaát löôïng aâm thanh toát hôn Layer I. Keát luaän naøy laø chuû quan, vì söï cheânh leäch laø raát khoù phaân bieät ôû toác ñoä bit 128 kbps vaø lôùn hôn.  Duøng Layer I thì vieäc choïn loïc chính xaùc hôn Layer II bôûi vì ñoä phaân giaûi cuûa Layer I gaáp ba laàn Layer II. {PAGE } Resolution Table Sampling frequency Layer I (384 samples) Layer II (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 24 kHz 16 ms 48 ms Caùc ñieåm kyõ thuaät maáu choát. Chuaån maõ hoùa aâm thanh MPEG chæ ñònh vieäc ghi moät soá coá ñònh caùc maãu (384 cho Layer I vaø 1152 cho Layer II) ñeå taïo ra moät chuoãi caùc bytes goïi laø “frame”. “Frame” laø thöïc theå nhoû nhaát ñöôïc ñieàu khieån bôûi moät öùng duïng. Vieäc choïn toác ñoä bit(kbps) thieát laäp neân kích thöôùc cuûa frame ñoù theo byte. Ví duï: ÔÛ 48 kHz, 128 kbps, cheá ñoä Mono, Layer II:  48,000 maãu, töông öùng 1000 ms hay 1s, 1152 maãu töông öùng 24 ms.  ÔÛ toác ñoä bit 128,000 bits/s, 3072 bits (384 bytes) caàn cho 24 ms.  Chieàu daøi frame vì theá laø 384 byte.  Ñeå löu 1 phuùt, caàn 960,000 byte (hay khoaûng 1 Megabyte) ñóa troáng. {PAGE } CHÖÔNG 5. CAÙC GIAÛI THUAÄT NEÙN AÂM THANH. V.1. NEÀN TAÛNG LYÙ THUYEÁT THOÂNG TIN. Theo Shannon, entropy cuûa moät nguoàn thoâng tin S ñöôïc ñònh nghóa: H(S) = h = Sipilog2(1/pi) Trong ñoù: · pi laø xaùc xuaát maø kyù hieäu Si xuaát hieän trong S. · log2(1/pi) chæ ra soá löôïng thoâng tin chöùa ñöïng trong Si , nghóa laø soá bit caàn thieát ñeå maõ hoùa Si. · Ví duï: moät hình aûnh ñöôïc toâ ñeàu vôùi cuøng moät cöôøng ñoä maøu xaùm, töùc laø pi=1/256, thì soá bit caàn thieát ñeå maõ hoùa cho moãi möùc xaùm laø 8 bits. Entropy cuûa hình naøy laø 8. Giaûi thuaät Shannon - Fano: Ta duøng moät ví duï ñôn giaûn ñeå moâ taû giaûi thuaät: Kyù hieäu A B C D E --------------------------------------------------- Soá laàn 15 7 6 6 5 Maõ hoùa cho giaûi thuaät Shannon - Fano: Duøng caùch tieáp caän töø treân xuoáng. · Saép thöù töï caùc kyù hieäu theo taàn soá xuaát hieän cuûa noù, nghóa laø: ABCDE. · Chia thaønh hai phaàn, moãi phaàn töông ñöông vôùi cuøng soá laàn ñeám. Hình 5.1 {PAGE } Kyù hieäu Soá laàn log(1/p) Maõ Coäng(soá bit) ---------- -------- ---------- ----- --------------- 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 Toång coäng(soá bit) : 89 V.2. CAÙC GIAÛI THUAÄT NEÙN KHOÂNG COÙ TOÅN THAÁT. 1. Maõ hoùa Huffman. · Khôûi taïo: ñöa taát caû caùc node vaøo danh saùch OPEN theo thöù töï taïi moïi thôøi ñieåm. Ví duï: ABCDE. · Laëp laïi cho ñeán khi danh saùch OPEN chæ coøn moät node beân traùi nhö sau: - Töø danh saùch OPEN, choïn hai node coù xaùc xuaát thaáp nhaát, taïo node cha cho chuùng. - Gaùn toång caùc xaùc xuaát cho node cha vaø ñöa node cha vaøo danh saùch OPEN. - Gaùn caùc maõ 0, 1 vaøo caùc nhaùnh cuûa caây, xoùa caùc node con khoûi danh saùch OPEN. Hình 5.2 {PAGE } Kyù hieäu Soá laàn log(1/p) Maõ Coäng(soá bit) ---------- --------- ---------- ----- --------------- 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 Toång coäng (soá bit) : 87 · Vieäc giaûi maõ cho caû hai giaûi thuaät treân laø taàm thöôøng chöøng naøo maø baûng maõ (thoáng keâ) ñöôïc gôûi tröôùc döõ lieäu . Coù moät bit beân treân coâng vieäc truyeàn naøy, nhöng khoâng ñaùng keå neáu file döõ lieäu lôùn. · Tính chaát tieàn toá duy nhaát: khoâng coù maõ naøo laø tieàn toá cho moät maõ khaùc (taát caû caùc kyù hieäu ñeàu laø node laù) ® roõ raøng laø lôùn ñoái vôùi boä giaûi maõ. · Neáu vieäc thoáng keâ coù theå tieán haønh ñöôïc tröôùc ñoù vaø vôùi ñoä chính xaùc cao, thì maõ Huffman laø raát toát. Trong ví duï treân: Entropy = (15x1.38 + 7x2.48 + 6x2.7 + 6x2.7 + 5x2.96)/39 = 85.26 / 39 = 2.19. Soá bit caàn thieát cho maõ hoùa Huffman laø : 87 / 39 = 2.23 2. Maõ Huffman söûa ñoåi. (a) Caùc giaûi thuaät treân ñaây yeâu caàu kieán thöùc veà thoáng keâ laø ñieàu maø khoù coù theå thöïc hieän (ví duï aâm thanh, hình aûnh soáng..). (b) Ngay caû khi neáu ñieàu ñoù laø coù theå laøm ñöôïc thì chi phí cho noù khaù naëng, ñaëc bieät khi coù nhieàu baûng phaûi ñöôïc truyeàn maø moâ hình non-order() ñöôïc söû duïng, nghóa laø vieäc ñöa vaøo tính toaùn söï aûnh höôûng cuûa caùc kyù hieäu tröôùc ñoù vôùi xaùc xuaát cuûa kyù hieäu hieän haønh (ví duï: “qu” thöôøng ñi vôùi nhau,..). {PAGE } Giaûi phaùp ñöa ra laø duøng giaûi thuaät söûa ñoåi cho thích hôïp. Nhö ví duï, vieäc maõ hoùa Huffman söûa ñoåi ñöôïc khaûo saùt sau ñaây vôùi yù töôûng laø laøm theá naøo coù theå aùp duïng vaøo caùc giaûi thuaät neùn thích hôïp khaùc. Boä maõ hoùa Initialize_model(); while ((c = getc (input)) != eof) { encode(c, output); update_model(c); } Boä giaûi maõ Initialize_model(); while ((c = decode (input)) != eof) { putc(c, output); update_model(c); } {PAGE } · Maáu choát ôû ñaây laø caû hai boä maõ hoùa vaø giaûi maõ ñeàu duøng cuøng caùc haøm Initialize_model vaø update_model . · Haøm update_model coù hai löu yù: (a) Taêng bieán ñeám. (b) Caäp nhaät caây Huffman. - Trong suoát quùa trình caäp nhaät, caây Huffman seõ ñöôïc duy trì tính keá thöøa, caùc nodes (node trong vaø laù) ñöôïc saép xeáp theo thöù töï taêng daàn cuûa troïng löôïng (xem hình 5.3). - Khi caàn thieát traùo ñoåi (swapping), node xa nhaát vôùi troïng löôïng W ñöôïc traùo ñoåi vôùi node maø troïng löôïng cuûa noù taêng leân 1 ñôn vò W+1. Löu yù: neáu node troïng löôïng W coù caây con beân döôùi noù thì caây con ñoù cuõng phaûi dôøi cuøng vôùi noù. Caây Huffman coù theå nhìn raát khaùc so vôùi tröôùc khi traùo ñoåi, ví duï trong caây thöù 3, node A ñöôïc traùo ñoåi vaø trôû thaønh node 5. Baây giôø noù ñöôïc maõ hoùa chi baèng 2 bit. 3. Maõ hoùa soá hoïc. Maõ hoùa Huffman söû duïng moät soá nguyeân k caùc bit cho moãi kyù hieäu, vì theá k khoâng bao giôø nhoû hôn 1. Ñoâi khi, ví duï phaûi truyeàn moät hình aûnh 1 bit, thì khoâng theå neùn ñöôïc. YÙ töôûng: gæa söû maãu töï laø [X,Y] vaø P(X) = 2/3 P(Y) = 1/3. · Neáu ta chæ quan taâm vôùi chieàu daøi maõ hoùa laø 2 thoâng ñieäp, thì ta coù theå aùnh xaï taát caû thoâng ñieäp coù theå coù vaøo nhöõng ñoaïn trong phaïm vi [0..1] { EMBED Excel.Sheet.5 } · Ñeå maõ hoùa thoâng ñieäp, chæ duøng vöøa ñuû soá bit caàn thieát cho moãi ñoaïn. Hình 5.4 {PAGE } · Töông töï, ta coù theå aùnh xaï taát caû chieàu daøi 3 thoâng ñieäp vaøo caùc ñoaïn trong [0..1]. Hình 5.5 · Noùi chung, soá bit ñöôïc xaùc ñònh baèng kích thöôùc cuûa ñoaïn. Ví duï: Ñoaïn ñaàu tieân laø 8/27, caàn 2 bit® 2/3 bit cho moãi kyù töï. Ñoaïn cuoái laø 1/27, caàn 5 bit. · Toùm laïi, caàn -[logp] bit ñeå bieåu dieãn cho ñoaïn coù kích thöôùc p. · Vaán ñeà ñaët ra laø laøm theá naøo ñeå xaùc ñònh ñöôïc xaùc xuaát? YÙ töôûng ñôn giaûn laø duøng moâ phoûng : baét ñaàu baèng vieäc ñoaùn taàn soá cuûa moät kyù hieäu. Caäp nhaät taàn soá cho moãi kyù hieäu môùi. 4. Giaûi thuaät Lempel-Ziv-Welch(LZW). Gæa söû chuùng ta muoán maõ hoùa cho moät cuoán töï ñieån Tieáng Anh 159,000 töø. Nhö vaäy moãi töø caàn 18 bit ñeå maõ hoùa. Nhöôïc: - Duøng quùa nhieàu bit. - Chæ laøm vieäc cho kyù töï tieáng Anh. Giaûi phaùp: - Caàn phaûi tìm moät caùch ñeå maõ hoùa cuoán töø ñieån cho thích hôïp. - Caùc phöông phaùp ban ñaàu ñöôïc ñeà xuaát bôûi Ziv vaø Lempel vaøo naêm 1978 vaø 1979. Terry Welch phaùt trieån löôïc ñoà vaøo naêm 1981 vaø trôû thaønh giaûi thuaät LZW. Giaûi thuaä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; {PAGE } } LZW nguyeân goác söû duïng töø ñieån vôùi 4K muïc töø, 256 töø ñaàu tieân laø maõ ASCII. Ví duï: chuoãi kyù töï laø “^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 ^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 kyù hieäu nhaäp ñöôïc giaûm xuoáng 7 kyù töï vaø 5 maõ. Moãi maõ/kyù hieäu seõ caàn nhieàu hôn 8 bit, ta laáy 9 bit. Thoâng thöôøng, coâng vieäc neùn chæ ñöôïc baét ñaàu khi coù moät soá lôùn byte ñöôïc ñoïc vaøo (ví duï >100) Giaûi thuaät giaûi neù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; {PAGE } } V.3. CAÙC GIAÛI THUAÄT NEÙN COÙ TOÅN THAÁT. 1. Caùc phöông phaùp neùn aâm thanh ñôn giaûn: · Caùc phöông phaùp neùn khaûo saùt ôû treân khoâng hieäu quaû trong vieäc neùn aâm thanh. · Sau ñaây laø caùc phöông phaùp neùn coù toån thaát: - Neùn “silence” : doø caùc khoaûng “yeân laëng”, gioáng nhö maõ hoaù run-length. - LPC (Linear Predictive Coding) . - CELP (Code Excited Linear Predictor).. 2. Neùn aâm thanh duøng moâ hình aââm - taâm lyù. a. Heä thoáng nghe vaø phaùt aâm cuûa con ngöôøi. · Phaïm vi nghe ñöôïc töø 20 Hz ñeán 20 kHz, nhaïy caûm ôû 2 - 5kHz. · Phaïm vi phaùt aâm bình thöôøng töø 500 Hz ñeán 2 kHz. b. Che taàn soá (Frequency masking) “Ngöôõng che” (Threshold masking) : sinh ra töø hieäu öùng che, moãi aâm vôùi moät taàn soá vaø möùc to (dB) xaùc ñònh seõ coù moät “ngöôõng che” (xem hình 4.3 vaø 4.4) c. Baêng giôùi haïn. · Thöôùc ño taàn soá ñoàng boä khoâng töông xöùng vôùi ñoä roäng cuûa ñöôøng cong che. · Baêng giôùi haïn coù ñoä roäng laø 100Hz ñoái vôùi caùc taàn soá che < 500Hz, vaø caøng taêng leân ñoái vôùi caùc taàn soá >500Hz. · Ñònh nghóa moät ñôn vò môùi cho taàn soá laø bark ( Barkhausen) 1 Bark = beà roäng cuûa baêng giôùi haïn : - Taàn soá <500Hz : 1 bark = freq/100. - Taàn soá >500Hz : 1 bark = 9 + 4log(freq/1000). · Ngöôõng che treân thöôùc ño baêng giôùi haïn: { EMBED AutoCAD-r13 } Hình 5.6 d. Che nhaát thôøi (Temporal masking): che theo thôøi gian. {PAGE } Tai ngöôøi cuõng coù ñaëc tính löu aâm. Neáu coù moät aâm thanh lôùn, roài ngöng noù laïi, maõi moät luùc sau ta môùi coù theå nghe ñöôïc moät aâm laân caän nhoû hôn (xem hình 4.5 vaø 4.6). 4. Neùn aâm thanh MPEG. Vaøi thoâng soá: · MPEG-1 : 1.5Mbits/s cho aâm thanh vaø hình aûnh. Khoaûng 1.2 Mbits cho hình aûnh vaø 0.3Mbits/s cho aâm thanh. Aâm thanh CD khoâng neùn duøng : (44,100 maãu/s * 16bit/maãu * 2 keânh) > 1.4 Mbits/s · Aâm thanh MPEG cung caáp caùc taàn soá laáy maãu laø 32, 44.1 vaø 48 kHz. · Giaûi thuaät: 1. Duøng boä loïc thoâng ñeå chia tín hieäu aâm thanh thaønh caùc sub-band theo taàn soá, töông öùng vôùi 32 baêng giôùi haïn ® loïc sub-band. 2. Xaùc ñònh soá löôïng che cuûa moãi band gaây bôûi caùc band laân caän baèng caùc keát quûa böôùc 1 ® moâ hình aâm - taâm lyù. 3. Neáu möùc to cuûa moät baêng maø nhoû hôn ngöôõng che thì khoâng maõ hoùa noù. 4. Ngöôïc laïi, xaùc ñònh soá bit caàn thieát ñeå maõ hoùa sao cho nhieãu sinh ra bôûi vieäc löôïng töû hoùa naøy thaáp hôn ñöôøng cong che. 5. Ñònh daïng doøng döõ lieäu bit : { EMBED AutoCAD-r13 }Hình 5.7 Ví duï: Sau khi phaân tích, 16 band ñaàu tieân trong soá 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 _________________________________________________________ · Neáu möùc to cuûa aâm thöù 8 laø 60dB, noù seõ che band thöù 7 ôû möùc 12dB vaø band thöù 9 ôû möùc 15dB. Möùc to ôû band 7 laø 10dB (<12dB) neân bò boû qua, khoâng maõ hoùa. Möùc to band 9 laø 35 (> 15dB) neân ñöôïc tieáp tuïc xöû lyù. {PAGE } · Layer I : boä loïc loaïi DCT vôùi 1 frame vaø ñoä roäng taàn soá nhö nhau treân moãi sub-band. Moâ hình aâm-taâm lyù chæ söû duïng hieäu quaû che taàn soá (Frequency masking). · Layer II : söû duïng 3 frame trong boä loïc (tröôùc, hieän taïi vaø keá tieáp, toång coäng 1152 maãu). Moâ hình aâm-taâm lyù coù söû duïng hieäu quaû che nhaát thôøi (Temporal masking). · Layer III : duøng boä loïc baêng giôùi haïn toát hôn, moâ hình aâm-taâm lyù coù söû duïng hieäu quaû che nhaát thôøi, vaø coù duøng boä maõ hoaù Huffman. {PAGE } PHAÀN 2 XAÂY DÖÏNG PHAÀN MEÀM {PAGE } CHÖÔNG 6. LÖU ÑOÀ GIAÛI THUAÄT & CAÁU TRUÙC DÖÕ LIEÄU. 6.1. SÔ ÑOÀ KHOÁI. { EMBED Excel.Sheet.5 } 6.2. CAÁU TRUÙC DÖÕ LIEÄU VAØ ÑÒNH NGHÓA. A. Caáu truùc döõ lieäu. 1/. Caùc caáu truùc veà file: - Taäp tin tieâu ñeà : - Söû duïng : truy xuaát caùc taäp tin daïng *.wav vaø *.mp3. Trong chöông trình, caùc caáu truùc naøy söû duïng ôû caùc giai ñoaïn môû file, ñoïc caáu hình file, truy xuaát caùc thoâng tin veà caáu hình file. a/. Caáu truùc FILE WAVE : typedef struct { FILE *file; int type; int channels; int bits; long samplerate; long total_samples; long length; } wave_t; b/. Caáu truù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; {PAGE } int bitrate_index; int samplerate_index; int crc; int ext; int mode_ext; int copyright; int original; int mode_gr; } mpeg_t; c/. Caáu truùc config_t : typedef struct { time_t start_time; char* infile; wave_t wave; char* outfile; mpeg_t mpeg; } config_t; 2/. Caáu truùc doøng bit döõ lieäu: bitstream_t - Taäp tin tieâu ñeà : - Söû duïng: duøng trong quaù trình ñoïc hoaëc ghi döõ lieäu töø file leân vuøng ñeäm vaø ngöôïc laïi. typedef struct bit_stream_struc { FILE *pt; /* con troû ñeán file bit döõ lieäu */ unsigned char *buf; /* vuøng ñeäm cho doøng bit döõ lieäu */ int buf_size; /* kích thöôùc vuøng ñeäm tính theo soá byte */ long totbit; /* ñeám bit */ int buf_byte_idx; /* chæ byte treân cuøng trong vuøng ñeäm */ int buf_bit_idx; /* bit treân cuøng cuûa byte treân cuøng trong vuøng ñeäm */ int mode; /* môû doøng bit ôû cheá ñoä ñoïc hay ghi */ int eob; /* chæ ñeán cuoái vuøng ñeäm */ int eobs; /* ñaàu cuoái cuûa côø doøng bit */ char format; /* ñònh daïng file ôû cheá ñoä ñoïc (BINARY/ASCII) */ } bitstream_t; {PAGE } 3/. Caùc caáu truùc ñeå ñònh daïng doøng bit döõ lieäu: - Taäp tin tieâu ñeà : a/. Kieåu soá nguyeân: typedef unsigned int uint32; /* ñònh nghóa soá nguyeân khoâng daáu 32 bit */ typedef unsigned short uint16; /* ñònh nghóa soá nguyeân khoâng daáu 16 bit */ b/. Con troû haøm (*BitsFcnPtr): Ñaây laø moät nguyeân maãu haøm con troû caàn phaûi coù ñeå ghi caùc bit vaøo doøng döõ lieäu. Noù ghi “length” bits töø “value” bits, theo caùch ghi msb-first. Caùc bit trong value giaû ñònh laø right-justified. typedef void (*BitsFcnPtr)( uint32 value, uint16 length ); c/. Caáu truùc BF_BitstreamElement: Moät BitstreamElement chöùa ñöïng döõ lieäu ñaõ maõ hoaù seõ ñöôïc ghi vaøo doøng bit. “length” bit trong soá “value” seõ ñöôïc ghi vaøo doøng bit theo msb-first. typedef struct { uint32 value; uint16 length; } BF_BitstreamElement; d/. Caáu truùc BF_BitstreamPart: Moät BitstreamPart bao goàm moät nhoùm caùc “nrEntries” cuûa BitstreamElements. Moãi BitstreamElement seõ ñöôïc ghi vaøo doøng bit theo thöù töï maø noù xuaát hieän trong daõy 'element'. typedef struct { uint32 nrEntries; BF_BitstreamElement *element; } BF_BitstreamPart; e/. Caáu truùc BF_FrameData Caáu truùc naøy chöùa ñöïng taát caû nhöõng thoâng tin caàn thieát cho boä ñònh daïng doøng bit ñeå maõ hoaù moät frame döõ lieäu. Ta phaûi ñieàn ñaày noù vaø troû tôùi khi ñònh daïng. {PAGE } 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/. Caùc caáu truùc lieân quan deán boä ñònh daïng: Caáu truùc naøy chöùa ñöïng thoâng tin ñöôïc cung caáp bôûi boä ñònh daïng doøng bit. Ta coù theå söû duïng noù ñeå kieåm tra vaø xem thöû boä maõ cuûa ta coù chaáp nhaän caùc keát quaû cuûa vieäc goïi boä ñònh daïng hay khoâng. typedef struct BF_FrameResults { int SILength; 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; {PAGE } BF_PartHolder *headerPH; BF_PartHolder *frameSIPH; BF_PartHolder *channelSIPH[MAX_CHANNELS]; BF_PartHolder *spectrumSIPH[MAX_GRANULES][MAX_CHANNELS]; } MYSideInfo; 4/. Caáu truùc huffcodetab: - Taäp tin tieâu ñeà : - Söû duïng : duøng trong quaù trình maõ hoaù döõ lieäu theo thuaät toaù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. Caùc caáu truùc tính MDCT. - Taäp tin tieâu ñeà : - Söû duïng : trong tính toaùn MDCT, ñònh daïng doøng bit, tính toaùn moâ hình taâm lyù, maõ hoaù döõ lieäu.. typedef struct { unsigned part2_3_length; unsigned big_values; unsigned count1; unsigned global_gain; unsigned scalefac_compress; unsigned window_switching_flag; 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; {PAGE } 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/. Caáu truùc scalefac_struct: - Taäp tin tieâu ñeà : struct scalefac_struct { {PAGE } int l[23]; int s[14]; }; B. Caùc ñònh nghóa. 1/. Caùc ñònh nghóa duøng trong truy xuaát doøng bit döõ lieäu: - Taäp tin tieâu ñeà : #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)) #define MAX(A, B) ((A) > (B) ? (A) : (B)) 2/. Caùc ñònh nghóa duøng trong tính toaùn FFT: - Taäp tin tieâu ñeà : #define BLKSIZE_S 256 #define LOGBLKSIZE_S 8 3/. Caùc ñònh nghóa duøng trong ñòng daïng doøng döõ lieäu: - Taäp tin tieâu ñeà: #define MAX_CHANNELS 2 {PAGE } #define MAX_GRANULES 2 3/. Caùc ñònh nghóa duøng trong boä maõ hoaù Huffman: - Taäp tin tieâu ñeà: #define HUFFBITS unsigned long int #define HTN34 #define MXOFF 250 4/. Caùc ñònh nghóa duøng trong phaân tích döõ lieäu : - Taäp tin tieâu ñeà: #define e 2.71828182845 #define CBLIMIT 21 #define SFB_LMAX 22 #define SFB_SMAX 13 #define PRECALC_SIZE 1024 /* WAS 256 !!! */ 5/. Caùc ñònh nghóa duøng trong moâ hình aâm taâm lyù: - Taäp tin tieâu ñeà: #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<y) ? x : y ) {PAGE } 6/. Caùc ñònh nghóa duøng trong truy xuaát döõ lieäu nhaâp: - Taäp tin tieâu ñeà: #define Read32BitsLowHigh(f) Read32Bits(f) #define WriteString(f,s) fwrite(s,strlen(s),sizeof(char),f) #define Read32BitsLowHigh(f) Read32Bits(f) 7/. Caùc ñònh nghóa duøng trong caáu truùc file wave vaø 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 #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 {PAGE } 6.3. LÖU ÑOÀ { EMBED Excel.Sheet.5 } { EMBED Excel.Sheet.5 } {PAGE } { EMBED Excel.Sheet.5 } {PAGE } { EMBED Excel.Sheet.5 } {PAGE } CHÖÔNG 7. GIAO DIEÄN & THUYEÁT MINH CHÖÔNG TRÌNH 7.1. Giôùi thieäu. Giao dieän laø coâng cuï trôï giuùp ñaéc löïc cho ngöôøi söû duïng. Nhöõng phaàn meàm coù giao dieän toát luoân ñöôïc öa chuoäng. Ñoù cuõng chính laø öu ñieåm tuyeät vôøi cuûa Windows. Laäp trình trong Windows hoã trôï nhöõng coâng cuï cho pheùp ta taïo ra nhöõng giao dieän raát deã daøng vaø baét maét. Tuy nhieân, thieát keá giao dieän ñeå cho ai cuõng coù theå söû duïng ñöôïc vaø khoâng bò nhaàm laãn khoâng phaûi laø chuyeän deã daøng. Noù ñoøi hoûi ta phaûi coù moät caùi nhìn bao quaùt, thaäm chí phaûi hieåu saâu veà giaûi thuaät cuûa chöông trình thì môùi coù theå loaïi tröø nhöõng sai laàm khi söû duïng. Laäp trình trong Windows laø laäp trình theo tình huoáng. Moïi nuùt nhaán, oâ ñoái thoaïi treân giao dieän ñeàu coù theå ñöôïc truy caäp tôùi baát kyø luùc naøo maø khoâng theo moät trình töï nhaát ñònh. Do ñoù ngöôøi laäp trình caàn phaûi döï truø ñeán moïi tình huoáng vaø caàn phaûi ñöa ra moät soá ñeà nghò döôùi daïng nhöõng thoâng soá ñònh saün cho ngöôøi söû duïng theo ñoù maø vaän haønh. Ngoaøi ra, giao dieän caàn coù phaàn trôï giuùp ñeå höôùng daãn cho ngöôøi söû duïng ôû baát kyø luùc naøo. 7.2. Giao dieän. Döïa treân sô ñoà khoái vaø löu ñoà giaûi thuaät. Giao dieän bao goàm caùc phaàn nhö hình veõ sau: {EMBED PBrush} 1. Input group. Nhoùm caùc thoâng tin caáu hình vaø leänh veà taäp tin nguoàn ( *.wav). Bao goàm caùc thoâng tin nhö : bitrates, samplerates, mode, File path name.. 2. Open button. Môû hoäp thoaïi File Open cuûa Windows ñeå choïn file caàn neùn. Phaàn môû roäng maëc ñònh laø .wav 3. Text Edit box. 1 2 3 4 5 6 7 8 2 9101112131415 {PAGE } Duøng goõ file nguoàn baèng tay. Maëc ñònh laø *.wav. 4. Bitrates. Cho bieát chæ soá toác ñoä bit cuûa taäp tin nguoàn .wav ñaõ choïn treân muïc 2 hoaëc 3. Chæ soá maëc ñònh laø 128. Khoâng söûa baèng tay ñöôïc. 5. Samplerates. Cho bieát taàn soá laáy maãu cuûa taäp tin nguoàn .wav ñaõ choïn treân muïc 2 hoaëc 3. Taàn soá maëc ñònh laø 44100 Hz. Khoâng söûa baèng tay ñöôïc. Caùc taàn soá coù theå bao goàm : 32000, 44100 vaø 48000 Hz. 6. Output. Nhoùm caùc thoâng tin caáu hình vaø leänh veà taäp tin ñích ( *.mp3). Bao goàm caùc thoâng tin nhö : bitrates, samplerates, mode, File path name.. 7. Save button. Môû hoäp thoaïi File Save cuûa Windows ñeå ghi ñöôøng daãn vaø teân file neùn. Phaàn môû roäng maëc ñònh laø .mp3. 8. Text Edit box. Duøng goõ ñöôøng daãn aø teân taäp tin ñích baèng tay. Maëc ñònh laø *.mp3. Khi ñaõ choïn ñöôïc taäp tin nguoàn trong phaàn 2 hoaëc 3 thì trong oâ naøy seõ töï ñoäng xuaát hieän ñöôøng daãn vaø teân taäp tin ñích. 9. Bitrates. Ñònh chæ soá toác ñoä bit cuûa taäp tin ñích ñaõ choïn treân muïc 7 hoaëc 8. Chæ soá maëc ñònh laø 128. Coù theå choïn caùc chæ soá khaùc trong oâ keùo xuoáng, bao goàm caùc giaù trò : 16, 32, 40, 48, 56, 64, 80, 96, 112, 128, 156, 160, 192, 224, 256, 320. 10. Samplerates. Cho bieát taàn soá laáy maãu cuûa taäp tin ñích, phuï thuoäc vaøo vaø baèng vôùi taàn soá laáy maãu cuûa taäp tin nguoàn. Taàn soá maëc ñònh laø 44100 Hz. Khoâng söûa baèng tay ñöôïc. 11. Mode group. {PAGE } Nhoùm caùc cheá ñoä Stereo hay Mono. Maëc ñònh laø Stereo. 12. Progress bar. Thanh tieán trình, xuaát hieän trong quaù trình neùn töø taäp tin nguoàn .wav sang taäp tin ñích .mp3 . 13. Compress button. Nuùt nhaán naøy chæ coù theå sau khi ñaõ choïn vaø ñònh caáu hình ñaày ñuû cho caùc taäp tin nguoàn vaø ñích. Nghóa laø chæ coù theå nhaán ñöôïc nuùt naøy sau khi ñaõ nhaán nuùt Update. Khi nhaán nuùt naøy, quaù trình neùn töø taäp tin nguoàn sang taäp tin ñích môùi thöïc söï baét ñaàu. Ñoàng thôøi thanh tieán trình môùi baét ñaàu hoaït ñoäng. Keát thuùc quaù trình neùn seõ coù thoâng ñieäp baùo cho bieát ñaõ hoaøn taát coâng vieäc 14. Help button (F1). Nhaán phím naøy (hoaëc F1) seõ xuaát hieän cöûa soå trôï giuùp, höôùng daãn söû duïng caùc phím nhaán treân giao dieän. 15. Update button. Phím naøy ñöôïc nhaán sau khi ñaõ choïn caùc taäp tin nguoàn vaø ñích ñeå caäp nhaät caùc thoâng soá chuaån bò cho quaù trình neùn vaø kích hoaït phím Compress. 7.3. Chöông trình. Chöông trình coù neàn laø hoäp thoaïi MP3 COMPRESSOR hieån thò caùc phím nhaán cho ngöôøi söû duïng choïn löïa vaø chaïy öùng duïng. Do ñoù, taát caû caùc haøm chính ñeàu ñöôïc ñaët trong lôùp CMp3Dlg. Sau ñaây ta seõ laàn löôït khaûo saùt moät soá haøm quan troïng. 1. OnInitDialog( ) : Haøm naøy khôûi taïo moät soá giaù trò maëc ñònh cho hoäp thoaïi, nhaèm giuùp cho ngöôøi söû duïng coù moät caùi nhìn toaøn cuïc vaø hieåu ñöôïc ngay öùng duïng, ñeå töø ñoù coù theå choïn löïa caùc thoâng soá thích hôïp cho öùng duïng. Ñoàng thôøi, cuõng caøi ñaët saün moät soá giaù trò ban ñaàu cho caùc ñoái töôïng ñöôïc duøng cho chöông trình. BOOL CMp3Dlg::OnInitDialog() {PAGE } { CDialog::OnInitDialog(); ... // Khôûi taïo giaù trò ban ñaàu cho hoäp thoaï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); bOpen = FALSE; bSave = FALSE; // Gaùn caùc haèng cho caùc ñoá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); {PAGE } ... return TRUE; // return TRUE unless you set the focus to a control } 2. OnFileOpen( ) : Haøm môû hoäp thoaïi Open cuûa Windows ñeå choïn file nguoàn coù phaàn môû roäng maëc ñònh laø .wav , gaùn cho bieán m_file_in ñöôøng daãn vaø teân file ñaõ choïn. Ñoàng thôøi cuõng taïo ñöôøng daãn vaø teân file maëc ñònh cho taäp tin ñích coù phaàn môû roäng .mp3 vaø gaùn cho bieán m_file_out. void CMp3Dlg::OnFileOpen() { // Môû hoäp thoaïi File Open cuûa Windows baèng haøm thaønh vieân dlgOpen cuûa // lôùp CFileDialog trong thö vieän MFC. CFileDialog dlgOpen(TRUE, "wav", "*.wav"); if (dlgOpen.DoModal() == IDOK) { m_file_in = dlgOpen.GetPathName(); // gaùn ñöôøng daãn file nguoàn // cho ñoá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 daãn file ñích // cho ñoái töôïng m_file_out bOpen = TRUE; UpdateData(FALSE); } } 3. OnFileWrite( ) : Haøm môû hoäp thoaïi Save cuûa Windows ñeå choïn ñöôøng daãn vaø teân taäp tin ñích trong tröôøng hôïp khoâng muoán ñöôøng daãn vaø teân file maëc ñònh do haøm OnFileOpen( ) taïo ra, vaø gaùn noù cho bieán m_file_out. void CMp3Dlg::OnFileWrite() { CFileDialog dlgWrite(FALSE, "mp3", str2); if (dlgWrite.DoModal() == IDOK) { m_file_out = dlgWrite.GetPathName(); // gaùn ñöôøng daãn file ñích // cho ñoái töôïng m_file_out {PAGE } UpdateData(FALSE); bSave = TRUE; } } 4. OnUpdate( ) : Haøm caäp nhaät taát caû caùc thoâng soá ñaõ choïn treân hoäp thoaïi, ñöa vaøo caùc ñoái töông ñöôïc duøng trong chöông trình. Ñoàng thôøi kích hoaït phím nhaán COMPRESS cho pheùp phím naøy ñaõ coù theå baét ñaàu ñöôïc söû duïng. Neáu caùc thoâng soá nhaäp khoâng hôïp leä seõ cho hieän ra caùc thoâng baùo ñeå nhaäp laï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 con troû chæ // ñeán file nguoàn if (!wave_open()) { MessageBox("Unable to open input file..."); bWaveOpen = FALSE; } else bWaveOpen = TRUE; // Gaùn giaù trò caáu hình bitrates cho bieán config.mpeg.bitr tuyø theo giaù trò ñaõ // choïn treân hoäp thoaï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; {PAGE } 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; // Haøm GetDlgItem(IDC_ ) cho pheùp phím nhaán coù IDC_ laøm thoâng soá coù theå // hoaït ñoäng ñöôïc if (bWaveOpen) GetDlgItem(IDC_COMPRESS)->EnableWindow(); UpdateData(FALSE); } 5. OnCompress( ) : Khi goïi haøm naøy, quaù trình neùn töø taäp tin nguoàn .wav sang taäp tin ñích .mp3 seõ baét ñaàu thöïc hieän. Keát thuùc quaù trình neùn seõ coù hoäp thoaïi xuaát hieän thoâng baùo ñaõ hoaøn taát. void CMp3Dlg::OnCompress() { CCompressDlg compDlg; config.outfile = m_file_out.GetBuffer(5); L3_compress(); wave_close(); compDlg.DoModal(); // Cho hieån thò hoäp thoaïi thoâng baùo // coâng vieäc neùn ñaõ hoaøn taát m_pbar.SetPos(0); // Traû traïng thaùi thanh tieán trình veà vò trí ñaàu GetDlgItem(IDC_COMPRESS)->EnableWindow(FALSE); } 6. Wave_open( ) : Haøm môû file nguoàn vaø kieåm tra xem ñònh daïng file coù hôïp leä khoâng, neáu khoâng thì seõ hieän thoâng baøo vaø choïn laïi file khaùc. bool CMp3Dlg::wave_open() { static char *channel_mappings[] = {NULL,"mono","stereo"}; unsigned short wFormatTag; unsigned long dAvgBytesPerSec; {PAGE } 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); config.wave.samplerate = Read32BitsLowHigh(config.wave.file); dAvgBytesPerSec = Read32BitsLowHigh(config.wave.file); wBlockAlign = Read16BitsLowHigh(config.wave.file); /* PCM specific */ if(config.wave.channels>2) { {PAGE } 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); {PAGE } 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; } 7. L3_compress( ) : Ñaây laø haøm quan troïng nhaát trong chöông trình, noù moâ taû toaøn boä giaûi thuaät cuûa öùng duïng. Voøng laëp neùn cuõng naèm trong haøm naøy. Moãi voøng laëp thöïc hieän coâng vieäc neùn cho moät frame döõ lieäu ñoïc töø file nguoàn. Cuõng töø voøng laëp naøy, ta cho thanh tieán trình hoaït ñoäng nhôø vaøo kích thöôùc bieát tröôùc cuûa file ñoïc vaøo. Voøng laëp keát thuùc cuõng laø luùc thanh tieán trình ñöôïc ñieàn ñaày vaø thoâng baùo “Compress complete !” xuaát hieä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; {PAGE } 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ôû thieát bò ñeå 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 = 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++; {PAGE } 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<config.mpeg.mode_gr;gr++) for(channel=0;channel<config.wave.channels;channel++) L3_psycho_analize(channel, &buffer[channel][gr*576], &sam[channel][0], &snr32[0], &ratio.l[gr][channel][0], &ratio.s[gr][channel][0], &pe[gr][channel], &side_info.gr[gr].ch[channel].tt); /* polyphase filtering */ for(gr=0;gr<config.mpeg.mode_gr;gr++) for(channel=0;channel<config.wave.channels;channel++) for(i=0;i<18;i++) { L3_window_subband(&buffer_window[channel], &win_que[channel][0], channel); L3_filter_subband(&win_que[channel][0], &l3_sb_sample[channel][gr+1][i][0]); } /* apply mdct to the polyphase output */ {PAGE } L3_mdct_sub(l3_sb_sample, mdct_freq, &side_info, &config); /* bit and noise allocation */ L3_iteration_loop(pe,mdct_freq,&ratio,&side_info, l3_enc, mean_bits,&scalefactor, &config); /* write the frame to the bitstream */ L3_format_bitstream(l3_enc, &side_info, &scalefactor, &bs, mdct_freq, NULL , 0, &config); frame_bits = sstell(&bs) - sent_bits; sent_bits += frame_bits; } L3_FlushBitstream(); close_bit_stream_w(&bs); } {PAGE } *Taøi lieäu tham khaûo 1. Giaùo trình aâm hoïc Kieán truùc. KTS. Vieät Haø - Nguyeãn Ngoïc Giaû Tröôøng Ñaïi hoïc kieán truùc – 1993 2. Xöû lyù tín hieäu soá. Quaùch Tuaán Ngoïc Nhaø xuaát baûn Giaùo duïc – 1997 3. Digital Signal Processing John G.Proakis - Dimitris G.Manolakis Prentice Hall 4. C Language Algorithms for Digital Signal Processing Paul M.Embree - Bruce Kimble Prentice Hall 5. Ñòa chæ Internet : {PAGE } Filename: lvtn Directory: D:\lvtn\new web2\docs Template: C:\Program Files\Microsoft Office\Templates\Normal.dot Title: MUÏC LUÏC Subject: Author: Thinh Keywords: Comments: Creation Date: 10/16/99 10:10 AM Change Number: 6 Last Saved On: 10/22/99 8:45 PM Last Saved By: Thinh Total Editing Time: 16 Minutes Last Printed On: 10/22/99 8:46 PM As of Last Complete Printing Number of Pages: 85 Number of Words: 16,043 (approx.) Number of Characters: 91,448 (approx.)

Các file đính kèm theo tài liệu này:

  • pdfLVTN2.PDF
  • zipMP3.ZIP
Luận văn liên quan