文章目录

  • 音频
  • 基本概念
  • 模拟信号
  • 采样
  • 采样频率(sample rate)
  • 采样位数
  • 声道数 (channels)
  • 比特率(bit rate)
  • 量化
  • 编码
  • 数字信号
  • PCM ⾳频数据


音频

声⾳是由物体振动引起大气压强变化产⽣的波,是⼀种机械波。

⾳频录制(麦克风 microphone)过程是模数转换过程: Analog->Digital,即 ADC。

音频播放(扬声器 speaker)过程是数模转换过程: Digital -> Analog,即 DAC。

基本概念

音频模数转换过程中大致可分为以下几个模块

  • 模拟信号
  • 采样
  • 量化
  • 编码
  • 数字信号

java 采集扬声器声音 扬声器采样频率_java 采集扬声器声音

模拟信号

时域连续的模拟信号

java 采集扬声器声音 扬声器采样频率_audio_02

采样

对模拟信号隔⼀定的时间间隔取⼀个点。

java 采集扬声器声音 扬声器采样频率_audio_03

采样频率(sample rate)

所谓采样就是在时间轴上对模拟信号进⾏数字化,根据奈奎斯特定理(采样定理),按照⽐待采样信号最⾼频率 2 倍以上的频率进⾏采样(AD 转换)。频率在 20 Hz ~ 20 kHz 之间的声⾳是可以被⼈⽿识别的。所以采样频率⼀般为 40kHz 左右,常⽤的⾳乐为 44.1kHz(44100 次/s 采样)、48kHz(48000 次/s 采样) 等。

采样位数

采样位数是指每个采样点能够表⽰的数据范围(纵坐标范围)。

把数据存储成二进制,意味着如果用 n 个二进制位来存储每个幅度值,总共可以表示的数值数量为 java 采集扬声器声音 扬声器采样频率_audio_04

  • 1 bit 代表的采样值大小为 java 采集扬声器声音 扬声器采样频率_audio_05,采样点数据取值范围就是 0,1。
  • java 采集扬声器声音 扬声器采样频率_比特率_06

  • 2 bit 代表的采样值大小为 java 采集扬声器声音 扬声器采样频率_音频_07,采样点数据取值范围就是 java 采集扬声器声音 扬声器采样频率_比特率_08
  • java 采集扬声器声音 扬声器采样频率_i2s_09

  • 4 bit 代表的采样值大小为 java 采集扬声器声音 扬声器采样频率_audio_10,采样点数据取值范围就是 java 采集扬声器声音 扬声器采样频率_java 采集扬声器声音_11

java 采集扬声器声音 扬声器采样频率_音频_12

  • 16 bit 代表的采样值大小为 java 采集扬声器声音 扬声器采样频率_比特率_13,采样点数据取值范围就是 java 采集扬声器声音 扬声器采样频率_比特率_14

    位数越多,表示得就越精细,声音质量自然就越好,而数据量也会成倍增大。16 bit 是较为常⻅的采样位数。

根据 理解 dB,文章中提到的 dBFS 计算公式

采样位数为 16bits 时候,最大能表示的值为 65535, dBFS 的计算公式为:
java 采集扬声器声音 扬声器采样频率_比特率_15
这样,最小的 java 采集扬声器声音 扬声器采样频率_java 采集扬声器声音_16。也就是说 16 位无符号音频的动态范围是 0~-96dBFS

声道数 (channels)

声道数是指⽀持能不同发声的⾳响的个数,常⽤的声道数有单声道 mono,⽴体声 stereo(左声道和右声道)。立体声比单声道的表现力丰富,但是数据量也会翻倍

比特率(bit rate)

比特率,也叫码率,是指在一个数据流中每秒钟能通过的信息量,也可以理解为:每秒钟用多少比特的数据量去表示。原则上,音频位速越高质量越好。单位常为 kbps(kilo bits pre second)。音频数据的比特率文件大小计算公式如下:

bit rate = sample rate * bit depth * channels

例如,音频的相关参数为,采样位宽 16bit,采样率 44100Hz,声道数 2,则该段音频的数据⽐特率则为:44100 * 16 * 2 = 1411.2 kbps

所以,sample rate,bit depth 以及 channels 会影响 bit rate 和文件大小

量化

给纵坐标加刻度,根据近似取整数值,使采样得到的点的值都是整数

java 采集扬声器声音 扬声器采样频率_i2s_17

编码

对量化取得的整数值按⼆进制进⾏编码

采样点

采样点 1

采样点 2

采样点 3


采样点 N

hex

0

3

5


X

bin

00000000

00000011

00000101


X

数字信号

把编码得到的 0 和 1 的序列变为⾼低电平的信号。

java 采集扬声器声音 扬声器采样频率_java 采集扬声器声音_18


上述整个模数转换的过程称为:脉冲编码调制 Pulse Code Modulation,简称 PCM。由上⾯的模数转换可知,PCM 格式⽂件存储的内容实际上就是编码得到的序列

PCM ⾳频数据

PCM 是采样量化后的未压缩⾳频数据,由模拟信号经过采样、量化、编码转换成的标准的数字⾳频数据。如果是单声道的⾳频⽂件,采样数据按时间的先后顺序依次存⼊(如果是双声道的话就按照 LRLR 的⽅式存储,存储的时候还和机器的⼤⼩端有关)。⼤端模式如下所⽰。

java 采集扬声器声音 扬声器采样频率_i2s_19

  • PCM 文件 :PCM 原始数据组成的文件
  • WAV 文件:文件头 + PCM 原始数据