MP3語音壓縮的DSP設(shè)計與實(shí)現(xiàn)_第1頁
MP3語音壓縮的DSP設(shè)計與實(shí)現(xiàn)_第2頁
MP3語音壓縮的DSP設(shè)計與實(shí)現(xiàn)_第3頁
MP3語音壓縮的DSP設(shè)計與實(shí)現(xiàn)_第4頁
MP3語音壓縮的DSP設(shè)計與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、上海大學(xué)20142015學(xué)年冬季學(xué)期研究生實(shí)驗(yàn)報告課程名稱:DSP 技術(shù)及其應(yīng)用課程編號:07S009005題目:MP3語音壓縮的DSP設(shè)計與實(shí)現(xiàn)研究生:學(xué)號:評語:成績:任課教師:評閱日期:MP3 語音壓縮的 DSP 設(shè)計與實(shí)現(xiàn)2014年 12月 25日、實(shí)驗(yàn)要求與目的1、實(shí)驗(yàn)要求:對單聲道、采樣率、 16位量化精度的音頻信號進(jìn)行壓縮,實(shí)現(xiàn) *mp3 格式的數(shù)據(jù)結(jié) 構(gòu)。2、實(shí)驗(yàn)?zāi)康模?1) 熟悉掌握 Matlab R2010a 軟件的使用,及音頻信號的采集與處理;(2)學(xué)習(xí)掌握C語言,并熟悉掌握VS2013的仿真與調(diào)試;( 3) 熟悉掌握軟件的仿真與調(diào)試;熟悉掌握 PCM、WAV 以及 MP

2、3 等音頻信號的數(shù)據(jù)結(jié)構(gòu);熟悉掌握 MP3 壓縮的原理 ;二、實(shí)驗(yàn)設(shè)備與環(huán)境本實(shí)驗(yàn)采用的硬件環(huán)境為: 宏碁筆記本電腦 , 2.2GHz Pentium(R) Dual-Core CPU, i3 處理器,2.00G內(nèi)存,32位 Windows 7操作系統(tǒng)。使用的軟件有:Matlab R2010a Microsoft Visual Studio 2013 以及。其中在中,仿真目標(biāo)芯片選型為: Generic device - Generic C64xx Device。三、整體實(shí)驗(yàn)方案設(shè)計本實(shí)驗(yàn)主要包括以下三個部分:1Matlab錄音:在Matlab平臺,利用其自帶的波形記錄函數(shù) wavecord函

3、數(shù)錄制單通道、16位分辨率、采樣率為44.1K音頻信號,并保存為wav格式音頻文件10秒;2 Matlab 壓縮:在 Matlab 平臺,利用 lamb 工具,即 mp3write 函數(shù),對音頻進(jìn) 行 mp3 壓縮僅作為 CCS 的參考。3CCS VS2013壓縮:1、利用fread函數(shù)讀取WAV文件,并解析其頭部信息;2、利用fread函數(shù)讀取一幀MP3對應(yīng)的576個PCM數(shù)據(jù)(1152個采樣值);3、對576個 PCM數(shù)據(jù)進(jìn)行多相濾波器,將其分成32個頻寬大小相同的子頻帶, 即變換為 18*32個樣本數(shù)據(jù)。4、進(jìn)行MDCT變換,將分成的32個子帶信號進(jìn)一步細(xì)分,產(chǎn)生32*18=576個頻

4、線輸出。5、對MDCT輸出的信號,經(jīng)過失真控制環(huán)和量化率控制環(huán),即量化器的處理, 最終實(shí)現(xiàn)信號的非線性量化。6由霍夫曼編碼(Huffman code)做最后壓縮處理,壓縮后得到一個記錄每個符 號代表的字符串的編碼表以及一連串由符號組成的信息內(nèi)容,該編碼方式可以節(jié)約 20 %的空間。7、將編碼后的數(shù)據(jù)打包成MP3幀格式,并實(shí)現(xiàn)比特流數(shù)據(jù)輸出。四、實(shí)驗(yàn)原理1音頻信號基本知識聲音的數(shù)字化過程主要包括四個過程如下圖:1采樣,對振幅隨時間連續(xù)變化 的模擬信號波形按一定的時間間隔取出樣值,形成在時間上不連續(xù)的脈沖序列;2量化,將模擬信號的幅度,在動態(tài)范圍內(nèi)劃分為相等間隔的假設(shè)干層次,把采樣輸出的信 號電平

