IOT的项目实践之浅谈声音采样

引言

日常生活中的声音是一种在时间上连续的波,它本质上是空气压力差引起的空气振动,这种振动会产生声波,声波在介质中传播,当声波传播到接收端(如人耳),引起相应的振动,最后被识别为声音。
而计算机不是人耳,他是如何处理声音(音频文件)呢?
声音是一个连续的能量波,也就是模拟信号,所以有两个基本属性:频率与振幅。我们用振幅表示音量,频率表示音调。计算机无法直接处理连续的模拟信号,需要转换为数字信号。模拟信号转换为数字信号一般采用的方法时以一定的频率对模拟信号进行采样。(采样的频率需满足奈奎斯特采样定理:为了不失真地恢复模拟信号,采样频率应该大于等于模拟信号频谱中最高频率的2倍)

PCM

脉冲编码调制技术(PCM)是一种常用来将模拟信号转化为数字信号的技术。麦克风采集到声音信号后转化为相应的电压,PCM将连续变化的电压采样量化为离散的PCM编码,PCM编码是一串的0 1组合,0 1的数量,取决于采样位数。下图为4 bit 采样深度的PCM数据量化示意图(图是网上的,侵权可删),红色为音频的模拟信号,阴影部分为PCM量化。例如第一个点量化为8(1000),振幅最高的点量化为数字15(1111)。
4bit
下图为8bit采用的PCM量化示意图(图是网上的,侵权可删)。在这里插入图片描述

采样位数一般有4、8、16、32位(bit)等,例如:采样位数为8 bit时,每个采样点可以表示256个不同的采样值,而采样位数为16 bit时,每个采样点可以表示65536个不同的采样值。采样位数的大小影响声音的质量,采样位数越多,量化后的波形越接近原始波形,声音的质量越高,而需要的存储空间也越多;位数越少,声音的质量越低,需要的存储空间越少。一般情况下,CD音质的采样位数是16 bit,移动通信是8 bit。
所以计算机将声音处理为数字信号的过程如下图所示(图是网上的,侵权可删),主要为三个阶段:采用、量化和编码。
在这里插入图片描述

声道数:记录声音时,如果每次生成一个声波数据,称为单声道;每次生成两个声波数据,称为双声道(立体声)。单声道的声音只能使用一个喇叭发声,双声道的PCM可以使两个喇叭同时发声(一般左右声道有分工),更能感受到空间效果。

数字音频文件大小(Byte) = 采样频率(Hz)× 采样时长(S)×(采样位数 / 8)× 声道数(单声道为1,立体声为2)

PCM音量计算

我们常说的分贝(dB)是描述声音的响度(分贝不仅仅是声音单位,还可以用来描述其他能量)。声学领域中,分贝的定义是声源功率与基准声源功率比值的对数乘以20的数值。根据人耳的特性,我们对声音的大小感知呈对数关系,而不是线性关系。人类的听觉反应是基于声音的相对变化而非绝对变化。对数函数正好能模仿人耳对声音的反应。所以用分贝描述声音强度更符合人类对声音强度的感知。计算分贝时需要了解下面三个词:声压(SPL)、RMS、分贝(dB SPL)。
由于空气的振动会引起大气压强的变化,可以使用压强变化的程度来描述声音的大小,这就是“声压(SPL,Sound Pressure Levels)”概念,其单位是Pa。例如:1米外步枪射击的声音大约是7000Pa;10米外开过汽车大约是0.2Pa。使用声压作为测量量的分贝就是dB SPL,通常用来表示声音大小的dB指的就是dB SPL。声压和声音大小的关系,可以使用如下公式表示:I=P^2⁄ρ (I:声音的强度,P是声压,ρ是空气阻力,通常室温下约为400)。

根据维基百科定义,分贝dB的转换公式为:
能量/功率:10lg(Ps / Pn)
采样值/幅值:20lg(Prms / Pref)

分析公式可知,核心来自于10lg(Ps / Pn),由于它是能量的比值或者由功率比定义的,10倍时用的是功率比,即数值的平方。如果我们不想求能量,想直接从幅值单位来处理的话,就需要调整下公式,推导过程如下:

10lg(Ps / Pn) 
= 10lg(Val^2 / Ref^2) 
= 10lg((Val / Ref)^2) 
= 20lg(Val / Ref)
= 20lg(Prms / Pref)

于是得到采样值/幅值的比值时,对应的dB转换公式。所以,我们也就知道了前文两个公式的用途:
功率比、能量比场景,用10lg
声压、电压、数字成像、采样值、幅值等,用20lg

PCM文件中采样值到dB分贝是如何转换的呢?
过程如下:
日常生活中常见Pref是以最小幅值为参考,Pref=1,如果采样位数是16 bit,那么无符号情况下,最大分贝是:20lg(Prms / 1)=96
PCM中,以最大幅值作为Pref,则最大db为0,最小为负无穷
其中,0db上下分布的都是负db,上部对应的是幅值为正,下部对应的是幅值为负
PCM中,统一将采样值取绝对值,进行20lg(Prms / Pref)变换到db
db肯定都是负值,如采样值为正,则db结果放上部,否则放下部
例如:带符号位的16bit整数对应的最大值为2^15-1=32767,所以Pref=32767,实际采样值取绝对值后为2900,代入公式,则有20lg(2900/32767) = -21.06dB,若Pref=1,则20lg(2900/1) = 69.25dB。

AOP标准
常见的音频采集的麦克风很多是采用AOP 130dB的标准,所以上述的Pref就不能取为1,而是应该根据AOP 130 dB标准 采样位数来取Pref的单位值,如果采样位数为有符号的16bit,此时的Pref = 32768/(10^(130/200)),所以
db=20lg(P/(32768/(10^(130/200))))
PS:多提一句,什么是AOP。AOP即最大声学输入(Acoustic Overload Point, AOP)
最大声学输入一般指硅麦克风能够承受的最高声压水平,高于此声压水平会导致输出信号严重的非线性失真。

RMS:均方根(Root Mean Square)
即:将N个项的平方和除以N后开平方的结果,即均方根的结果。可以用RMS表示一段时间内能量波的有效值,所以一段时间内的分贝可以用RMS计算为:= 20lg(RMS / Pref)

工程示例
这是一个音频模块的PCB,由最左边的麦克风、中间的调制器和右边的处理器组成。可以看到麦克风和调制器两根线连接,调制器和处理器是三根线连接,由datasheet得到麦克风和调制器是PDM接口,调制器和处理器是TDM接口。

想要获取数据。只要实现处理器给调制器的驱动即可,本工程里的P0_01P0_00P0_02是处理器的sport接口,配置sport接口的寄存器调出datasheet中要求的时序逻辑就可以获取数据啦。

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值