现在我可以解释一下我是如何制作代码的。也许对于某些人来说,这个解释的一小部分可能会造成多余的,但我想清楚地说出我不理解的每一个传递。
首先,我想解释一下非常单一的.wav文件,在我向上发布的图片中提到。
- 第一个段ChunkID只是一个char矢量“RIFF”。
- 第二个段ChunkSize是从这一点到文件末尾的大小;因为前2个段是8个字节,这个段的值很简单,文件的总大小(以字节为单位) - 8个字节。请注意,在变量时间记录中,此值目前尚不清楚,因此第一次用偶然值填充,并且在记录结束时,当文件的总大小已知时,它将填充正确值。
- 段格式是字符向量“WAVE”。
- 段Subchunk1D是char矢量“fmt”(将注意力放在最后的空间)。
- 段subchunk1size为16(十进制值)。
- AudioFormat段是2字节,在我的情况下是PCM的1。
- NumChannel段为2字节,单声道的值为1,立体声的值为2。
- SampleRate段是以Hz为单位的采样频率(例如44100)。
- ByteRate段由ByteRate = SampleRate * BlockAlign给出。
- BlockAlign段由BlockAlign = NumChannels * BitPerSample / 8提供。
- BitPerSample段是组成每个样本的位数。在我的10位ADC的情况下,我将此值转换为8位,丢失了不太重要的2位。
- Subchunk2ID段是char矢量“data”。
- Subchunk2Size段包含所获取数据的整个大小(sampples),因此它是文件的整个大小--44,因为44是从开始到此点的字节数。计算此值的另一种方法是:Subchunk2Size = NumSample * BlockAlign。在任何情况下,此段目前都不知道,并且为了计算它需要记录结束。
- 最后一段数据是包含样本的向量。唯一没有固定维度(当然)。
所描述的每个分段都是连续的,没有任何分隔符的性别,因为分隔符在每个分段的维度中是内在的。
如果每个段都有很好的描述,那么在C中实现它非常简单。