5、按照四舍五入的原則歸入最靠近的量值。 3編碼,把采樣、量化所得的量值變 換為二進(jìn)制數(shù)碼的過程稱為編碼。4壓縮,依據(jù)聲音信息中存在著多種冗余信息、聽 覺器官的不敏感性以及采樣的標(biāo)本中存在著相關(guān)性,對編碼后的二進(jìn)制信號進(jìn)行壓縮。,mi翳甜畫盤時碼卜趕 魏圖、聲音數(shù)字化流程在對模擬音頻信號進(jìn)行采樣量化編碼后,將得到數(shù)字音頻。數(shù)字音頻的質(zhì)量取決于 采樣頻率、量化位數(shù)和聲道數(shù)三個因素如表 1所示。1)米樣頻率米樣頻率是指一秒鐘時間內(nèi)米樣的次數(shù)。米樣頻率與聲音頻率之間有一定的關(guān)系, 根據(jù)奈奎斯特理論,只有米樣頻率咼于聲音信號最咼頻率的兩倍時,才能把數(shù)字信號表 示的聲音復(fù)原成為原來的聲音。通常聲音信號最高頻

6、率約為,則采樣頻率取至少為kHz 在本實(shí)驗(yàn)中,我們采用的是 CD的采樣標(biāo)準(zhǔn),即.2)量化位數(shù)量化位數(shù)也稱“量化精度”,是描述每個采樣點(diǎn)數(shù)值的二進(jìn)制位數(shù)。例如,8位量化 位數(shù)表示每個采樣值可以用2的8次方,即256個不同的量化值之一來表示,而 16位 量化位數(shù)表示每個采樣值可以用 2的16次方,即65536個不同的量化值之一來表示。 量化噪聲則是指某個采樣時間點(diǎn)的模擬值和最近的量化值之間的差,誤差最大可以到達(dá)離散間距的一半。一般量化位數(shù)越大,量化噪聲越小。在本實(shí)驗(yàn)中,我們采用的是16位的量化精度。3)聲道數(shù)聲音通道的個數(shù)稱為聲道數(shù),是指一次采樣所記錄產(chǎn)生的聲音波形個數(shù)。記錄聲音時,如果每次生成一

7、個聲波數(shù)據(jù),稱為單聲道;每次生成兩個聲波數(shù)據(jù),稱為雙聲道立 體聲。隨著聲道數(shù)的增加,所占用的存儲容量也成倍增加。本實(shí)驗(yàn),為了降低語音文 件的大小,以及實(shí)驗(yàn)的難度采用單聲道。表1、數(shù)字音頻質(zhì)量的技術(shù)參數(shù)表米樣頻率量化位數(shù)聲道數(shù)含義每秒鐘抽取聲波幅度 樣本的次數(shù)每個采樣點(diǎn)用多少二進(jìn) 制位表示數(shù)據(jù)范圍使用聲音通道的個數(shù)特點(diǎn)米樣頻率越高、聲音質(zhì)量越好、數(shù)據(jù)量也越大量化位數(shù)越多、音質(zhì)越 好、數(shù)據(jù)量也越大立體聲比單聲道的表 現(xiàn)力豐富,但數(shù)據(jù)量 翻倍常用值11.025 22.05 和 44.1 k8位、16位單聲道、立體聲2、WAV音頻信號結(jié)構(gòu)WAV文件格式是一種由微軟和IBM聯(lián)合開發(fā)的用于音頻數(shù)字存儲的標(biāo)

8、準(zhǔn),它采用 RIFF文件格式結(jié)構(gòu),非常接近于AIFF和IFF格式。其由文件頭和數(shù)據(jù)體兩大部分組成, 其中文件頭又分為RIFF/WAV文件標(biāo)識段和聲音數(shù)據(jù)格式說明段兩部分,而數(shù)據(jù)體主 要包含以脈沖編碼調(diào)制PCM丨格式表示的樣本。WAV文件的由四個部分組成:表2、WAV文件結(jié)構(gòu)RIFF WAVE ChunkID=RIFFRiffType= WA VEFormat ChunkID=fmt Fact Chun k(opti on al)ID=factData Chu nkID =data表 3、RIFF WAVE Chunk 結(jié)構(gòu)名稱長度內(nèi)容ID4 BytesRIFFSize4 BytesFileLe

