WAV是由微软开发的一种音频格式。WAV符合 PIFF Resource Interchange File Format规范。WAV文件本身由三个“块”信息组成:将文件标识为WAV文件的RIFF块,识别采样率等参数的FORMAT块和包含实际数据(样本)的DATA块。
WAV文件格式说明
采样率:声音信号在“模数转换”过程中单位时间内采样的次数。
单声道:11.025 KHz 采样值,8 Bits 采样值(0x00 - 0xFF)。
双声道:44.1 KHz 采样值,16 Bits 采样值。高八位表示左声道,低八位表示右声道。
例如,这里是WAVE文件的72字节,字节显示为十六进制数:
52 49 46 46 24 08 00 00 57 41 56 45 66 6d 74 20 10 00 00 00 01 00 02 00
22 56 00 00 88 58 01 00 04 00 10 00 64 61 74 61 00 08 00 00 00 00 00 00
24 17 1e f3 3c 13 3c 14 16 f9 18 f9 34 e7 23 a6 3c f2 24 f2 11 ce 1a 0d
说明:
1. WAVE数据文件的默认字节排序是小端。 文件使用大端字节排序编写的标识符为RIFX而不是RIFF;
2. 样本数据必须以偶数字节边界结束;
3. 8位采样存储为无符号整数,范围为0到255.;16位采样存储为有符号整数,范围从-32768到32767;
4.RIFF代表资源交换文件格式;
5.wave数据流中可能包含其他字块。
WAV文件可能是存储音频的最简单的通用格式。 与MPEG和其他压缩格式不同,WAV存储样本“原始”,无需预处理和数据格式化。在解释WAVE文件时,所使用的测量单位是“样本”。一个样本表示在单个采样周期中捕获的数据。所以,如果你采样率44 KHz,你将有44 K样本。每个样本可以表示为8位,16位,24位或32位。 (除了必须是8的倍数之外,对于样本使用的位数没有限制)。在某种程度上,样本中的位数越多,音频的质量越好。
8位采样被表示为“无符号”值,而16位和更高的位数是由“有符号”值表示的。每个样本的数据位应为左对齐,并用0填充。 例如,考虑10位样本的情况(由于样本必须是8的倍数,我们需要将其表示为16位)。 这些10位应该是左对齐的,以使它们成为第6到15位,其中位0到5应该被设置为零。
处理立体声音频,3D音频等时,实际上是处理多个频道,这意味着在任何给定的时间内对多个样本进行描述。例如,对于立体声音频,在任何给定的时间点,需要知道左声道和右声道的音频信号。所以,一次只能读写两个样本。在44 KHz采样立体声音频;那么将有44 K * 2样本。如果使用16位每个样本,则给定音频的持续时间,您可以计算波形文件的总大小(字节)为=采样率*通道数*(每采样数/ 8)*持续时间(秒);每秒采样数=采样率*通道数;
当处理这种多通道声音时,来自每个通道的单个采样点被交错。先存储左声道的第一个样本。然后,您将存储右声道的第一个样本,依此类推。
使用C ++来管理wave文件。首先为波形文件的不同块布置结构。
第一个块是riff头块
struct RIFF_HEADER
{
TCHAR szRiffID[4]; // 'R','I','F','F'
DWORD dwRiffSize;
TCHAR szRiffFormat[4]; // 'W','A','V','E'
};
第二块是fmt块。 它描述了波形文件的属性,例如每个样本的位数,通道数等。
struct WAVE_FORMAT
{
WORD wFormatTag;
WORD wChannels;
DWORD dwSamplesPerSec;
DWORD dwAvgBytesPerSec;
WORD wBlockAlign;
WORD wBitsPerSample;
};
struct FMT_BLOCK
{
TCHAR szFmtID[4]; // 'f','m','t',' ' please note the
// space character at the fourth location.
DWORD dwFmtSize;
WAVE_FORMAT wavFormat;
};
第三个是data块。
struct DATA_BLOCK
{
TCHAR szDataID[4]; // 'd','a','t','a'
DWORD dwDataSize;
};
当然,你可以有很多可选的块(它们应该在数据块之前,在fmt块之后)。 作为一个例子,这里是一个可选的块,你可以使用:注释块,用于存储有关wave数据的“注释”。
struct NOTE_CHUNK
{
TCHAR ID[4]; // 'note'
long chunkSize;
long dwIdentifier;
TCHAR dwText[];
};
WAV文件常见的音频压缩方法
1. PCM/uncompressed
脉码调制信号。是模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志。PCM的采样精度从14bit发展到16bit、18bit、20bit直到24bit;采样频率从44.1kHz发展到192kHz。
2. Microsoft ADPCM
自适应差分脉码调制信号。是一种数据压缩算法,该算法利用了语音信号样点间的相关性,并针对语音信号的非平稳特点,使用了自适应预测和自适应量化。即对不同水平的差分序列,用一个相应参数delta作为平稳化参数去除差分序列的幅值,使得差分编码自动的适应数据间大幅度的跳跃。
3. ITU G.711 a-law [3]
G.711标准也是PCM码的一种。是国际电报联盟(International Telegraph Union, ITU)订定出来的一套语音压缩标准,主要用于电话。它主要用脉冲编码调制对音频采样,采样率为8kHz。它利用一个 64kbit/s 未压缩通道传输语音讯号。起压缩率为1:2,即把16位数据压缩成8位。G.711是主流的波形声音编解码器。
G.711 标准下主要有两种压缩算法。一种是?μ-law algorithm (又称μ-law),主要运用于北美和日本;另一种就是a-law algorithm,主要运用于欧洲和世界其他地区。其中,a-law是特别设计用来方便计算机处理的。
4. ITU G.711 µ-law
G.711标准下的另一种压缩算法,主要运用于北美和日本,美国电话格式(CCITT G.711)就采用这种算法。
5. IMA ADPCM
IMA是ADPCM中使用较多的一种算法。该算法中对量化步长的调整使用了简单的查表方法,对于一个输入的PCM值X(n),将其与前一时刻的X(n-1)预测值做差值得到d(n),然后根据当前的量化步长对d(n)进行编码,再用此sample点的编码值调整量化步长,同时还要得到当前sample点的预测值供下一sample点编码使用。通过此算法可将样点编码成4bit的码流,一个符号位和三个幅度位。该算法较简单,通过查表简化了运算。编码后采用WAV文件格式,对编码后的数据流进行了包装,由文件头和数据码流组成,文件头和标准WAV格式文件一样,指出了音频数据所采用格式、采样率、比特率、块长度、比特数及声道数等信息。数据码流以块为单位,块头指出了该块起始的预测值和index值,码流中每byte的高四位和低四位分别对应一个PCM。当前该算法以其简单实用的特点广泛应用到数字音乐盒和数字录音笔中。
6. ITU G.723 ADPCM (Yamaha)
G.723是ITU在1996年制订成型的一种多媒体语音编解码标准。其典型应用包括VoIP服务、H.324视频电话、无线电话、数字卫星系统、数电倍增设备(DCME)、公共交换电话网(PSTN)、ISDN及各种多媒体语音信息产品。
7. GSM 6.10 [4]
是我们熟知的全球移动通讯系统(Global System for Mobile communications)定义的一种音频编解码标准。广泛应用于无线通信设备如手机、无线通讯终端中。
8. ITU G.721 ADPCM [5]
G.721是ITU-T定义的一组标准协议组G.7xx其中之一,指的是32kbit/s的自适应差分脉冲编码调制(ADPCM)。除去上面介绍的三种,此协议组的其他码流标准如下:
G.722 ―― 64 kb/s 下的 7 kHz 音频编码
G.722.1 ――带有低帧损耗的具有免提操作的系统在24kbit/s和32kbit/s上的编码
G.722.2 ――利用自适应多频率宽带(AMR-WB)以16kbit/s多频率语音编码
G.726 ―― 40, 32, 24, 16kbit/s自适应差分脉冲编码调制(ADPCM)
G.727 ―― 5, 4, 3和2bit/s嵌入式自适应差分脉冲编码调制(ADPCM)
G.728 ――利用低延迟代码线性预测以16 bit/s 进行语音编码
G.729 ――利用共扼结构-代数激励编码线性预测(CS-ACELP)以8bit/s进行语音编码
9. MPEG
Moving Pictures Experts Group,动态图像专家组。MPEG标准的视频压缩编码技术主要利用了具有运动补偿的帧间压缩编码技术以减小时间冗余度,利用DCT技术以减小图像的空间冗余度,利用熵编码则在信息表示方面减小了统计冗余度。这几种技术的综合运用,大大增强了压缩性能。
10. Experimental
称为实验性音频。专门用来作音频信号处理的研究开发工作,主要包括优化压缩算法提高压缩效率的工作。这种类型的压缩码流基本不被主流解码器支持,只在一些音频专家和发烧友的实验室里能够流畅的播放出来。
Compression code信息在WAV文件字段的第21、22个byte,通过十六进制查看器我们可以看到一个WAV文件的压缩码类型。对应关系如下表:
Code Description
0 (0x0000) Unknown
1 (0x0001) PCM/uncompressed
2 (0x0002) Microsoft ADPCM
6 (0x0006) ITU G.711 a-law
7 (0x0007) ITU G.711 µ-law
17 (0x0011) IMA ADPCM
20 (0x0016) ITU G.723 ADPCM (Yamaha)
49 (0x0031) GSM 6.10
64 (0x0040) ITU G.721 ADPCM
80 (0x0050) MPEG
65,536 (0xFFFF) Experimental
参考网址:http://csserver.evansville.edu/~blandfor/EE356/WavFormatDocs.pdf