【闻弦歌】--初识音频

学习的目的在于掌握以及更好地使用,学习的第一步就是认知。在音频学习时,我们首先要认知的就是声音

声音是什么

  • 声音由震动而生,它本质上是一种机械波。既然是波,就拥有波动传播的性质,例如频率、波长等。
  • 对人而言,“声音”于生理学上的体现为大脑接受到的声音,和物理学定义有偏差。人类的耳朵一般只能听到约在20Hz至20,000 Hz(20kHz)范围内的声音,其上限会随年龄增加而降低,蚊音器【注1】就是利用了这种原理。

声音的采集与存储

在了解声音采集以及存储之前,我们首先要认知两个概念。即模拟信号和数字信号。
信号数据是可以用来表达任何信息的,例如图像、声音、文字等。对信号数据的了解,有利于我们理解声音采集存储的过程中,到底发生了什么。

  • 模拟信号[ analog signal ], [Wiki百科] 是这样解释的:

    模拟信号是在时域上数学形式为连续函数的信号,其主要利用对象的一些物理属性来表达传递信息。
    理论上来说,它的分辨率是接近无穷大的,信息密度大,不存在量化误差。代表着对自然界物理量的描述表达无限逼近真实。
    同时它也极其容易受干扰。
    例子:最开始的大哥大传输的就是模拟信号,所以那时候经常出现噪音,通话质量极差。

  • 数字信号[Digital signal],Wiki百科 解释如下:

    数字信号是离散时间信号(discrete-time signal)的数字化表示。
    狭义上来说,数字信号就是从模拟信号获取的。

OK,简要的说明了信号数据属性,概念总是苍白无力的,那么接下来我们用一个实际的例子来阐述以上两个属性的含义。
就从麦克风录音——>录音文件为例,在这个过程到底发生了什么转换,能让声音变成可播放文件的呢?

录音解密

对着麦克风录音时,麦克风【拾音设备】作了一轮声电转换,将机械振动信号转为模拟信号【在这里模拟信号的体现为连续电信号】。手机【或者计算机】是无法直接处理或存储模拟信号的,因为它是电信号。
所以手机【或者计算机】内部会对模拟信号进行采样收集,转化为数字信号,这个过程称之为A/D,模数转换。在这个过程中,采样模拟的波形和原始波形的误差就是噪音了。当然,一定程度上设备的好坏也决定了噪音的程度。
By the way,麦克风的工作原理:

麦克风里有一层薄且敏感的碳膜,声音经过时,会压缩空气导致碳膜挤压发生振动。碳膜下方有一个电极,碳膜振动时会接触电极,接触的长短和频率与声波的振幅和频率有关【注2】。这样就完成了第一轮声电转换。

有了录音,自然接下来就是播放了。接着我们会讲一下手机【或者计算机】是如何播放音频文件的。

音频播放

音响设备播放声音,需要连续的电波将音盆的磁圈振动。这个过程,要是向它输入数字信号,那可不好使。
音响设备此时需要计算机对它输入模拟信号【有强弱变化的电流】,这个过程叫做D/A,数模转换
模拟信号和数字信号是不相通的,通过模数转换/数模转换来互通。譬如手机播放一个MP3,必须将这个MP3文件解码成模拟信号才能推动扬声器来振动产生声音。

好比是乐谱和演奏一样:A/D,模数转换就是将音乐写成乐谱。而D/A,数模转换,就是乐师将乐谱演奏出来。

音频学习学什么

实际上对于APP应用层开发而言,A/D,模数转换D/A,数模转换大多数情况下是不用接触的。
对于Android平台而言,系统已经封装了相当完善的录音Api。它会直接提供给我们,经过A/D模数变换后的二进制序列 PCM文件 【该文件没有附加的文件头和文件结束标志】
而音频开发都是基于PCM文件的。

PCM文件

