0%

音频基础技术

人耳听觉范围

次声波,听觉范围:20Hz~20kHz,超声波

Hz,赫兹,一秒内振动的次数。

人发声范围:85Hz~1100Hz

声音三要素

  • 音调(频率):音频的快慢。男生 > 女生 > 儿童
  • 音量(强度):振动的幅度
  • 音色:谐波

音调(频率)

在一个波中,周期是完成一个周期所需的时间,频率是周期的倒数,以赫兹表示每秒周期数。从本质上说,完成一个周期所需的时间越短,频率越高;从视觉上看,峰值彼此靠近的波比峰值远的波具有更高的频率。虽然频率描述了波形循环重复率的数值度量,单音调更像是我们用来描述声音的主观术语。

音量(强度)

强度是理解声音成分的另一个维度。声音强度描述了声音在一个区域内位移的声功率,以瓦特/平方米为单位。声音的功率是声音在某个单位时间内传递能量的速率,即强度本质上是声音置换的能量。

听者的持续时间、频率和年龄等混杂因素会影响声音的响度。

音色

银色描述了赋予声音特征的多种属性。

模拟信号数字化过程

模拟音频信号转化为数字音频信号:模拟音频信号是一个在时间上和幅度上都连续的信号,它的数字化过程如下所述。

模拟信号数字化的结果产物是PCM或WAV文件。

采样

在时间轴上对信号进行数字化。

按照固定的时间间隔抽取模拟信号的值,这样,采样后就可以使一个时间连续的信息波变为在时间上取值数目有限的离散信号。

采样过程决定采样率(sample rate)。

量化

在幅度轴上对信号进行数字化。用有限个幅度值近似还原原来连续变化的幅度值,把模拟信号的连续幅度变为有限数量的有一定间隔的离散值。

量化过程决定位深/采样大小,这是通过采样格式(sample format)体现的。

编码

用二进制数表示每个采样的量化值(十进制数)。

原始音频数据:

  • PCM,脉冲编码调制。

    • 纯粹的音频数据,不带音频格式。所以PCM音频流的码率计算方式如上所述。
  • WAV,在PCM上添加音频信息的头。

    • 但除了存储PCM原始数据,它还可以存储压缩数据。
    • 如下图可见,WAV存储的音频格式就是量化的信息:采样大小、采样率、声道数。

上述的编码是模数转换过程中的编码成二进制文件的过程,注意与音频编码分开。一般所说的音频编码更多是指对音频的压缩。

小结

音频由波形组成,包括不同频率和振幅的波的叠加。为了在数字媒体内表示这些波形,需要对波形进行采样,其采样率需要(至少)可以表示您要复制的最高频率的声音;同时还需要存储足够的位深,以表示声音样本中波形的适当振幅(响度和柔度)。

  • 位深/采样大小:一个采样用多少 bit 存放。能够表达的数值范围。使用8位、16位表达。

    • 位深影响给定音频样本的动态范围。位深越高,表示的振幅越精确。如果在同一音频样本内有很多响亮和柔和的声音,则需要更大的位深才能正确表示这些声音。
    • 增高位深还会降低音频样本内的信噪比。CD 音乐音频使用 16 位的位深。DVD 音频使用 24 位的位深,而大多数电话设备使用 8 位的位深。(某些压缩技术可以补偿较小位深的不足,但往往会有损耗。)
  • 采样率:采样频率,即一秒内采样的个数。8k、16k、32k、44.1k、48k。越高越精细,高保真。

    • 声音以模拟波形的形式存在。数字音频片段以足够快的速率对模拟波的振幅进行采样,模仿波的固有频率,达到高度接近这种模拟波的效果。数字音频片段的采样率指定了(每秒)从音频的源素材中采集的样本数;采样率越高,数字音频如实表示高频的能力就越强。
    • 根据 Nyquist-Shannon 定理,对于您要以数字形式采集的任何声波,您的采样率通常需要高于其最高频率的两倍。例如,要表示人类听觉范围 (20-20000 Hz) 内的音频,数字音频格式必须至少每秒采样 40000 次(CD 音频使用 44100 Hz 的采样率,部分原因也在于此)。
  • 声道:单声道、双声道、多声道。

通过以上三者可以计算出原始音频的码率(一秒内的比特数):

1
2
3
4
未经压缩的码率 = 采样率 × 采样大小 × 声道数
44100 * 16 * 2 / 1000 = 1378.125kbps
一分钟的存储空间:
1378.125 * 60 / 8 / 1024 = 10.09MB

直接读取处理PCM

对于PCM,其每个采样的都是固定的,可以直接通过指针进行访问操作,如把PCM16LE双声道(采样大小16位,即每个声道的采样大小为2字节;LE:使用小端方式存储)分离声道:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FILE *fpcm = fopen(url, "rb+");
FILE *fl = fopen("output_l.pcm", "wb+");
FILE *fr = fopen("output_r.pcm", "wb+");

// 包含左右声道的采样
unsigned char *sample = (unsigned char *)malloc(4);

while (!feof(fpcm)) {
fread(sample, 1, 4, fpcm);
// L
fwrite(sample, 1, 2, fl);
// R
fwrite(sample + 2, 1, 2, fr);
}

free(sample);
fclose(fpcm);
fclose(fl);
fclose(fr);

类似的,将左声道音量降低一半:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FILE *fin = fopen(url, "rb+");
FILE *fout = fopen("output_halfleft.pcm", "wb+");

