3

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

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

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

提前致谢

4

2 回答 2

11

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

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

于 2009-08-15T16:10:25.083 回答
1

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

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

于 2009-08-15T12:07:17.970 回答