我们正在创建一个记录周围声音的应用程序,并在声音超过指定的Decibel时采取必要的操作。
为了实现应用目标,我们使用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;
}
我们有以下一组查询
根据文档,它说我们得到的值是数字分贝,需要转换为模拟,请建议是否有任何方法。
提前致谢
答案 0 :(得分:11)
我认为你的混淆部分涉及分贝这个术语:分贝是一个对数单位,表示相对于参考的值的大小(见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 V RMS和dB SPL参考20μPa声压)。
由于dB SPL不是SI单位,因此我指的是在耳朵处测量的源和参考之间的测量声压的比率的20 * log10。这些是喷气发动机,手提钻,耳语,枪声等的正常值。
您无法准确执行所需的转换,因为dBFS只是衡量数字信号相对于其可包含的最大值的值 - 它与dBu或dB SPL或任何其他声压测量值没有直接关系或响度。
使用校准系统可以确定两个值之间的关系,但是对于一般消耗的应用程序,我不确定如何攻击它。一种可能的方法是测量各种已知频率和声级的麦克风输入电平,然后将数据与您所看到的相关联。
答案 1 :(得分:1)
数字音频由具有特定绝对范围的样本值组成(CD类型音频为32767至-32768,浮点数为+1.0至-1.0)。我假设Cocoa会产生浮点音频数据。
分贝值是体积的相对对数度量。分贝值为0意味着音量尽可能大,这对应于+1.0或-1.0的绝对样本值。 This earlier question给出了将分贝值转换为增益的公式(增益,与分贝相比,是一个简单的线性乘数)。根据公式,-20 dB的分贝值对应于.1的增益,这意味着您的绝对样本值将为+0.1或-0.1。 -40 dB相当于.01增益,-60 dB相当于.001增益。