为了实现应用目标,我们使用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获得准确的分贝水平?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)