最近开始接触到监控设备中音频相关的工作,主要包括音频数据采集、相关参数设置、环境降噪、回声处理、编码等方面,本文着重就音频相关的基础知识做一个总结。
信噪比SNR:原始信号和内部噪声(经过该设备后产生的原信号中并不存在的无规则额额外信号)强度的比值,以db位单位,计算方法是:10lg(PS/PN),其中PS和PN分别代表信号和噪声的有效功率,也可以换算成电压幅值的比率关系,20lg(vs/vn),vs和vn分别代表信号和噪声电压的‘有效值’。信噪比越高,音讯放大越干净。
监控设备中音频输入有两种模式
linein:音频线两端分别连接音源(手机、电脑等)及设备
micin:通过设备内置麦克风输入
音频线或耳机常见插口,只列举下面两种目前用到的:
3.5mm三段式耳机,比较常见,三根贴心代表里面事三根导线,必要的时候没有合适的插口需要徒手搭上去导通
3.5mm四段式耳机插口
模拟信号:连续信号,时间和幅度都是连续的,我们日常听到的声音就是典型的连续信号
数字信号:在某些特定的时刻对模拟信号进行测量叫做采样(sampling),在有限个特定时刻采样幅度限定有限个得到的信号称为数字信号。模拟信号到数字信号转换为A/D(Analog to Digital) 反之为D/A,对于计算机来说只能存储二进制数,所以使用计算机存储或者处理声音信号必须使用A/D采样转为数字音频
采样:将时间轴上连续的信号每隔一段时间抽取出一个信号的幅度样本,把连续的模拟信号用一个个的离散点表示出来,每秒钟采样的次数称为采样频率,用f表示。CD采样率为44.1kHZ,监控设备中常用的采样率为8k,16k,32k,48k,64k等。
在对模拟音频进行采样时取样频率越高,音质约有保证,如果采样率不够高,声音就会产生失真。
采样定理(奈奎斯特定理)中有描述,采样率至少要录制音频最高频率的2倍,才不会失真。
常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等
量化(位深depth) 量化精度,反应了声音波形幅度的精度,如果使用16位表示,那么声音样本值就是在0~2^16(65535)的范围。常用的采样位深是常见的位宽是:8bit 或者 16bit
采样率、位深、声道数决定了声音的音质和占用的空间大小.采样率和位深越大,越接近原始信号
码率:码率=采样率*声道数*位深
如果是CD音质,采样频率44.1KHz,量化位数16bit,立体声(双声道),码率 = 44.1 * 16 * 2 = 1411.2Kbps = 176.4KBps,那么录制一分钟的音乐,大概10.34MB。除非专业需要,这个size是我们常常不能接受的,不利于保存和传输。如果是实时的话,每秒需要的带宽就达到了180KB(加上数据包头信息)。
音频帧:音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms~60ms(我接触到的就是1000/25=40ms)为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的,我们可以计算一下一帧音频帧的大小。
假设某通道的音频信号是采样率为8kHz,位宽为16bit,40ms一帧,单通道,则一帧音频数据的大小为:
int size = 8000 x 16bit x 0.04s x 1 = 5120bit = 640 byte
我们采用这种方式来录音,那么我们从音频缓冲区读取音频数据的时候,要一帧一帧的读取,每个音频帧大小为640byte
声道channel:单声道(mono),立体声双声道(stereo),双声道按照存储方式又分为交错和非交错模式,
交错模式:每帧的左右声道数据依次存放
非交错模式:一个周期内所有的左声道数据,再存放所有的右声道数据
音频编码
首先简单介绍一下音频数据压缩的最基本的原理:因为有冗余信息,所以可以压缩。
(1) 频谱掩蔽效应: 人耳所能察觉的声音信号的频率范围为20Hz~20KHz,在这个频率范围以外的音频信号属于冗余信号。
(2) 时域掩蔽效应: 当强音信号和弱音信号同时出现时,弱信号会听不到,因此,弱音信号也属于冗余信号。
编码格式:(有损压缩和无损压缩)
PCM:脉冲编码调制,模拟信号只经过了AD采样的原始数据,没有经过任何编码和压缩处理。音质好体积大,达到最高保真。
G.711a/G.711u
G.726
G.729
G.723
AAC
音频采集:通过codec芯片或者有的芯片内置codec,比如目前使用的海思芯片,实现AD采样,然后通过i2s传给cpu处理
音频处理:回声消除、噪声抑制、增益控制
Adndroid VoIP相关的开源应用有哪些 ?
imsdroid,sipdroid,csipsimple,linphone,WebRTC 等等
音频算法处理的开源库有哪些 ?
speex、ffmpeg,webrtc audio module(NS、VAD、AECM、AGC),等等
Android提供了哪些音频开发相关的API?
音频采集: MediaRecoder,AudioRecord
音频播放: SoundPool,MediaPlayer,AudioTrack (它们之间的区别可以参考这篇文章)
音频编解码: MediaCodec
NDK API: OpenSL ES
以下二维码为测试使用