unsigned char *sample = (unsigned char *)malloc(4);

while (!feof(fin)) {
short *samplel = NULL;
fread(sample, 1, 4, fin);

samplel = (short *)sample;
*samplel = *samplel / 2;
fwrite(sample, 1, 4, fout);
}

free(sample);
fclose(fin);
fclose(fout);

而加速,而可以采用隔位采样的方式实现,但这样的效果音调也会上去。例如把速度提升一倍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FILE *fin = fopen(url, "rb+");
FILE *fout = fopen("output_doublespeed.pcm", "wb+");
int cnt = 0;
unsigned char *sample = (unsigned char *)malloc(4);

while (!feof(fin)) {
fread(sample, 1, 4, fin);
if (cnt % 2 != 0) { fwrite(sample, 1, 4, fout); }
cnt++;
}

free(sample);
fclose(fin);
fclose(fout);

还可以进行采样格式的转换,例如简单把PCM16LE转换为PCM8,由于是降采样,所以音质也会下降。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
FILE *fin = fopen(url, "rb+");
FILE *fout = fopen("output_8.pcm", "wb+");
int cnt = 0;
unsigned char *sample = (unsigned char *)malloc(4);

while (!feof(fin)) {
short *s16 = NULL;
char s8 = 0;
unsigned char s8_u = 0;
fread(sample, 1, 4, fin);
//(-32768-32767)
s16 = (short *)sample;
s8 = (*s16) >> 8;
//(0-255)
s8_u = s8 + 128;
// L
fwrite(&s8_u, 1, 1, fout);

s16 = (short *)(sample + 2);
s8 = (*s16) >> 8;
s8_u = s8 + 128;
// R
fwrite(&s8_u, 1, 1, fout);
cnt++;
}

free(sample);
fclose(fin);
fclose(fout);

音频压缩编码

与所有数据一样,音频数据通常会进行压缩,以便更易于存储和传输。音频编码中的压缩可能为无损或有损。无损压缩经过解包后可以将数字数据恢复为原始形式。有损压缩在压缩和解压缩过程中必然会移除某些信息,并且进行参数化,以便表明在多大容限范围内允许压缩技术移除数据。

音频压缩往往追求两个极端:压缩比尽可能大、压缩速度尽可能快。

基本过程

以上过程包含了有损压缩和无损压缩的过程。主要还是有损压缩。

时域转频域:去除被遮蔽掉的音频信号;心理声学模型:去除人耳听觉范围以外的音频信号。

压缩方式

  • 有损压缩(清除后无法恢复):消除冗余信息
    • 在保证信号在听觉方面不产生失真的前提下,对音频数据信号尽可能大的压缩。这些冗余信息:
      • 人耳听觉范围外的音频信号
      • 被遮蔽掉的音频信号
        • 频域遮蔽
        • 时域遮蔽
  • 无损压缩

有损压缩编码

有损压缩则会在构建压缩数据期间清除或减少某些类型的信息,从而压缩音频数据。

频域遮蔽效应

音量高的会遮蔽附近音调的声音。

时域遮蔽效应

音量高的会遮蔽附近时间的声音。

无损压缩编码

无损压缩对存储的数据进行复杂的重排,从而压缩数字音频数据,但不会导致原始数字样本的质量下降。如果采用无损压缩,在将数据解包为原始数字形式时,不会丢失任何信息。

那么,无损压缩技术为什么有时会具有优化参数?这些参数通常用来控制文件大小和解压缩时间。例如,FLAC 使用 0(最快)到 8(文件大小最小)的压缩级别参数。与较低级别的压缩相比,较高级别的 FLAC 压缩不会丢失任何信息。压缩算法只是需要在构建或解构原始数字音频时消耗更多的计算能量。

从技术上讲,LINEAR16 不是“无损压缩”,因为首先它并未涉及压缩。

  • 熵编码

    • 哈夫曼编码。使用很小的二进制数代表一个较长的字符,频率越高编码越小,频率越低编码越长。
  • 算术编码

    • 通过二进制的小数来进行编码。
  • 香农编码

    • 算术编码的改进。

常见音频编码器

常见的音频编码器包括 OPUS、AAC、Ogg、Speex、iLBC、AMR、G.711 等。

  • OPUS

    • 延迟小,压缩比高。WebRTC 默认使用。
  • AAC

    • 应用广泛,移动设备支持硬编解码。用于取代 mp3。
  • Ogg

    • 收费,因此导致应用不广。
  • Speex

    • 直接支持回音消除功能。
  • G.711

    • 窄带音频,编码后数据非常小,但声音损坏较大。固话。

网上评测结果:OPUS > AAC > Ogg

音频重采样

含义:将音频三元组(采样率、采样大小、通道数)的值转换成另外一组值。即只要改变这三元组的任意值都是进行重采样。

重采样的应用场景:

  • 从设备采集的音频数据与编码器要求的数据不一致。

  • 输出设备要求的音频数据与要播放的音频数据不一致。

  • 更方便计算,如回音消除要把双声道转换成单声道。

码控

  • In CBR (constant bit rate) formats, such as linear PCM and IMA/ADPCM, all packets are the same size.
  • In VBR (variable bit rate) formats, such as AAC, Apple Lossless, and MP3, all packets have the same number of frames but the number of bits in each sample value can vary.
  • In VFR (variable frame rate) formats, packets have a varying number of frames. There are no commonly used formats of this type.

欢迎关注我的其它发布渠道