将ADC的值编码成可播放的WAV

记录一些基础知识和原理

声音

声音(sound)是由物体振动产生的声波,作为一种波,频率在20Hz~20kHz之间的声音是可以被人耳识别的。

语音编码

原理

有一定电子基础的都知道传感器采集音频信号是模拟量,而我们实际传输过程中使用的是数字量。而这就涉及到模拟转数字的过程。 而模拟信号数字化必须经过三个过程,即抽样、量化和编码,以实现话音数字化的脉冲编码调制(PCM,Pulse Coding Modulation)技术。

抽样(Sampling)

抽样是把模拟信号以其信号带宽2倍以上的频率提取样值,变为在时间轴上离散的抽样信号的过程。

采样率 (sample)

每秒从连续信号中提取并组成离散信号的采样个数,用赫兹(Hz)来表示。

量化(quantizing)

抽样信号虽然是时间轴上离散的信号,但仍然是模拟信号,其样值在一定的取值范围内,可有无限多个值。 显然,对无限个样值一一给出数字码组来对应是不可能的。为了实现以数字码表示样值,必须采用“四舍五入”的方法把样值分级“取整”,使一定取值范围内的样值由无限多个值变为有限个值。 这一过程称为量化。

量化噪音

量化后的抽样信号与量化前的抽样信号相比较,当然有所失真,且不再是模拟信号。 这种量化失真在接收端还原模拟信号时表现为噪声,并称为量化噪声。 量化噪声的大小取决于把样值分级“取整”的方式,分的级数越多,即量化级差或间隔越小,量化噪声也越小。

采样位数

指的是描述数字信号所使用的位数。 8位(8bit)代表2的8次方=256,16 位(16bit)则代表2的16次方=65536; 采样位数越高,精度越高。

编码(Coding)

量化后的抽样信号就转化为按抽样时序排列的一串十进制数字码流,即十进制数字信号。 简单高效的数据系统是二进制码系统,因此,应将十进制数字代码变换成二进制编码。 根据十进制数字代码的总个数,可以确定所需二进制编码的位数,即字长(采样位数)。 这种把量化的抽样信号变换成给定字长的二进制码流的 过程称为编码。

一些概念

采样频率

人对频率的识别范围是 20HZ - 20000HZ, 如果每秒钟能对声音做 20000 个采样, 回放时就足可以满足人耳的需求。

  • 8000hz 为电话采样。
  • 22050 的采样频率是常用的。
  • 44100已是CD音质, 超过48000的采样对人耳已经没有意义。

    采样位数

    每个采样数据记录的是振幅, 采样精度取决于储存空间(采样位数)的大小。

  • 1 字节(也就是8bit) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级。
  • 2 字节(也就是16bit) 可以细到 65536 个数, 这已是 CD 标准了。
  • 4 字节(也就是32bit) 能把振幅细分到 4294967296 个等级, 实在是没必要了。 如果是双声道(stereo), 采样就是双份的, 文件也差不多要大一倍。

    比特率

    码率,是指经过编码后的音频数据每秒钟需要用多少个比特来表示。

    有损和无损

    对于我们最常说的“无损音频”来说,一般都是指传统CD格式中的16bit/44.1kHz采样率的文件格式。 而之所以称为无损压缩,也是因为其包含了20Hz-22.05kHz这个完全覆盖人耳可闻范围的频响频率而得名。

    PCM 音频编码

    PCM信号未经过任何编码和压缩处理(无损压缩)。 与模拟信号比,它不易受传送系统的杂波及失真的影响。动态范围宽,可得到音质相当好的效果。编码上采用A律13折线编码。

    A律13折线

    A律是PCM非均匀量化中的一种对数压扩形式。数字脉冲编码调制(PCM)是目前模拟信号数字化的基本方法,PCM包括采样、量化、编码三个步骤。 其中量化是对抽样值的取值离散,根据量化间隔的不同选取分为均匀量化和非均匀量化,非均匀量化可以有效地改善信号的量化信噪比。 语音信号的量化常采用ITU建议的两种对数形式的非均匀量化压缩特性:A律和μ律,A律编码主要用于30/32路一次群系统, A律PCM用于欧洲和中国。

    声道

    声道可以分为单声道和立体声(双声道)。PCM的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。

首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。 image

总结

通过ADC读取16位的一个字节数据,以小段模式单声道存储,最后加上wav头就可以播放。

STM32为12位ADC

读取到的数据需要经过转换。 设x为读到的数据。将其转换为16位数据。

x/2^12*2^16(未化简)

例子代码的wav头(未验证)