从ADC样本到C中的.WAV文件

时间:2015-01-19 12:28:49

标签: c microcontroller wav

我正在通过微控制器制作一个关于数字录音机的项目。我想存储从麦克风录制的语音并构建.WAV文件。我有来自ADC的捕获语音样本,我只知道WAV文件的结构(来自这个image),但我不知道其他任何内容。你能帮助我,给我一些关于这种文件类型构建过程的信息吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

现在我可以解释一下我是如何制作代码的。也许对于某些人来说,这个解释的一小部分可能会造成多余的,但我想清楚地说出我不理解的每一个传递。

首先,我想解释一下非常单一的.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中实现它非常简单。