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

如何用Cocoa获得准确的分贝水平?,第1张

概述我们正在创建一个记录周围声音的应用程序,并在声音超过指定的Decibel时采取必要的 *** 作. 为了实现应用目标,我们使用AudioQueueObject.h中的以下方法 - (void) getAudioLevels: (Float32 *) levels peakLevels: (Float32 *) peakLevels {UInt32 propertySize = audioFormat. 我们正在创建一个记录周围声音的应用程序,并在声音超过指定的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;}

我们有以下一组查询

>录制的声音以-60开头显示Decibel中的值.当声音变大时,此值会继续增加.使用此对象记录的最大值为0.0000.请解释我们如何解释这些价值观.

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

提前致谢

解决方法 我认为你的混淆部分涉及分贝这个术语:分贝是一个对数单位,表示相对于参考的值的大小(见 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.这些是喷气发动机,手提钻,耳语,q声等的正常值.

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

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

总结

以上是内存溢出为你收集整理的如何用Cocoa获得准确的分贝水平?全部内容,希望文章能够帮你解决如何用Cocoa获得准确的分贝水平?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1070584.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存