音频之岁月留声

来源:互联网 发布:js防水防水涂料 编辑:程序博客网 时间:2024/04/30 00:54

花满楼原创,转载须授权。


听得到的,或听不到的声音,抽象来说,都是模拟信号,也可以形象一点,叫能量波,因为声音是有能量的,而且有大小变化,呈波形状。平常听到的声音都是复杂的波形,不会像单一频率的声音那么干净(比如正弦波、方波之类),但为了便于分析,经常会抽象为简单的波形。

小白:我听过单频率的声音,比如400hz,它是一个正弦波,随时间它的能量会变大变小,但为什么我听不出它有变化呢?

花满楼:400hz就是小蜜蜂嗡嗡啰,你听不出大小变化是因为频率太高了,这跟独立的图片以较高帧率显示就成了连续的,是一个道理。

声音有两个维度是很重要的,一个是能量,一个是频率。能量以时间为横向坐标,即某个时间点对应一个能量值(也叫振幅或气压),表现出来的就是波形图,也叫时域表示。

小白:能量这个好理解啊,在“音频之狮吼功”那篇文章中有介绍过。我能说声音的大小即响度就是振幅吗?

花满楼:振幅(能量)的确影响了响度。但响度是一个心理感知的东西,很难说只受振幅的影响,很可能还跟频率(音调高低)及持续的时间,甚至对比度都有关系,所以不能说响度就是振幅,只能说响度受振幅影响。

小白:要不要这么严格啊?

声音的频率维度,是一个很复杂的概念,不在本文展开,会另作介绍。

小白:频率不就是音调,即声音的高低吗?有什么复杂?

花满楼:频率怎么来?频率怎么表示?怎么从频率看音色?这些内容足够讲一篇文章了。即使是刚才说的波形图,也是没有展开讲包络与精细结构之类的概念的。

小白:……那还是回到正题,快点说怎么采集声音吧!

本文介绍声音的采集。

小白:你之前介绍过用ffmpeg来录制声音的,是不是那样采集?

花满楼:那是采集的应用层的实现,这次要介绍原理性的东西,而且不涉及录音师之类的工作,比如布mic、配音、拟音之类。

小白:好枯燥啊!

自然界的声音转换成数字编码,要经过电平化、放大、采样、量化、编码。

(一)电平化

比如,通过碳膜来对接声音。声音的能量推动话筒的碳膜,碳膜振动时触发跟它相连的电极,产生电信号。电平大小与碳膜的振幅相关,而这又与声音的能量有关。

(二)放大

通过话筒取到的电信号是微弱的,为了支持后续的处理,有必要通过放大电路把信号放大。

(三)采样

采样是模数转换(ADC)的过程,也就是把连续的电信号采样成离散的数值。

这里有一个概念叫采样率,采样率就是一秒钟一个声道采多少个样本。比如采样率为44100hz,则表示一秒钟一个声道采集了44100个样本(数值),如果一个样本用2个字节(即16bit)来表示,则对于双通道的同时采集(相当于两个话筒输入),一秒钟占的字节数是:44100*2*2=176400,约176kB,这样采集下去,如果不作处理,则大小不是一般的磁盘与带宽能够接受得了的,所以才会有编码压缩的引入。

小白:为什么要使用44100hz,使用10hz来采,不就没有那么大的占用了吗?

花满楼:你用10hz当然小很多啦,但10hz不能还原或逼近原模拟信号(最终是要播放即转换成模拟信号的)。这里有一个采样定理,即如果想还原出模拟信号,则采样率不能低于模拟信号的最高频率的2倍,也就是对于最高频率的一次全振动内,你至少也要采到两个点。对于人耳来说,听到的频率范围是20hz到20khz,所以可以认为最高的模拟信号的频率为20khz,那么采样的频率就要达到40khz才能保证还原模拟信号。

小白:那就40khz啊,为什么常见的是44.1khz呢?

花满楼:当时索尼公司正是人生的巅峰,而他使用了这个值,行业就都跟风去了。

(四)量化

采样得到样本后,用多少二进制位去表示它,这个就是量化,而多少位则为量化精度(位深)。

一般位深为16bit、24bit或32bit。

对于16bit,2^16=65536,20log(65536)约等于96dB,也就是16bit能表示96分贝的能量变化。从安静环境的30dB到演唱会的120dB,96dB都基本能覆盖上了。16bit的1bit就相当于6dB。

24bit与32bit也是量化精度的选择,因为会比16bit更细腻,但占的空间也更大。

小白:如果我选择1bit来表示会怎么样?

花满楼:1bit只有两个值,即0跟1,那它对应的电平值就只有两个等级,比如0dB跟100dB,中间的音量都听不到,结果就是表示的0dB你听不到,而表示的100dB又基本不出现,于是就什么声音都听不到。如果用2bit来表现,就有4个值,对应的电平等级就有4级,但层次还是不分明,不能细腻地表示变化。

(五)编码

这里的编码是指采样后电平值的表示方式。

pcm(脉冲编码调制)是常用的音频编码格式,也就是对每个采样的样本,用最接近的电平值(电平值的范围由量化精度决定)去表示,每个样本互相独立。

pcm编码格式在表示上,还可以细分为很多种,比如pcm_s16be、pcm_f32le、pcm_alaw之类。

显然,pcm编码是没有压缩的。

小白:这个pcm编码跟mp3、aac之类的编码有什么不一样?

花满楼:pcm编码是没有压缩数据的,它是采样时表示数据的一种方式。而mp3、aac之类则是对pcm数据的压缩编码。如果要播放,则要把压缩编码的数据,解码成pcm数据。

小白:除了这个方式,还有别的表示方式吗?

花满楼:还有一种有名的编码格式叫DSD,以44100的64倍的频率去采样,而每一个样本用1bit去表示,并且样本彼此关联。

小白:我都快睡着了,真是枯燥的“岁月留声”啊。

花满楼:……


开心时间

1、同学面试一大公司,录取二人,大概五六十个人报名。考题是:让考官在最短的时间内记住自己。我同学一句没说上去给考官一嘴巴,调头跑了。第二天通知他去上班。他思索许久放弃了。2、局长与科长共乘电梯,局长放一屁后对科长说:你放屁了。科长说:不是我放的。不久科长被免职。局长在会上说:屁大的事你都担待不起,要你何用?3、蜜蜂狂追蝴蝶,蝴蝶却嫁给了蜗牛。蜜蜂不解:他哪里比我好。蝴蝶回答:人家好歹有自己的房子,哪像你住在集体宿舍。4、一同学去食堂打饭,打到饭后问打饭师傅,“师傅,怎么你们沙子里面有米啊!!!”5、大二时,全宿舍的女生都喜欢周华建的歌,一盘磁带被大家借来借去的。一日,上铺的女生问:我的周华建呢?下铺的女生回答:在我床上呢!两秒钟寂静无声,然后全体翻倒在床。

多媒体开发,关联阅读

FFmpeg第一次约会

ffplay看直播,简洁是美

摄像头启动,开始监控

调试FFmpeg

组装FFmpeg,为我所用

从视频中抽几张图

流媒体服务器,给你好看

他们都在说的概念

媒体封装格式的时装show

音频之狮吼功


扫一扫下面的二维码直接加入技术讨论群

扫描加群


在公众号对话框输入数字2,小编拉你进去程序员技术讨论群。

欢迎关注我们

原创粉丝点击