欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

wav格式

程序员文章站 2022-07-13 14:41:17
...

WAV 即 WAVE 文件,WAV 是计算机领域最常用的数字化声音文件格式之一,它是微软专门为 Windows 系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。它符合 RIFF(Resource Interchange File Format)文件规范,用于保存 Windows 平台的音频信息资源,被 Windows 平台及其应用程序所广泛支持,该格式也支持 MSADPCM,CCITT A LAW 等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的 WAV 文件和 CD 格式一样,也是 44.1K 的取样频率,16 位量化数字,因此在声音文件质量和 CD 相差无几!

WAV 一般采用线性 PCM(脉冲编码调制)编码,本章,我们也主要讨论 PCM 的播放,因为这个最简单。

WAV 是由若干个 Chunk 组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk、Format Chunk、 Fact Chunk(可选)和 Data Chunk。每个 Chunk 由块标识符、数据大小和数据三部分组成,如图 48.1.1.1 所示:
wav格式
其中块标识符由 4 个 ASCII 码构成,数据大小则标出紧跟其后的数据的长度(单位为字节),注意这个长度不包含块标识符和数据大小的长度,即不包含最前面的 8 个字节。所以实际 Chunk的大小为数据大小加 8。

首先,我们来看看 RIFF 块(RIFF WAVE Chunk),该块以“RIFF”作为标示,紧跟 wav文件大小(该大小是 wav 文件的总大小-8),然后数据段为“WAVE”,表示是 wav 文件。RIFF块的 Chunk 结构如下:

//RIFF 块
typedef __packed struct
{
u32 ChunkID; //chunk id;这里固定为"RIFF",即 0X46464952
u32 ChunkSize ;  //集合大小;文件总大小-8
u32 Format;  //格式;WAVE,即 0X45564157
}ChunkRIFF ;

接着,我们看看 Format 块(Format Chunk),该块以“fmt ”作为标示(注意有个空格!),一般情况下,该段的大小为 16 个字节,但是有些软件生成的 wav 格式,该部分可能有 18 个字节,含有 2 个字节的附加信息。Format 块的 Chunk 结构如下:

//fmt 块
typedef __packed struct
{
u32 ChunkID; //chunk id;这里固定为"fmt ",即 0X20746D66
u32 ChunkSize ;  //子集合大小(不包括 ID 和 Size);这里为:20.
u16 AudioFormat; //音频格式;0X10,表示线性 PCM;0X11 表示 IMA ADPCM
u16 NumOfChannels;  //通道数量;1,表示单声道;2,表示双声道;
u32 SampleRate;  //采样率;0X1F40,表示 8Khz
u32 ByteRate; //字节速率;
u16 BlockAlign;  //块对齐(字节);
u16 BitsPerSample; //单个采样数据大小;4 位 ADPCM,设置为 4
}ChunkFMT;

接下来,我们再看看 Fact 块(Fact Chunk),该块为可选块,以“fact”作为标示,不是每个 WAV 文件都有,在非 PCM 格式的文件中,一般会在 Format 结构后面加入一个 Fact 块,该块 Chunk 结构如下:

//fact 块
typedef __packed struct
{
u32 ChunkID; //chunk id;这里固定为"fact",即 0X74636166;
u32 ChunkSize ;  //子集合大小(不包括 ID 和 Size);这里为:4.
u32 DataFactSize; //数据转换为 PCM 格式后的大小
}ChunkFACT;

DataFactSize 是这个 Chunk 中最重要的数据,如果这是某种压缩格式的声音文件,那么从这里就可以知道他解压缩后的大小。对于解压时的计算会有很大的好处!不过本章我们使用的是 PCM 格式,所以不存在这个块。

最后,我们来看看数据块(Data Chunk),该块是真正保存 wav 数据的地方,以“data”作为该 Chunk 的标示,然后是数据的大小。数据块的 Chunk 结构如下:

//data 块
typedef __packed struct
{
u32 ChunkID; //chunk id;这里固定为"data",即 0X61746164
u32 ChunkSize ;  //子集合大小(不包括 ID 和 Size);文件大小-60.
}ChunkDATA;

ChunkSize 后紧接着就是 wav 数据。根据 Format Chunk 中的声道数以及采样 bit 数,wav数据的 bit 位置可以分成如表 48.1.1.1 所示的几种形式:
wav格式
wav格式
我们播放的音频支持:16 位和 24 位,立体声,所以每个取样为 4/6 个字节,低字节在前,高字节在后。在得到这些 wav 数据以后,通过 I2S 丢给 WM8978,就可以欣赏音乐了。

相关标签: 语音识别

上一篇: HMM+GMM语音识别

下一篇: fst-graph