2

我使用了 AVAudioRecorder 和 AVAudioSession,它们以分贝为单位提供了 0(非常响亮)到 -160(接近静音)范围内的值。在应用程序中,我必须为从 iPhone 麦克风接收的实时音频测量绘制 A 级 iedB(A) 曲线。

我正在执行以下程序 -

  1. 从 AVAudioRecorder 获取 dB 值

    NSDictionary* recorderSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [NSNumber numberWithInt:kAudioFormatAppleIMA4],AVFormatIDKey,
                                      [NSNumber numberWithInt:44100],AVSampleRateKey,
                                      [NSNumber numberWithInt:1],AVNumberOfChannelsKey,
                                      [NSNumber numberWithInt:8],AVLinearPCMBitDepthKey,
                                      [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
                                      [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
                                      nil];
    float dbValue = [self.recorder averagePowerForChannel:0]; //which returns a dB value in 0 to -160 range
    
  2. 获得一个正的dB值,float posdBValue = dbValue+160; 例如,如果 dbValue=-100,则 posdBValue = -110+160 = 50dB

  3. 通过为不同的 1/3 倍频程频带添加 A 加权来计算 dB(A) 值 A 加权值参考 - http://personal.cityu.edu.hk/~bsapplec/single.htm

    • 31.5Hz 时的 dB(A) = 50 -39.4 = 10.6;
    • 40 Hz 时的 dB(A) = 50 -34.6 = 15.4
    • 50 Hz 时的 dB(A) = 50 -30.2 = 19.8
  4. 在图表上绘制 dB(A) 值与频率带的关系

问题 1. 这是从分贝中找出 dB(A) 值的正确方法吗?2. 应该使用 FFT 吗?如果是,FFT 在哪里以及如何适合计算?3. 基于从averagePowerForChannel方法返回的单个 dB 值,我是否必须为 24 个倍频程频带中的所有中心频率计算不同的 dB 值?如果是,如何?4. 任何人都可以提出解决方案、开源库、iPhone 代码参考吗?

我完全不知所措。我觉得我错过了一些东西。请帮忙!我现在只需要弄清楚计算和逻辑。谢谢你。

4

1 回答 1

2

在您关于通过添加任意 dB 值获得 dB(A) 值的第一个问题中:我认为答案是否定的,这是不正确的。在数字音频中,0dB 被认为是较低幅度为负的满量程信号。

至于 1/3 倍频程分析器:让我们从倍频程的定义开始。八度音程是指频率加倍或减半。所以 20Hz 和 40Hz 相差一个八度。如果将一个八度音程以对数方式划分为 3 个范围,则称为 1/3 八度音程带。

1/3 倍频程分析仪的工作是以米的形式显示给定频率范围内每个频段的电平。选择 20Hz 到 20kHz 的范围,第一个仪表会有一个指示电平的条形,中心频率为 20Hz,频带下限为 17.8 Hz,频带上限为 22.4 Hz。等等。

最常见的实现方式是使用一组带通滤波器,每个滤波器都调谐到一个中心频率。然后,您从滤波器获取输出并计算 RMS,这将成为该频段的电平。如果您在软件中执行此操作,那么设计滤波器需要相当多的 DSP 知识,并且计算开销相当高(31 个滤波器覆盖 20Hz 到 20kHz)。

另一种方法是使用 FFT。使用这种方法,目标是将中心频率周围的 FFT 箱集中在一起并计算总能量。诀窍在于选择要集中的频段,因为 FFT 箱的间隔以赫兹为单位。

我不知道您记录的采样率是多少,但很容易计算出您的 bin 宽度和 bin 中心将是多少:

bin 宽度等于 sampleRate/FFTlength。48kHz 的 66536 pt FFT 给出 0.73Hz 的 bin 宽度。Bin 24 的 bin 下限为 17.58,bin 中心为 17.95,这相当接近 1/3 倍频程滤波器的频带下限。而 bin 30 的上限为 22.71,中心为 22.34,合理地接近 22.4Hz。您可能会注意到,由于 FFT 的频率分辨率,您会引入一些误差。您可以通过增加 FFT 的大小来减少此错误。

这是我用来查找 FFT 频率和 1/3 倍频程滤波器频率的计算器:http ://www.zytrax.com/tech/audio/calculator.html

于 2014-08-26T00:44:00.723 回答