如何用 Cocoa 获得准确的分贝值?

2024-04-12

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

为了实现应用程序目标,我们使用 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;
}

我们有以下一组查询

  1. 录制的声音显示从 -60 开始的分贝值。当声音变大时,该值会继续增加。该对象记录的最大值为 0.0000。请向我们解释如何解释这些值。

根据文档,它说我们得到的值是数字分贝,需要转换为模拟分贝,请建议是否有任何方法可以做到这一点。

提前致谢


我认为您的部分困惑涉及分贝一词:分贝是一个对数单位,表示相对于参考值的大小(请参阅Decibel http://en.wikipedia.org/wiki/Decibel)。尽管 dB 经常用于表示声压或声级,但分贝有许多不同的种类。

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用 Cocoa 获得准确的分贝值? 的相关文章

随机推荐