Window Mobile 手机检测环境噪声

来源:互联网 发布:淘宝网消保规则 编辑:程序博客网 时间:2024/04/29 15:24

 

我们经常用手机来录音、拍摄,这些功能都用到了手机自带的microphone(MIC)。也有人想到了用手机的MIC来检测环境噪声的大小,这个小功能可以使手机更加智能化,比如调整振铃等,其拓展应用非常广。

 

目前已经有许多软件已经实现了这个功能,比如PocketRTA。PocketRTA有两个版本,分别适用于Windows NT 和 Windows Mobile(WM)。大家可以Google一下,下载适用,放在手机上当做噪声检测仪也是很有趣的。目前还没看见PocketRTA的源码。

 

经过一段时间的摸索研究,实现了测量环境噪声DB值功能的软件,一些经验在此和大家分享一下。网上这方面的信息很零碎,我综合原理和实际开发,把整个流程完整叙述一下。在此就不贴代码,相信知识比代码更能让人受益。

 

实现语言: C++

开发平台: VS 2005

手机OS:  Windows Mobile 5.0

 

流程图

chart

 

 

大致流程分为4步:

 

step1 : 获取声音数据。声音是以波的形式传播的,在传播路径上遇到障碍物时,会在这些障碍物表面上产生压力,这就是声压。MIC可以检测到声压,声压的大小反应为MIC输出电平的大小。MIC的输出电平进入到声卡后,声卡进行采样和量化,这是传统的模数转换(ADC)过程。声卡采样和量化后的值,就是波形数据。波形数据反映声音强度在时域上的变化。这些波形数据可以采用一定的格式在电脑上储存,如.wav文件,也可以输出到扬声器播放。

有关如何获取声音数据,可以参考本人先前的文章:WAVE文件录放音Windows API。

通常声卡的采样率为11.025kHz,16bit量化。即每秒采样11,025次,每次采样值量化为65536阶,量化值用0~65535表示。波形数据为时域离散信号。

 

step2:FFT / DFT 。 声音是由若干(或无限多个)频率分量组成的。为了检测和描述声音的特性,人们使用频谱。噪声检测也需要在频域处理数据,要把时域信号转换为频域信号。

step1得到的WAVE时域离散信号经过DFT可以变成频域离散信号。FFT是离散傅里叶变换DFT在工程上的优化算法。有关FFT的代码在网上很多。

 

step3:划分倍频程,并把信号从绝对量值转换为相对量值(DB)。

a。先说dB(decibel)的含义。dB是一个相对值,声学上来讲,声压的分贝值的基准是20微帕斯卡。假设一个声音的测得的声压是P帕斯卡,那么声音的分贝值计算公式为:

                                                             SPL

                                                            SPL:Sound Press Level 声压级。

通常物理上20微帕斯卡通过MIC和声卡量化后为1。所以公式简化为:

                                                              spl2

                                                              此处P也为量化后相对20微帕斯卡的值

b。然后说dB相加,比如有两个声音,分别为70dB和60dB,它们叠加是多少dB? 70.4dB。因为两个声音的叠加是能量的叠加。

c。再说倍频程。我们最终要计算的声音分贝值是由各个频率分量的声音分量组成的。我们用倍频程或1/3倍频程把声音划分为许多频带。倍频程的中心频率为31.5、63、125、250、500、1K、2K、4K、8K、16KHz十个频率,后一个频率均为前一个频率的两倍,因此被称为倍频程,而且后一个频率的频率带宽也是前一个频率的两倍。在有些更为精细的要求下,将频率更细地划分,形成1/3倍频程,也就是把每个倍频程再划分成三个频带。

d。计算每个倍频程的声压级。FFT后的信号在频域上是离散的,相邻点的频率间隔为 SampleRate / FFTPoint ,即采样率除以FFT的点数。计算倍频程的声压级的方法是先计算频带内频点的平均能量, 然后再取对数。计算公式为:

                                                        spl

                                                           Pi为倍频程中某个频点的值

e。下图为1/3倍频程的计算结果。

                              倍频程

 

step4:A率加权后计算dBA。  

a。A率曲线。由于人耳对不同频率的声音敏感程度不同,表现为相同dB值的声音,2kHz 比 100Hz听起来更响一些。为了使测量得到的值更符合人的主管感觉,在此引入A率加权。下图是A率曲线:

                                        a_curve                          

a率曲线曲线函数为:

    a1

    a2

可见,a率加权减弱了声音低频分量对最终测量结果的贡献。

b。加权方法。假设step3后,中心频率为125Hz的1/3倍频程的声压级为40dB, 125Hz的A率加权值为-16.18,加权后的声压级为 40-16.18 = 23.82dBA。A率加权后单位为dBA。

c。全部频率范围内的dBA叠加。

若采用的是1/3倍频程,经过b步骤后,得到30个频带的dBA值,表示为qi,i = 1,2,...,30。 全部频率范围内的dBA叠加公式为:

                              dba

 这就是最终结果。

 

 

 

后记:这些都是网上资料整理出来的,有错误可以在留言里指出,再来讨论考证。