Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在分贝音阶中测量音量_Android_Iphone_Audio Recording_Mediarecorder - Fatal编程技术网

Android 如何在分贝音阶中测量音量

Android 如何在分贝音阶中测量音量,android,iphone,audio-recording,mediarecorder,Android,Iphone,Audio Recording,Mediarecorder,我们正在进行一个跨平台项目,该项目要求在智能手机上进行音量采样,并尽可能高精度地分析结果。IPhone开发人员使用iOS实现的功能,返回由操作系统本身计算的以dB为单位的声功率/音量。据我所知,Android操作系统中没有类似的功能 到目前为止,我正在Android上使用操作系统提供的MediaRecorder类,我使用GetMaxAmplificate测量声功率/音量,我在网上看到了很多关于如何将振幅转换为dB刻度的答案,听起来最合理的答案是使用以下公式: 20*数学对数10(振幅/最大振幅)

我们正在进行一个跨平台项目,该项目要求在智能手机上进行音量采样,并尽可能高精度地分析结果。IPhone开发人员使用iOS实现的功能,返回由操作系统本身计算的以dB为单位的声功率/音量。据我所知,Android操作系统中没有类似的功能

到目前为止,我正在Android上使用操作系统提供的MediaRecorder类,我使用GetMaxAmplificate测量声功率/音量,我在网上看到了很多关于如何将振幅转换为dB刻度的答案,听起来最合理的答案是使用以下公式:

20*数学对数10(振幅/最大振幅)

但我必须知道GetMaxAmplium可以返回的最大振幅是多少,因为它在不同的设备上是不同的,例如我在HTC Desire和三星Galaxy S3上测试了GetMaxAmplium, 在HTC上,它达到了32767(我在一些答案中看到了记录的最大值),而在S3上,它没有超过16383(HTC的一半)

Q1:

这(上面讨论的方法)是正确的方法吗?只是我读到了,这是在IPhone上实现的吗

Q2:


如果我使用RSM或GetMaxAmplificate中的振幅,在我看来,我仍然需要知道我能从记录硬件中获得的最高振幅,有办法知道吗?还是有办法绕过它?

90dBspl是声学域中的rms值。 16位系统中2500 rms的数字电平与大约-22dB FS rms(实际上是-22.35)相同,其中0dB FS rms是满标度方波。这种系统中的满标度正弦峰值为0dBFS,均方根值为-3dB(从-32768到+32767)

+/-2500的方波可计算为:

20*log(2500/32767)=-22.35 dB FS rms

请注意,正弦曲线的峰值总是比rms水平高3dB。唯一具有相同rms和峰值电平的信号是方波

现在,Android要求在90dBspl附近有30dB的线性度,但该线性度应高于90dBspl+12dB,低于同一点-18dB。在此范围之外,根据您测试的手机型号,可以采用不同的压缩方式

安卓手机内部保证的最高线性电平为-22dBFS+12dB=-10dBFS rms。高于这个水平是不确定的。最常见的情况是,最后7dB的峰值净空仍然是线性的,导致无削波正弦(或112 dB spl峰值)的最大声学电平为90dBspl+(22-3 dB)=109dB spl rms

在某些手机中,您会发现峰值限制器将增益降低到102dBspl rms以上。这样做的结果是,您仍然可以录制到麦克风的饱和水平。该饱和水平各不相同,但通常在120dB spl时有2%左右的失真。高于此水平时,麦克风组件开始饱和并停止

看看天平的另一端:

一般来说,小型电话话筒噪音很大。最新的话筒可以在0dBPa以下-63dB(94dBspl)的噪声地板,但大多数话筒在0dBPa以下-58到-60dB之间

如何将其计算为dBFS rms

0dBPa rms是94dB spl rms。从上面的声明中我们知道,在Android手机中,90dBspl rms声级将以-22dBFS rms的数字级记录-90dBspl以下的63dB与-22dBFSrms+4dB-63dB=-81dBFSrms相同。16位系统中的绝对最大动态范围可近似为96dB(或93dB,具体取决于您的看法),因此噪声级至少比数字文件中的量化噪声高12dB

这对于视频记录模式来说是一个非常重要的发现。不幸的是,Android中的许多视频应用程序往往在录制过程中麦克风增益过高。这会导致录制高音量音乐会和类似情况时出现剪辑。我们还知道,麦克风本身的性能良好,至少达到120dB。因此,对于任何音频系统工程师来说,制作一种实际使用麦克风整个动态范围的视频录制模式都是一个好主意。这意味着增益应设置为至少低8dB。如果声音太软,在视频录制之后总是可以更改rms级别,但如果声音被剪辑,则会永久损坏录制

所以,我给你们程序员的信息是实现一种视频记录模式,其中90dB spl rms的声级记录在-30dBFSrms或略低于-30dBFSrms。任何最大化都可以在之后进行。这样我们就可以用更好的声音录制摇滚音乐会。进行自动增益控制无助于提高音质。动态范围通常太大,无法自动控制。你在声音中得到了很多激励。最好实现两种不同的视频录制模式:音乐会模式和语音模式。在语音模式下(针对1米距离的会说话的人进行了优化),录制增益甚至可以高于90dBspl的-22dBFSrms。我想说-12dBFS rms对于90dBspl是一个合适的记录级别。(1m距离的语音的均方根电平约为57dB spl,峰值高20-30dB)

比约恩·格伦
瑞典Sony mobile Lund的音频系统工程师

这个答案可能会帮助您安卓兼容性定义文件指出“音频输入灵敏度应设置为1000 Hz的90 dB声功率级(SPL)源产生16位样本2500的RMS”。因此,如果测试中的所有参数基本相同,那么不同设备之间的振幅会相差两倍,这似乎很奇怪。不过,我不能说哪一个最接近正确。嘿,比约恩,谢谢你的贡献,所有这些信息都很棒,而且非常深刻。然而,至少对我来说,这太复杂了