雖然自己是搞視頻圖像的,不過偶爾看看音頻方面的資料也是可以調節一下的。
下面就來分析一下wav波形文件的格式。
我們先隨便找一個wav文件,查看其屬性,就能得到下面的結果。
上面主要注意文件大小,聲音長度與比特率。
文件占用空間就不用關心了,如果有人想知道為什么文件占用空間比文件大小要大,我在這里也解釋一下。這和文件在硬盤中的組織方式有關系,這里的硬盤分區是以最小4096Byte為單位的,我文件的大小是1325044Byte,那么1325044/4096=323.49,為了能把文件對齊的放到硬盤中,所以占用的空間就要是324*4096=1327104Byte了,所以占用的空間就是這么多了。你也可以建立一個只寫一個字母的txt文件試試,文件大小雖然為1Byte,不過占用空間也為4096Byte。
上面說的當然和wav文件沒什么關系,下面就正式說wav文件的問題。
用ultraedit打開就是下面這個樣子:
用表格說明一下文件的格式:
起始地址 |
占用空間 |
本地址數字的含義 |
00H |
4byte |
RIFF,資源交換文件標志。 |
04H |
4byte |
從下一個地址開始到文件尾的總字節數。高位字節在后面,這里就是001437ECH,換成十進制是1325036byte,算上這之前的8byte就正好1325044byte了。 |
08H |
4byte |
WAVE,代表wav文件格式。 |
0CH |
4byte |
FMT ,波形格式標志 |
10H |
4byte |
00000010H,16PCM,我的理解是用16bit的數據表示一個量化結果。 |
14H |
2byte |
為1時表示線性PCM編碼,大於1時表示有壓縮的編碼。這里是0001H。 |
16H |
2byte |
1為單聲道,2為雙聲道,這里是0001H。 |
18H |
4byte |
采樣頻率,這里是00002B11H,也就是11025Hz。 |
1CH |
4byte |
Byte率=采樣頻率*音頻通道數*每次采樣得到的樣本位數/8,00005622H,也就是22050Byte/s=11025*1*16/2。 |
20H |
2byte |
塊對齊=通道數*每次采樣得到的樣本位數/8,0002H,也就是2=1*16/8。 |
22H |
2byte |
樣本數據位數,0010H即16,一個量化樣本占2byte。 |
24H |
4byte |
data,一個標志而已。 |
28H |
4byte |
Wav文件實際音頻數據所占的大小,這里是001437C8H即1325000,再加上2CH就正好是1325044,整個文件的大小。 |
2CH |
不定 |
量化數據。 |
注意屬性中的比特率是176kbps,而1CH中為22050Byte/s,換算一下就會發現22050*8/1024並不等於176,而是等於172,這里我想可能是通信中的1K並不等於1024而是等於1000的原因(通信原理書中好像有),如果按22050*8/1000這樣算,就正好等於176了。其實比特率也可以這樣算,總字節除以時長得到每秒字節率,再乘以8除以1000就得到比特率了,即(1325000/60)*8/1000=176kbps。
最后是量化數據的表示。
看數據結尾的表示吧,我這音頻最初那一段都是0,不好解釋。
Ultraedit中的表示:
Matlab中的表示:
上面的matlab是662500個數,正好也是11325000的一半。可以看出數據是有正有負的浮點數,為正負雙向PCM量化編碼,得到的十六進制位的最高位是一個符號位,為0表示正數,為1表示負數,正好表示-32768~32767。而且十六進制的數據正數要除以32767,負數要除以32768才能得到結果,如果是單向PCM就要除以65535了。
比如最后一位十六進制為2710H,在Matlab中為0.3052,而2710H的十進制10000除以32767正好近似為0.3052。
再比如matlab中662472這個數為-0.0206,考慮到44位的偏差,在ultraedit中為1437BAH位上的FD5DH,表示為十進制-675除以32768正好近似為-0.0206。
當然,上面只是針對matlab和ultraedit中的數據進行具體的分析,真正編程處理時還是要根據情況有所不同的。量化位數的不同,32bit或是8bit處理又不同了。符號的表示也可能不同,原碼補碼反碼等等的知識可能也要用到。
有機會自己也會編程實踐一下。
注:相應代碼請看這篇文章:http://www.cnblogs.com/tiandsp/archive/2012/10/18/2730022.html