9、n-8,整個文件大小-8Type4 BytesWAVE表 4、Format Chunk結(jié)構(gòu)名稱長度內(nèi)容備注ID4 Bytesfmt Size4 Bytes18/16 (有無附加信息)本結(jié)構(gòu)大小除ID,SizeFormatTag2 Bytes通常0 x0001編碼方式Chann els2 Bytes1-單聲道;2-雙聲道立體聲聲道數(shù)目SamplesPerSec4 Bytes米樣頻率AvgBytesPerSec4 Bytes每秒所需字節(jié)數(shù)BlockAlig n2 Bytes數(shù)據(jù)塊對齊單位BitsPerSample2 Bytes每個采樣需要的位bit數(shù)附加信息2 Bytes(可選,通過Size來判斷

10、附加信息表 5、Fact Chunk(optional)結(jié)構(gòu)可選名稱長度內(nèi)容ID4 BytesfactSize4 Bytes數(shù)值為4data4 Bytes表 6、Data Chunk 結(jié)構(gòu):名稱長度內(nèi)容ID4 BytesdataSize4 Bytes數(shù)據(jù)區(qū)大小data4 Bytes數(shù)據(jù)區(qū),真正存儲數(shù)據(jù)的地方表7、PCM數(shù)據(jù)的存放方式:樣本1樣本28位單聲道 0聲道0聲道8位立體聲 0聲道左1聲道右0聲道左1聲道右16位單聲道 0聲道低字節(jié)0聲道高字節(jié)0聲道低字節(jié)0聲道高字節(jié)16位立體聲 0聲道左低字節(jié) 0聲道左高字節(jié)1聲道右低字節(jié) 1聲道右高字節(jié)WAVE文件的每個樣本值包含在一個整數(shù)i中,的長

11、度為容納指定樣本長度所需的 最小字節(jié)數(shù)。首先存儲低有效字節(jié),表示樣本幅度的位放在i的高有效位上,剩下的位置為0,這樣8位和16位的PCM波形樣本的數(shù)據(jù)大小如下所示。 表& PCM波形樣本大小樣本大小數(shù)據(jù)格式最大值最小值8 位 PCMunsigned int225016 位 PCMint32767-327673、MP3音頻信號結(jié)構(gòu)MP3的全稱為MPEG1 Layer-3音頻文件,由幀(frame)構(gòu)成,幀又是 MP3文件的最 小組成單元。MPEG音頻文件是MPEG1標(biāo)準(zhǔn)中的聲音部分,也叫 MPEG音頻層,它根 據(jù)壓縮質(zhì)量和編碼復(fù)雜程度劃分為三層,即 Layer-1、Layer2、Layer3,且

12、分別對應(yīng)MP 1、MP2、MP3這三種聲音文件,并根據(jù)不同的用途,使用不同層次的編碼。MPEG音頻編碼的層次越高,編碼器越復(fù)雜,壓縮率也越高。 MP1和MP2的壓縮率分別為4: 1 和6: 1-8: 1,而MP3的壓縮率則高達(dá)10: 1-12: 1。MP3采取了感官編碼技術(shù),即編碼時先對音頻文件進(jìn)行頻譜分析,然后用過濾器 濾掉噪音電平,接著通過量化的方式將剩下的每一位打散排列,最后形成具有較高壓縮 比的MP3文件,并使壓縮后的文件在回放時能夠到達(dá)比較接近原音源的聲音效果。MP3 文件又三個部分組成,分別是:TAG_V2(ID3V2),F(xiàn)rame, TAG_V1(ID3V1)。表9 MP3文件結(jié)

13、構(gòu)ID3V2包含了作者,作曲,專輯等信息,長度不固定,擴(kuò)展了ID3V1的信息量。一系列的幀,個數(shù)由文件大小和幀長決定。每個Frame的長度可能不固定,F(xiàn)rame 也可能固定,由位率bitrate決定。每個Frame又分為幀頭和數(shù)據(jù)實(shí)體兩部 分,幀頭記錄了 mp3的位率,采樣率,版本等信息,每個幀之間相互獨(dú)立。ID3V1包含了作者,作曲,專輯等信息,長度為128Byte。每個Frame都有一個幀頭Frameheade,長度4Byte32bit。頭部最前面的11位總是被設(shè)置為1并稱它為“幀同步”因此,可以搜索整個文件以確定第一次出現(xiàn)連續(xù)11 個被設(shè)置為1的地方,然后讀整個頭部并檢測值是否正確。幀頭

14、后面可能有兩個字節(jié)的 CRC校驗(yàn),這兩個字節(jié)的存在與否取決于 Frameheade信息的第16bit:假設(shè)為0則幀頭 后面無校驗(yàn);否則有校驗(yàn),校驗(yàn)長度為 2個字節(jié)。緊跟在Frameheade后面的是幀的實(shí) 體數(shù)據(jù),其具體格式如下表所示:表10 MP3幀結(jié)構(gòu)FrameheaderCRCfreeMain Data4 Byte0或者2 Byte長度由幀頭計算得出4、MP3音頻壓縮算法MP3的編碼框圖如下圖。從整體來看,MP3編碼算法流程刻大致分為:時頻映射(包 括子帶濾波器組和 MDCT)和量化編碼(包括比特和比例因子分配和哈夫曼編碼)等兩大 功能模塊。計算都十分復(fù)雜,實(shí)現(xiàn) MP3編碼的關(guān)鍵也在于這

15、兩個功能模塊。在MP3編碼中,輸入的數(shù)字音頻信號即 PCM采樣信號進(jìn)入子帶濾波器組后, 被分成32個子帶信號,MDCT改良離散余弦變換)把子帶的輸出在頻域里進(jìn)一步地 細(xì)分成18個頻線,這樣共產(chǎn)生576個頻線。假設(shè)采用心理聲學(xué)模型來計算子帶信號的 信掩比的方式,即根據(jù)這些信掩比決定分配給 576個頻線的比特數(shù),則在比特分配的過 程可以實(shí)現(xiàn)可變步長量化接著再對頻線進(jìn)行定長量化,量化后的樣值,再經(jīng)過無失真 的哈夫曼編碼,以提高編碼效率,并與比特分配和量化產(chǎn)生的邊信息一起組成一幀數(shù)據(jù)。 MP3編碼的一幀數(shù)據(jù)包括兩個組,每組有576個頻線和與他們相關(guān)的邊信息,邊信息被 存儲在每一幀的幀頭中。對這樣一幀一

