Cocoa 如何使用可可粉获得准确的分贝级?

Cocoa 如何使用可可粉获得准确的分贝级?,cocoa,audio,core-audio,decibel,Cocoa,Audio,Core Audio,Decibel,我们正在创建一个应用程序,记录周围的声音,并在声音超过指定分贝时采取必要的措施 为了实现应用程序目标,我们使用AudioQueueObject.h中的以下方法 - (void) getAudioLevels: (Float32 *) levels peakLevels: (Float32 *) peakLevels { UInt32 propertySize = audioFormat.mChannelsPerFrame * sizeof (AudioQueueLevelMeterState)

我们正在创建一个应用程序,记录周围的声音,并在声音超过指定分贝时采取必要的措施

为了实现应用程序目标,我们使用AudioQueueObject.h中的以下方法

- (void) getAudioLevels: (Float32 *) levels peakLevels: (Float32 *) peakLevels {

UInt32 propertySize = audioFormat.mChannelsPerFrame * sizeof (AudioQueueLevelMeterState);
AudioQueueGetProperty(
self.queueObject,
(AudioQueuePropertyID)kAudioQueueProperty_CurrentLevelMeterDB,
self.audioLevels,
&propertySize);

levels[0] = self.audioLevels[0].mAveragePower;
peakLevels[0] = self.audioLevels[0].mPeakPower;
}
我们有以下一组查询

  • 录制的声音显示从-60开始的分贝值。当声音变大时,该值会继续增大。此对象记录的最大值为0.0000。请向我们解释如何解释这些值 根据文件,我们得到的数值是数字分贝,需要转换为模拟值,请建议是否有任何方法


    提前感谢

    数字音频由具有特定绝对范围的采样值组成(对于CD类型音频为32767到-32768,对于浮点型音频为+1.0到-1.0)。我假设Cocoa生成浮点音频数据


    分贝值是体积的相对对数度量。分贝值为0表示音量尽可能大,对应于绝对采样值+1.0或-1.0。给出了将分贝值转换为增益的公式(与分贝相比,增益是体积的简单线性倍增)。根据公式,分贝值-20分贝对应的增益为.1,这意味着您的绝对采样值为+0.1或-0.1-40分贝相当于.01增益,-60分贝相当于.001增益。

    我想你的混淆部分与分贝一词有关:分贝是一个对数单位,表示一个值相对于一个参考值的大小(参见)。虽然dB通常用于表示声压或声级,但也有许多不同种类的分贝

    KaudioqueProperty_CurrentLevelMeterDB返回的值以dBFS(分贝满标度)为单位。dBFS是一种纯数字测量,其中0表示样本可以包含的最大值(1.0表示浮点数,32767表示16位样本等),所有其他值均为负值。因此,值为0.5的浮点样本将注册为-6dbfs,因为20*log10(0.5/1.0)=-6.02

    您要做的是将dBFS(数字测量)转换为dBu或dB SPL(两种模拟测量-dBu均参考0.775伏RMS,dB SPL转换为20µPa声压)

    由于dB SPL不是一个国际单位制单位,我的意思是20*log10的测量声源和参考声源之间的声压比,在耳朵处测量。这些是喷气发动机、手提钻、耳语、枪声等的正常值

    您无法准确地执行所需的转换,因为dBFS只是数字信号值相对于其可包含的最大值的度量值-它与dBu或dB SPL或任何其他声压或响度度量值没有直接关系


    使用校准系统可以确定这两个值之间的关系,但对于用于一般消费的应用程序,我不确定您如何攻击这一点。一种可能的方法是测量各种已知频率和声级的麦克风输入电平,然后将数据与您看到的内容关联起来。

    您可能想指出您使用的是哪个平台/API我正在使用cocoa framework和AudioToolbox。framework您能为我推荐一些解决方案吗非常感谢你。你用的是什么硬件?要将dBFS转换为dB SPL,您需要知道一个参考级别。首先,感谢您的宝贵建议,我只想将这些分贝值设置为标准值,就像正常对话中的标准值是60分贝,打鼾是85分贝,汽车喇叭是110分贝,用来追踪这些活动。请告诉我实现这一目标的方法,我将非常感谢你们。@yogendra:sbooth的回答很好地解释了分贝单位是如何工作的。在您的例子中,您提到的噪声只有在记录到采样值数组(如WAV文件或CD中的内容)中时才能由软件进行分析。在此录制过程中,无论声音是什么,峰值振幅都不可能高于最大值(CD音频为32767,浮点为+1.0)。在现实世界中,声音可能越来越大,但音量没有(实际)上限。因此,声音的振幅是以正分贝为单位测量的。在数字记录中,音量上限受数据类型的最大值限制,因此振幅通常以负分贝表示,0 dB表示最大值。总而言之,您根本不可能这样做。麦克风旁边的蚊子嗡嗡声录音的声音与头顶飞行的飞机录音的声音一样大(不是真的,但这说明了原理)。一个小错误:1代表最大值。