【问题标题】:How to obtain accurate decibel level with Cocoa?如何使用 Cocoa 获得准确的分贝水平?
【发布时间】:2009-08-15 09:02:13
【问题描述】:

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

为了实现应用目标,我们使用 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。请解释我们如何解释这些值。

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

提前致谢

【问题讨论】:

  • 您可能想指出您正在使用哪个平台/API
  • 我正在使用 cocoa 框架和 AudioToolbox.framework 你能建议我一些解决方案吗 Paul 我会非常感谢你。
  • 您使用的是什么硬件?要将 dBFS 转换为 dB SPL,您需要知道参考电平。

标签: cocoa audio core-audio decibel


【解决方案1】:

我认为您的部分困惑与分贝一词有关:分贝是一种对数单位,表示值相对于参考值的大小(请参阅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 或任何其他声压量度没有直接关系或响度。

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

【讨论】:

  • 一个小错字:1代表最大值。
【解决方案2】:

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

分贝值是音量的相对对数度量。分贝值为 0 表示音量尽可能大,这对应于 +1.0 或 -1.0 的绝对样本值。 This earlier question 给出了将分贝值转换为增益的公式(增益与分贝相比,是音量的简单线性乘数)。从公式中,-20 dB 的分贝值对应于 0.1 的增益,这意味着您的绝对样本值将是 +0.1 或 -0.1。 -40 dB 相当于 0.01 增益,-60 dB 相当于 0.001 增益。

【讨论】:

  • 首先感谢您的宝贵建议,我只是想让这些分贝值作为标准值,就像正常的谈话是 60 分贝,打鼾是 85 分贝,汽车喇叭是 110 分贝来跟踪这些活动请向我建议实现这一目标的方法,我将非常感谢你们。
  • @yogendra:sbooth 的回答很好地解释了分贝单位的工作原理。在您的情况下,您提到的噪音只能由您的软件分析,前提是它们被记录到样本值数组中(例如 WAV 文件或 CD 中的内容)。在这个录制过程中,无论声音是什么,峰值幅度都不可能超过最大值(CD 音频为 32767,浮点数为 +1.0)。
  • 在现实世界中,声音只会越来越响亮,而没有(实际的)音量上限。出于这个原因,声音的幅度以正分贝来衡量。在数字录音中,音量的上限受限于数据类型的最大值,所以幅度通常用负分贝表示,0dB代表最大值。
  • 总而言之,你想做的根本不可能。一只蚊子在麦克风旁边嗡嗡作响的录音听起来和一架飞机从头顶飞过的录音一样响亮(不是真的,但这说明了原理)。
猜你喜欢
  • 1970-01-01
  • 2017-01-07
  • 2023-02-12
  • 2020-04-07
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 2018-12-05
相关资源
最近更新 更多