16、幀組成的比特流,MP3解碼器可以獨(dú)立的進(jìn)行解 碼,而不需要額外的信息了。1混合濾波器組混合濾波器組包括子帶濾波器組和MDCT兩部分。子帶濾波器組編碼完成樣本信號從時域到頻域的映射,并將規(guī)定格式的數(shù)字音頻信號假設(shè)采樣頻率是44. 1 kHz,樣本量化為16位,則編碼比特率為16*44100bit/ s分解成32個子帶輸出。子帶分析 濾波器組的32個子帶是等帶寬的,而由心理聲學(xué)模型得出的臨界帶寬則不是等帶寬 的,所以分析濾波器的帶寬與人耳聽覺上的臨界頻帶劃分并不匹配。為了使得進(jìn)行編碼 的各比例因子帶與臨界頻帶相匹配,需要對每個子帶信號做MDCT變換,從而提供更精 細(xì)的頻率分辨率。將子帶濾波器組的輸

17、出送到 MDCT濾波器組后,每組將細(xì)分為18條 頻線,共產(chǎn)生576條頻線,這對處理穩(wěn)態(tài)信號能獲得最大的編碼增益。子帶濾波器由32個FIR型BPF組成,每個BPF的長度為512點(diǎn)。因此實(shí)際上是用 一個32X 512的變換矩陣C將輸入序列 Xi中的連續(xù)512個數(shù)據(jù)點(diǎn)所構(gòu)成的輸入矢量 X,變換成一個具有32個分量的輸出矢量S。其中S的32個數(shù)據(jù)點(diǎn)SK按子帶頻率從 低到高的順序排列。將PCM采樣音頻信號以32個為一組輸入一個長度為512的X向量緩沖區(qū),構(gòu)造一 個具有512個元素的矢量空間X ;然后用矢量C對X加窗,得到矢量Z,其中Ci在標(biāo) 準(zhǔn)中給出;512維矢量Z被分成8個64維矢量Yi,然后將8個矢

18、量相加得到矢量丫 ; 最后對進(jìn)行變換從而得到32個子帶信號。子帶濾波器組對不同塊類型的輸出有不同的計算矩陣 (已在MPEG-I標(biāo)準(zhǔn)中給 出),即不同的窗口類型:長窗、開始窗、結(jié)束窗和短窗。對子帶濾波器組的輸出加窗 后,再進(jìn)行MDCT變換,這樣可以有效的控制前回聲2量化編碼在MPEG-I標(biāo)準(zhǔn)中用一個三層迭代的循環(huán)模型如圖,對經(jīng)過MDCT后輸出的樣 本進(jìn)行比特分配和量化。最高一級稱為幀循環(huán),它首先復(fù)位所有的迭代變量,計算能夠 提供應(yīng)每節(jié)數(shù)據(jù)的最大比特數(shù),然后調(diào)用外層迭代模型;外層迭代模型首先調(diào)用內(nèi)層迭 代循環(huán),內(nèi)層迭代循環(huán)對輸入矢量進(jìn)行量化,通過遞增量化步長使量化輸出能夠在一定 的比特位數(shù)限制之內(nèi)

