iphone - 如何在 iPhone 中使用 AVAudioRecorder 计算 1/3 倍频程的 dB(A) 值

标签 iphone audio microphone avaudiorecorder decibel

我使用了 AVAudioRecorder 和 AVAudioSession,它们给出了 0(非常响亮)到 -160(接近静音)范围内的分贝值。在应用程序中,我必须为从 iPhone 麦克风接收到的实时音频测量绘制 A 级即 dB(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个Octave频段中所有中心频率的不同dB值?如果是,怎么办? 4. 谁能推荐一个解决方案、开源库、iPhone 代码引用吗?

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

最佳答案

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

对于1/3倍频程分析器:让我们从倍频程的定义开始。 Octave 音阶意味着频率加倍或减半。所以 20Hz 和 40Hz 相差一个 Octave 。如果将一个 Octave 音阶对数划分为 3 个范围,这些范围称为 1/3 倍频程频带。

1/3倍频程分析仪的工作是以米的形式显示 给定频率上每个频段的电平 范围。选择 20Hz 至 20kHz 的范围,这是您要使用的第一个仪表 有一个指示电平的条,中心频率为 20Hz, 频带下限为 17.8 Hz,频带上限为 22.4 Hz 赫兹。依此类推。

最常见的实现方式是通过银行 带通滤波器,每个都调谐到中心之一 频率。然后,您获取过滤器的输出并计算 RMS,即成为该频段的电平。如果你是 如果用软件来做这件事,那么就有相当数量的 DSP 设计滤波器和计算所需的知识 开销相当高(31 个滤波器覆盖 20Hz 至 20kHz)。

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

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

bin 宽度等于采样率/FFT 长度。 66536分 48kHz 的 FFT 给出的 bin 宽度为 0.73Hz。 Bin 24 有一个较低的垃圾箱 限制为 17.58,垃圾箱中心为 17.95,这是合理的 接近 1/3 倍频程滤波器的频带下限。和垃圾箱 30上限为22.71,中心为22.34,合理 接近22.4Hz。正如您可能注意到的,您正在介绍一些 由于 FFT 的频率分辨率而产生的误差量。你 可以通过增加 FFT 的大小来减少此误差。

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

关于iphone - 如何在 iPhone 中使用 AVAudioRecorder 计算 1/3 倍频程的 dB(A) 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25485805/

相关文章:

iphone - UISegmentedControl 截断段标题

ios - 如何以编程方式获取 iPhone 的 IMEI 号码?

audio - 如何使用 ffmpeg 或 eac3to 将 2 个音频文件合并为一个?

iphone - 音频服务功能帮助

android - 静音手机时应用程序卡住

python - 用Qpython录制声音

iphone - 是否可以让您上传的 iPhone 应用程序自动更新?

iphone - 如何从十六进制值转换为 UIColor?

android - 在Android中播放sdcard0发出的声音

iphone - 使用 SCListener 监听 iPhone 麦克风并同时播放音乐 : how?