【问题标题】:FFT and decibel scalesFFT 和分贝标度
【发布时间】:2013-01-30 15:14:19
【问题描述】:

如果我在 iPhone 上获取音频数据(即真实数据),请执行 FFT,然后获取幅度 (Re^2 + Im^2)。

这些数值从 >0 到一些较大的数字不等,因此我使用 10log(n) 以 dB 为单位。

这给了我从负数(对于

但是我看到的例子(以及在 Sonic Visualiser 中绘制频谱)在以 dB 为单位测量时总是具有正频谱。

那么我错过了什么?!

在更广泛的意义上,据我所知,分贝是一个比率,所以在这种情况下,将 FFT 幅度转换为 dB 时,它们与什么比率?

【问题讨论】:

  • 总之,你是对的;这是一个比率。您必须建立一个“参考水平”,如Wikipedia article 中所述。例如,对于光盘,零分贝被认为是可能的最高量级,因此所有其他值都是负数,低至约 -92 分贝。
  • 这不是 stackoverflow.com/questions/2445756/ 的骗子,我专门询问 FFT 箱的输出。这是用麦克风测量声级的一般问题。
  • 可以,但是原理是一样的;那里提供的答案解释了如何建立“参考水平”。
  • 我也阅读了关于此的维基百科文章,其中说音频的参考电平定义为 1dB = 20 微帕斯卡。所以大概对于音频你会去10log(20/val)哪里val是帕斯卡的测量值?我在任何地方都找不到 FFT 的参考电平是多少,或者为什么当其他来源的频谱始终为正时,我会得到负数和正数的混合。我可能错过了一个非常简单的答案!

标签: ios signal-processing fft


【解决方案1】:

简单的答案是,在大多数情况下,您可以将任意数字添加到 dB 值,以使值全部为正,或全部为负,或任何您喜欢的值。使用未经校准的麦克风,例如在 iPhone 上,无论如何这都是有意义的,因为您所知道的只是相对值。

对于更高级的技术方法,使用经过校准的麦克风,您可以使用 dB (SPL) 作为合理标准来引用所有内容,但这很麻烦,而且无论如何在您的用例中没有意义。

理由:
随意移动的主要原因是日志没有报告测量单位。例如,即使您知道输入幅度为 0.1 帕斯卡,也完全可以说这是 100 毫帕斯卡,此时您将采用 100 而不是 0.1 的对数(因此对数值为 2 或 -1)。两者都是完全有效的,选择完全是任意的。与标准参考值(如 dB SPL)进行比较时,请注意它是以比率 log(P/Pref) 的形式完成的,消除了更改单位的影响。

【讨论】:

  • 感谢您的回答,我想这是有道理的。对于其他阅读本文的人来说,这个想法最初让我感到困惑。但是,从日志中添加/减去值显然与在获取日志之前按倍数缩放相同(即 (log(a/b) = log(a) - log(b)),因此本质上您只是在缩放输入(例如,将所有内容除以最小 bin 中的值,因此您的最小值为 1。您需要向所有 bin 添加一个小值,以便它们都非零。
  • @Mark:请参阅我上面的编辑,了解更多关于转移的理由。 (我在答案之后很久就添加了这个,但我一直在唠叨我需要为后续读者澄清这一点。)
【解决方案2】:

由于 FFT 是线性算子,因此 FFT 的输出比例与输入到 FFT 的数据比例有关。 iPhone 上 FFT 的输入比例取决于麦克风、音频滤波器的增益,可能还有 AGC 和 DAC 参考。由于后者都没有记录并且可能会有所不同(根据麦克风的位置、设备型号、可能取决于音频会话配置的输入增益等),除非您执行某种校准,否则您不会知道该比率一个已知的参考。

【讨论】:

  • 我的主要困惑是,为什么我会得到 +ve 和 -ve 值的混合,而当我使用其他包绘制 dB 值时,这些值总是 +ve?上面的tom10提供了一个建议,你可以随便加一个数字让它们都+ve,这听起来有点奇怪!
  • 简单。这些其他软件包只是将输入、输出和/或 dB 结果缩放到所需范围内,这取决于它们与所需参考值的关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 2017-08-02
相关资源
最近更新 更多