19、被編碼。然后確定哈夫曼編碼表的選擇,并對量化頻譜進(jìn)行哈夫曼 編碼。哈夫曼編碼對量化的最大值有限制,MPEG -I規(guī)定最大值不超過8191。所以要判 斷所有的量化值是否超過限定,如果超過最大限制,內(nèi)層迭代循環(huán)遞增量化步長,重新 量化。然后確定哈夫曼編碼的位數(shù),使其所占的比特數(shù)小于由幀循環(huán)計算出的每節(jié)編碼 所能提供的最大比特數(shù),否則也要增加量化步長重新量化。如果經(jīng)過量化產(chǎn)生的噪聲過 大,有可能導(dǎo)致樣本失真,無法被正確解碼,所以外層迭代循環(huán)根據(jù)內(nèi)層輸出來檢測每 個比例因子頻段的量化噪。圖、三層迭代模型在內(nèi)層迭代中采用了哈夫曼編碼是為了消除信號中的冗余,提高編碼的效率。在 MP3編碼標(biāo)準(zhǔn)中,提供了 3

20、2個哈夫曼碼表用于對量化后的信號進(jìn)行哈夫曼編碼,使得 編碼的碼率大大降低。哈夫曼表的選擇是根據(jù)量化值的最大值以及信號的統(tǒng)計特性來決 定的。經(jīng)量化編碼的信號同邊信息一起組成一幀數(shù)據(jù),并以幀流的形式存儲或傳輸。五、實(shí)驗(yàn)內(nèi)容與結(jié)果1、Matlab 語音信號錄制本實(shí)驗(yàn)原音頻數(shù)據(jù),利用Matlab軟件自帶wavrecord函數(shù)進(jìn)行單聲道、44.1KHZ采樣率、16位量化精度語音錄制,wavwrite函數(shù)將錄制好的語音數(shù)據(jù)保存為 wav音頻文件。 錄制后,最終音頻文件保存為voice.wav音頻文件,大小為861KB882,044字節(jié)。1 丨函數(shù) y=wavrecord(time*fs,fs,1,i nt

21、16)輸入:time,音頻錄制時間,本實(shí)驗(yàn)為10s; fs,采樣頻率,本實(shí)驗(yàn)為44100KHZ ; 1, 通道數(shù),本實(shí)驗(yàn)采用單通道;i nt16,量化精度,本實(shí)驗(yàn)采用16位量化精度;輸出:y,輸出采樣數(shù)據(jù),大小為441000*1 int16。2函數(shù) wavwrite(y,fs,16,voice.wav)y :錄制好的語音信號,大小441000*1 int16 ;fs:采樣頻率,44100KHZ ;16:量化精度, 16位;voice.wav:保存的音頻文件名。2、在CC5.5中,定義結(jié)構(gòu)體header來存儲 WAV幀頭信息,用fread函數(shù)來讀取 WAV 文件。其中結(jié)構(gòu)體header定義如下:

22、struct wave_headerchar riff4;/* RIFF */unsigned int siZe; char wave4;char fmt4; unsigned int fmt_len; unsigned short tag; unsigned short channels; unsigned int samp_rate; unsigned int byte_rate; unsigned short byte_samp; unsigned short bit_samp; char data4; unsigned int length; header;CCS5.5讀取到的頭信息如

23、下圖: 其中 riff= RIFF; siZe=882036;/*文件大小 = 頭大小(36) +數(shù)據(jù)長度 */* WA VE */* fmt */* fmt chunk 的長度= 16 */* MS PCM = 1 */* 通道數(shù) */*采樣率 */* bytes per second = samp_rate * byte_samp*/* block align (bytes per sample) */* bits per sample */* data */* 數(shù)據(jù)長度 (bytes) */ wave=WAVE; fmt=fmt.; f,t_len=16;tag=1; channels=

