在 FFT 中补偿麦克风频率响应

Posted

技术标签:

【中文标题】在 FFT 中补偿麦克风频率响应【英文标题】:Compensating for microphone frequency response in FFT 【发布时间】:2011-07-10 23:49:06 【问题描述】:

我正在制作一个应用程序来显示来自麦克风的声音数据的 FFT。我需要支持的一件事是校准麦克风的频率响应,这将通过校准文件提供给程序。校准文件包含不同频率的 + 或 - dB 值,如下所示:

20 -2.7
50 +0.5
100 +0.7
135 +0.7
190 +1.4
250 +1
370 +0.9
550 +1
700 +0.6
1000 +0.5
1500 +0.4
2000 +0.5
2800 +0.6
2900 +0.4
3000 +0.5
4000 -0.2
4300 -0.2
5600 +0.7
6150 +0.6
12000 +3.5
13000 +3.5
20000 -1.5

我可以在 FFT 之后和屏幕上显示之前应用校准。

我的问题是:我应该如何在这些值之间进行插值,这些值本质上只是麦克风整个频率响应的选择点?一种天真的方法可能是在这些点周围定义刚性矩形带,并为 FFT 中的每个频率选择一条或另一条校准线以应用于该频率。然而,这会导致 FFT 图中出现明显的跳跃。另一种解决方案可能是使用线性插值,但我仍然不确定这是最好的方法。

有没有像 Smaart 或 FFT 设备这样的“标准”方法来执行此操作?从这几个固定点生成连续曲线的最佳方法是什么?

【问题讨论】:

【参考方案1】:

我会使用某种方法(例如 Wiener 或 LMS 方法)对麦克风响应的频率响应进行近似的逆滤波器,或者只是采用简单的方法(参见 cmets)并在计算之前将其应用于记录的信号FFT。如果这不是一个选项,我会线性插值点,因为我不明白为什么这会导致任何“可见的跳跃”。

【讨论】:

谢谢。这可以自动化吗?如果程序的唯一目的只是显示 FFT,那么与仅调整 FFT 输出相比,您认为这种方法的主要优势是什么?它要复杂得多。 好的,我做了我的研究。看起来 Wiener 和 LMS 要求您具有系统的输入和输出信号。为此,我所拥有的只是频率响应曲线,那么使用这些方法是否可行?使用 IFFT (described here) 从频率响应中生成一个滤波器内核并将信号与它进行卷积怎么样? (这将允许我将校准用于非 FFT 事物,例如 SPL 测量。) @tmandry:这应该可行,并且或多或少与我认为的“幼稚”方法相同。除了您在第二条评论中指出的内容之外,我不确定您的方法有什么优势。 太好了,谢谢。虽然我必须问,你为什么认为它幼稚? :) @tmandry:在这种情况下,天真不是一个坏词 :) 我不久前用过,在某处看到它被称为天真,所以我想它一直困扰着我。【参考方案2】:

除非我对校准数据的来源或引起非线性响应的可能机制有相反的了解,否则我会在每对点之间使用线性插值。

【讨论】:

如果这有帮助,校准有时由麦克风制造商提供。其他时候,它是通过“聆听”不同频率的音调并让用户将每个频率的响应校准到已知的良好读数(即来自校准的 SPL 计的读数)来获得的。 另外,spline 可能会产生更平滑的结果;我以前没有想到这一点。你会推荐吗? 希望有比我更有经验的人参与进来。但 FWIW,我认为你不会看到你害怕线性的“跳跃”。

以上是关于在 FFT 中补偿麦克风频率响应的主要内容,如果未能解决你的问题,请参考以下文章

Android:通过fft获取更精确的频率

如何在每个FFT计算中检索不同的原始频率并且在java中没有任何频率泄漏

声音 FFT 频率

声音分析 FFT

Android音频FFT使用audiorecord检索特定频率幅度

计算正弦扫描频率响应的问题