AudioKit中如何将FFT转换为分贝(dB)?

6

第一次发帖,感谢这个伟大的社区!

我正在使用AudioKit并尝试为麦克风输入添加频率加权滤波器,因此我正在尝试理解从AudioKit AKFFTTap输出的值。

目前,我只是尝试打印将FFT缓冲区转换为dB值的结果。

for i in 0..<self.bufferSize {
    let db = 20 * log10((self.fft?.fftData[Int(i)])!)
    print(db)
}

我原本期望的数值范围是-128到0,但我得到了近-200dB的奇怪数值,即使我对着麦克风吹气也只能达到-60。这是我的方法不正确吗?我以为EZAudioFFT引擎输出的值是幅度值,正常的分贝转换应该有效。有人有什么想法吗?
感谢提前讨论此问题!

嘿,Dan Jensen解决了这个问题吗?因为我有与你的问题相同的问题。 - Mahesh Dangar
嗨,保罗,我实际上从未能够在AudioKit中正确地使其工作。 AudioKit非常棒,但我找到了一个对我的情况更有效的不同解决方案,叫做Superpowered。我能够使它按照我预期的方式为这个应用程序工作。https://superpowered.com - Dan Jensen
你解决了吗?你得到了分贝(A)的值吗? - NLU
2个回答

4
数组中的值对应于FFT中的分 bin 值。如果一个单一的 bin 包含了接近于 1 的幅值,则意味着该窄频带内存在大量能量,例如一个非常响亮的正弦波(一个只有一个频率的信号)。
普通的声音(例如你吹麦克风造成的声音)会将它们的能量分散到整个频谱,也就是分布在多个 bin 中,而不仅仅是一个。因此,通常情况下,随着 FFT 大小的增加,幅度会变得更低。
单个 bin 上 -40dB 的幅度相当响亮。如果你尝试播放一个音调,你应该会在其中一个 bin 中看到一个明显的峰值。

在AudioKit中,bin值不是在0-1的比例尺上,它们是包含从零到700-1000以上的值的幅度。如果我能将其转换为0-1的比例尺,那将会非常有帮助,但我没有看到如何在没有明确最大值的情况下完成这项工作。我试图对麦克风吹气来获取参考值,但fft产生的幅度没有一个一致的上限。 - Dan Jensen
你的问题让人觉得这些值在0到1的范围内,只是比你预期的更接近0。 - Matti Jokipii

4

您需要将self.fft?.fftData中的所有值相加(在相加之前,将负值转换为正值),然后将其转换为分贝。


我尝试了你的想法,在self.fft?.fftData中对绝对值求和,确实得到了更合理的结果,但是结果仍然过于敏感。为了测试这个想法,我添加了一个偏移值来使读数与我桌子上的专用SPL计匹配。如果我说话、吹口哨、吹气或产生粉红噪声并比较结果,我的应用程序会跳40dB+,而SPL计只增加7-10 dB。我将其与一些iOS应用程序进行了比较,用于查看分贝读数,它们似乎与SPL计具有类似的结果。有什么想法为什么这会更加敏感? - Dan Jensen
你用多少个样本进行一次计算?是满缓冲区吗?我一直使用标准的Tap,对AKFFTTap没有经验,所以可能会有所遗漏。 - Lu_

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