24、1; samp_rate=44100; byte_rate=88200; byte_samp=2; bit_samp=16; data=data; lenth=882000;LOHDCnUlCbK9C2AfEC* IdER* IIIckgFSK務(wù) FWW I2|ctarFChdKCIAFEIHIchipFCMSGFEI阿加MQOZdFRI*MWVS-OvOOO侶*CW(nC26FM*網(wǎng)clarW(MXKkjAFH1*111chlf黑F朽I* 111VCMXWFHl粹I9|dwECWC&WPjlirTriiuKa啊* |D|cha*I* HI知mchartNmCOAFfAH- PIcharCMX

25、C2AflF=-松 Inrljen*dg*-e-d X16go軸丸*詢屮陌峠|掩E1CtaooojemM IfhHHflHkifMiigrwd HhcriiMflOWDdJ!arri -alau.-iiqr-i d ite4130OsDQCEMM45igr-ed ktBBLZfficuxx:2firal2啊血刈Mrxl16driutwr 糾vOXUBClDCbdXCitiDlH- itH4rdchir* raichirtocwnnMDIcharB(MnOJBDISupiigrvd ntBB2000chfncjflDM聲 dhf.MCnwF怦-ffly *cM* T71MQQW7VHoW0對應(yīng)W

26、AV原始PCM數(shù)據(jù)在CCS5.5中,定義無符號整形buff數(shù)組來存儲從 WAV中的原始PCM數(shù)據(jù),對于 單聲道音頻,這里數(shù)組大小為 576;對于雙聲道音頻,這里數(shù)組大小為1152。un sig ned int *wave_get(void) _int n ,p;static un sig ned int buffsamp_per_frame;/采樣數(shù)據(jù)緩存空間n = con fig.mpeg.samples_per_frame (2 - con fig.wave.cha nn els);/實(shí)際所采樣數(shù) p = fread(buff,sizeof(unsigned int),(short)n,c

27、onfig.wave.file); /讀取WAV 中的音頻數(shù) if(!p) /對應(yīng)單通道,高576位為0;return 0;elsefor(; pvn; p+) buffp=0;return buff;4 MP3幀壓縮處理這獲取WAV音頻中的PCM信號后,接下來就是對數(shù)據(jù)進(jìn)行壓縮編碼處理。具體包括 以下幾個部分。多相濾波多相濾波器組的作用是將聲音信號分成32個頻寬大小相同的子頻帶,即將輸入的576 個樣本數(shù)據(jù),變換為18*32個樣本數(shù)據(jù)。但這32個子頻帶對音頻壓縮的效果并不好,因 此通過加入混合多相MDCT的處理來改善信號的失真。void L3_wi ndow_filter_subba nd(

28、u nsig ned int *buffer, i nt sSBLIMIT , int k)static int off2;int y64,s1,s2;int i,j;/* 用新的 32個樣本數(shù)據(jù)替換舊的樣本數(shù)據(jù) */if(config.mpeg.channels = 1)for (i=15;i=0;i-)xk(2*i)+offk+1 = (*buffer) 16) 16;/* 平移樣本到合適的窗口位置 */for (i=HAN_SIZE; i-; )zi = mul(xk(i+offk)&(HAN_SIZE-1),ewi);offk = (offk + 480) & (HAN_SIZE-1)

29、; /* offset is modulo (HAN_SIZE)*/* 子窗口的數(shù)據(jù)樣本 */for (i=64; i-; )for (j=8, yi = 0; j-; )yi += zi+(j6);/* 結(jié)合子樣本用于簡單矩陣計算 */for (i=0; i16; i+)yi+17 += y15-i;for (i=0; i15; i+)yi+33 -= y63-i;/* 簡化的多相濾波器矩陣乘法 */for (i=16; i-; )for (j=0, si= 0, s31-i=0; j32; j += 2)s1 = mul(flij,yj+16);s2 = mul(flij+1,yj+17)

30、;si += s1 + s2;s31-i += s1 - s2;混合多相 MDCT(Modified Discrete Cosine Transform 修飾離散余弦變換 )MDCT有18個通道,將分成的32個子帶信號進(jìn)一步細(xì)分,產(chǎn)生32*18=576的頻線輸出。 MDCT的特點(diǎn)是即使不經(jīng)量化也不會產(chǎn)生失真;將子帶的信號進(jìn)一步細(xì)分到頻譜上,便于提供較好的分析和效果;在編碼時,能消除多相濾波器組產(chǎn)生的疊頻效應(yīng),增加解壓后 的復(fù)原效果。void L3_mdct_sub(int sb_sample2318SBLIMIT,int mdct 22samp_per_frame2)int (*mdct_en

31、c)18;int ch,gr,band,j,k;int mdct_in36;int bu,bd,*m;for(gr=0; grconfig.mpeg.granules; gr+)for(ch=config.mpeg.channels; ch-; )/* set up pointer to the part of mdct_freq were using */ mdct_enc = (int (*)18) mdct_freqgrch;/* Compensate for inversion in the analysis filter*/ for(band=1; band=31; band+=2

32、) for(k=1; k=17; k+=2 )sb_samplechgr+1kband *= -1;/* Perform imdct of 18 previous subband samples+18 current subband samples */ for(band=32; band-; )for(k=18; k-; )mdct_ink= sb_samplech gr kband;mdct_ink+18 = sb_samplechgr+1kband;/* Calculation of the MDCTfor(k=18; k-; )m = &mdct_encbandk;for(j=36,

33、*m=0; j-; )*m += mul(mdct_inj,cos_lkj);/* Perform aliasing reduction butterfly */for(band=31; band-; )for(k=8; k-; )bu = muls(mdct_encband17-k,csk) + muls(mdct_encband+1k,cak); bd = muls(mdct_encband+1k,csk) - muls(mdct_encband17-k,cak); mdct_encband17-k = bu;mdct_encband+1k = bd;/* Save latest gran

34、ules subband samples to be used in the next mdct call */ for(ch=config.mpeg.channels ;ch-; )for(j=18; j-; ) for(band=32; band-; )sb_samplech0jband = sb_samplechconfig.mpeg.granulesjband;3)失真控制環(huán)對MDCT輸出的信號,經(jīng)過失真控制環(huán)和量化率控制環(huán),即量化器的處理,最終實(shí) 現(xiàn)對信號進(jìn)行量化。void L3_iteration_loop(intmdct_freq_org22samp_per_frame2,L3_

35、side_info_t *side_info,intl3_enc22samp_per_frame2,intmean_bits)/* calculate reservoir at the frame start */reservoir = main_data_begin main_data_begin = main_data_begin; /* set next frames back pointer */for(gr=0; grgrgr.chch.tt;/* calculate absolute and maximum */ for (i=cutoff, xrmax=0; i-;) if(xr

36、max 1; /* simple scheme, give half each time */ reservoir -= extra_bits;max_bits = mean_bits + extra_bits; if(max_bits PART_2_3_LIMIT) reservoir += max_bits - PART_2_3_LIMIT; max_bits = PART_2_3_LIMIT;/* quantize the spectrum unless all spectral values zero */ if(xrmax)gi-part2_3_length = inner_loop

37、(ix, max_bits, gi);reservoir += max_bits - gi-part2_3_length; /* adjust for unused bits */ gi-global_gain = gi-quantizerStepSize + 89;/* restore sign of quantized spectral values */for ( i = 0; i cutoff; i+ ) if (xri config.mpeg.resv_limit) resv_max = config.mpeg.resv_limit;else if(resv_max 0) resv_

38、max = 0;main_data_begin = (reservoir 3) : (resv_max 3); extra_bits = reservoir - (main_data_begin resv_drain = extra_bits; /* remaining bits to ancillary data */H uffman 編碼量化好的數(shù)據(jù)變成一連串的系數(shù),由霍夫曼編碼(Huffman code)做最后壓縮處理?;舴蚵幋a是將比較常見的字符用特定的符號表示, 壓縮后得到一個記錄每個符號代表的 字符串的編碼表以及一連串由符號組成的信息內(nèi)容, 使用霍夫曼編碼可以節(jié)約 20 %的空 間

39、。static int encodeMainData(int l3_enc22samp_per_frame2,L3_side_info_t *si)int gr, ch;bits = 0;by = 0;bi = 8; main_0=0;/* Huffmancodes plus reservoir stuffing */for(gr = 0; gr config.mpeg.granules; gr+) for (ch = 0; ch grgr.chch.tt ); /* encode spectrum */ /* ancillary data, used for reservoir stuffi

40、ng overflow */ if(si-resv_drain)int words = si-resv_drain 5;int remainder = si-resv_drain & 31;/* pad with zeros */ while(words-) putbits(main_, 0, 32 );if(remainder) putbits(main_, 0, remainder );return bits 3;編碼 MP3 幀頭與邊信息每個Frame都有一個幀頭Frameheade,長度4Byte 32bit。頭部最前面的11位總是 被設(shè)置為1 并稱它為“幀同步” .static vo

41、id encodeSideInfo( L3_side_info_t *si )int gr, ch, region;unsigned char * sf = fifowr.side;/* header */*sf = header0;*(sf+1) = header1;*(sf+2) = header2 | (config.mpeg.padding main_data_begin, 9 );putbits(sf, 0, ( config.mpeg.channels = 2 ) ? 3 : 5 ); /* private bits */ for ( ch = 0; ch config.mpeg.

42、channels; ch+ )putbits(sf, 0, 4 ); /* scfsi */for ( gr = 0; gr 2; gr+ )for ( ch = 0; ch grgr.chch.tt); TOC o 1-5 h z putbits(sf, gi-part2_3_length,12 );putbits(sf, gi-big_values,9 );putbits(sf, gi-global_gain,8 );putbits(sf, 0, 5 ); /* scalefac_compress, window switching flag */ for ( region = 0; re

43、gion table_selectregion, 5 ); putbits(sf, gi-region0_count,4 );putbits(sf, gi-region1_count,3 );putbits(sf, 0, 2 ); /* preflag, scalefac_scale */ putbits(sf, gi-count1table_select, 1 ); fifowr.fr_len = (config.mpeg.bits_per_frame - bits) 3;fifowr.si_len = bits 3;/* bytes in side info */if(+wr = FIFO

44、_SIZE) wr = 0; /* point to next buffer */六、實(shí)驗(yàn)結(jié)果分析本實(shí)驗(yàn)中壓縮原始音頻數(shù)據(jù)為: Matlab 錄制的單聲道、 44.1KHz 采樣率、 16 位量化 精度的WAV音頻信號,大小為862KB ,時間為10秒鐘。然后分別利用Matlab、VS2013 和DSP(CCS5.5)對音頻信號進(jìn)行壓縮,最后保存為 mp3格式音頻文件。音質(zhì)采用兩種方式Matlab語言和C語言進(jìn)行音頻壓縮,都能夠保存音頻中原有的語 音信息,且去除一定的噪聲,即兩種壓縮方式在音質(zhì)方面,效果相當(dāng)。壓縮時間比較兩種音頻壓縮方式,壓縮10秒鐘,441000個采樣數(shù)據(jù)。在Matlab中,

45、壓縮花 費(fèi)的時間為12s;在VS2010C程序中,壓縮花費(fèi)的時間為 12s;而在CCS5.5C 程序中,壓縮花費(fèi)的時間為 25分鐘 s。由此可得出本程序中C編寫的MP3壓縮算法VS2013與Matlab中編寫的算法壓 縮時間相當(dāng),而在CCS中壓縮的時間很長暫時沒有明白為什么。( 3) 壓縮比采用兩種音頻壓縮方式,對 10 秒音頻數(shù)據(jù)進(jìn)行壓縮。在 Matlab 中,壓縮后的音頻 大小為79KB。在VS2010和CCS5.5中,壓縮后的音頻大小為??芍涸谌N編譯器中 編寫的音頻MP3壓縮算法都到達(dá)了標(biāo)準(zhǔn)的 MP3算法要求。七、實(shí)驗(yàn)感悟本次實(shí)驗(yàn)雖然經(jīng)歷了各種心酸,也遇到過各種困難,但在幾個禮拜的努

46、力下,最終 還是在CCS5.5中完成了 MP3語音信號的壓縮。通過此次實(shí)驗(yàn),我真實(shí)的感受到自己以 前知道的知識太少,熟悉的軟件不多,該學(xué)的東西太多太多。在本次實(shí)驗(yàn)中,我使用到 的軟件主要有:VS2013、Matlab R2010a和CCS5.5(其中我前面還分別嘗試了 C5000和 CSS3.3版本),編程的主要語言是 C語言和Matlab語言。做完實(shí)驗(yàn),回憶前面的歷程,總結(jié)遇到的困難有:1、對音頻知識了解不夠,不知如何下手不知道單通道、 44.4KHz 采樣率、 16位量化的語音錄制方法,最初采用語音錄制軟 件實(shí)現(xiàn),后利用 Matlab 函數(shù)實(shí)現(xiàn)。不知道將采樣好的數(shù)據(jù)保存何種格式,然后又是如何導(dǎo)入到CCS工程當(dāng)中。不知道 WAV、 MP3 和 PCM 語音信號的格式,無法進(jìn)行語音處理。2、不會CCS,導(dǎo)致程序由VS2013移植到CCS中屢屢受挫1開始時,自己網(wǎng)上找資料,選取 C5000作為開發(fā)軟件資料齊全,并學(xué)會將 Matlab數(shù)據(jù)通過I/O文件讀取方式導(dǎo)入C5000中、波形繪制、軟

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論