PCM文件是对声音模拟信号的量化,是没有经过压缩的纯音频数据,只有PCM能直接进行声音处理【譬如变声器】。
同理,PCM没有文件描述,所以不会有播放器支持播放PCM文件的音乐,除非已知采样率等信息。PCM作为声音的量化体现,主要有以下几个维度来描述声音:

  • 采样率sampleRate,单位【khz】:
    • 取样频率,每秒钟取得声音样本的次数。此值越高,则声音的还原度越高,同时占用的资源也会更多。
    • 常见的有8khz【电话等使用】、22.05khz【广播】、44.1khz【CD音质】、48khz【数字电视】;常用采样率不会超过48khz
    • 44.1khz是Android平台已知唯一兼容大多数固件的采样率
  • 采样位数,单位【bit】:
    • 每一个采样点的采样值,用来衡量声音波动变化的一个参数,也可以说是声卡的分辨率。数值越大,声音质量越好。
    • 大小常为为4bit、8bit、16bit、32bit
  • 声道数channel
    • 单声道 Mono
    • 双声道 Stereo
    • 用耳机举例,单声道并不是只有一个耳机喇叭发出声音。而是两个喇叭同时发出这个声道的声音。
      双声道就是两个耳机喇叭分别播出两个声道的声音。
    • 对Android平台而言,立体声就是双声道。
  • 时间

PCM文件计算大小

衡量PCM文件数据单位时间内的容量大小,称之为比特率——即1s时间内的比特(bit)数目。那么,来计算一下一个 44.1khz 16bit 2channel的CD音质的比特率为:

1
44100*16*2=1411200bps=1411.2kbps
那么一段60s的CD音质的声音大小为:
1
1411.2*60/8=10584KB=10.34MB
ok,接下来我们详细介绍一下,以上各个单位的换算详情。
  • 比特率,数据传送速度单位,用来衡量带宽的,每s传输的二进制位数:

    Mbps 即 Milionbit pro second(百万位每秒)

    Kbps 即 Kilobit pro second(千位每秒)

    bps 即 bit pro second(位每秒)

    最小的单位就是bit,也是采样位数,通常缩写为b这里要着重注意一下,要和另一个单位B区分开来。
    另,kbps和bps的换算单位也有争议,有的是1kbps=1024bps,有的则是1kbps=1000bps。我们之前计算的10.34MB,是以1000位基准计算的,参考的是wiki百科。

  • 传输的字节数单位,Byte,通常用B表示:

    这个才是通常软件上显示的下载速度,也是存储的硬盘上的字节数体现。
    MB即百万字节也称兆字节
    KB即千字节
    B即字节,其换算单位为1024,公式为:

    1MB=1024KB=1024*1024B=1024*1024*8b
    所以,一般1M的网络带宽指的是:1Mbps。它下载的速度上限为:1Mbps=1000kbps=1000000bps。一秒钟走过了10^6个bit,那么换算为Bytes为:

1
10^6/8=125000 byte/s=122 KB/s

PS:有关1kbps=1024bps1kbps=1000bps的用法依然是混乱的。
作为万国共通的SI单位系「k」「M」等接头辞有着1000乘方的意义,IEEE和IEC等学会标准化团体等也正式地跟随这些的用法。但出于计算机初期软件和硬件设计上的情况,是把1024比特作为1000比特,结果在数据的容量和通信速率等中适用这个规则的人增多,导致了现在这样的混乱状态。
在通讯的世界中,由于数据通讯开始之前就遵从SI单位系而使用1000倍,并且调制解调器的通信速率开始时也是使用75bps,300bps,1200bps等非2乘方的值,所以一般认为1kbps=1000bps是妥当的。大致来说,存储器和硬盘等存储容量一般使用「1024」,通信速率使用「1000」,但因为根据状况会有不同,需要充分注意使用的是哪边的意义


PCM文件格式可以直接作声音处理

对一个PCM文件而言,以采样频率作为变量,其余属性不变。则采样频率越小,播放出来的声音越粗,速度越慢。采样频率越高,声音越细,速度越快。
怎么样,是不是很熟悉呢?这种效果差不多就是变声器的原理了,不过变声器要比这个复杂的更多。

以上

注1:蚊音器,也叫蚊音警报器,是一种通过发出高频声音来制止年轻人集会的一种电器设备。
最新的版本于2008年晚些时候上市,其可以设置两种频段。一种是大约17.4kHz[1],一般只有年轻人可以听到的。另一种为8kHz,能被大多数人听到。其最大的前在输出的声压级为108dB。由于人耳朵的功能会随着年纪变化,因此此种声音只有差不多25岁以下的年轻人才听得到。
注2:参考《音视频开发进阶指南》第一张第二节

参考资料: