FFT和分贝刻度

5
如果我在iPhone上获取音频数据(即真实数据),执行FFT,然后取幅值(Re^2 + Im^2)。
这些值从大于0到一些大数值变化,因此我使用10log(n)将其转换为dB。
这给我负值的输出(对于小于1的输入)到正值。
但是我看到的示例(并在Sonic Visualiser中绘制频谱)始终具有以dB测量时的正频谱。
那么我错过了什么?!
在更广泛的范围内,据我所知,分贝是一个比率,因此在这种情况下,将FFT幅度转换为dB时,它们是相对于什么的比率?

可能重复:https://dev59.com/43E95IYBdhLWcg3wHqSl - Robert Harvey
1
简而言之,你是正确的;这是一个比率。你必须建立一个“参考电平”,就像Wikipedia文章中所描述的那样。例如,在紧凑型光盘中,零分贝被认为是可能最高的幅度,因此所有其他值都将是负数,下降到大约-92分贝。 - Robert Harvey
这并不是 stackoverflow.com/questions/2445756/ 的重复问题,我特别是在询问从 FFT 二进制中输出的内容。这是一个测量麦克风声音级别的一般性问题。 - Mark
好的,但原则是相同的;那里提供的答案解释了如何建立“参考水平”。 - Robert Harvey
我也阅读了维基百科上的文章,其中提到音频的参考电平定义为1dB = 20微帕斯卡。因此,对于音频,你应该使用 10log(20/val) 公式来计算,其中 val 是以帕斯卡为单位的测量值。但是我找不到FFT的参考电平在哪里,也不知道为什么其他来源的频谱总是正数,而我却得到了一些负数和正数混合的结果。可能有一个非常简单的答案,我只是错过了它! - Mark
你的FFT输入是浮点数还是整数?范围是多少? - c.fogelklou
2个回答

4
简单来说,大部分情况下,您可以将任意数字添加到dB值中,以使所有值都为正数、负数或您喜欢的任何值。对于像iPhone上的未校准麦克风这样的设备,这就是唯一有意义的事情,因为您所知道的只是相对值。
对于更高级的技术方法,使用校准麦克风,您可以使用dB(SPL)作为合理的标准来参考所有内容,但这很麻烦,在您的用例中也没有意义。
原理: 将值移动一个任意量的主要原因是对数不报告度量单位。例如,即使您知道输入幅度为0.1帕斯卡,完全可以说这是100毫帕斯卡,其中您将取100而不是0.1的对数值(因此对数值为2或-1)。两者都是完全有效的,选择完全是任意的。在与标准参考值进行比较时,如dB SPL,注意它是作为比率log(P/Pref)完成的,消除了更改单位的影响。

谢谢你的回答,我想这很有道理。对于其他人来说,这个想法最初让我感到困惑。然而,从日志中添加/减去值显然与在取日志之前按倍数缩放相同(即(log(a/b) = log(a) - log(b)),因此基本上您只是缩放输入(例如,将所有内容除以最小箱中的值,使您的最小值为1。您需要向所有箱添加一个小值,以便它们都不为零。 - Mark
@Mark:请看我上面的编辑,了解更多关于转移的原因。(我在回答之后很久才添加这个内容,但一直在提醒我需要为后来的读者澄清这一点。) - tom10

0

由于FFT是一个线性运算符,FFT的输出比例与输入到FFT的数据比例有关。在您的iPhone上输入到FFT的比例取决于麦克风的增益、音频滤波器、可能的自动增益控制和DAC参考电压。由于后者都是未记录并且可能会有所不同(由于麦克风的位置、设备型号、输入增益可能取决于音频会话配置等因素),除非您对已知参考进行某种校准,否则您将不会知道比例。


我的主要困惑是,为什么我得到了一些正值和负值的混合,而当我使用其他软件包绘制dB值时,这些值总是正值?上面的tom10提供了一个建议,即您可以添加任意数字使它们全部变成正数,这听起来有点奇怪! - Mark
容易。 那些其他包只是将输入、输出和/或dB结果缩放到所需范围,这取决于它们与所需参考值的关系。 - hotpaw2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接