1

我想分析一些音频并尽可能地将其分解为正弦波。我以前从未使用过 FFT,只是在做一些初步阅读,了解一些概念和可用的库,如 FFTW 和 KissFFT。

我在这一点上感到困惑......听起来DFT / FFT只会在某些频率下为您提供正弦幅度,即基频的倍数。例如,如果我以通常的 44100 Hz 对音频进行采样,并且我选择了一大块 256 个样本,那么该卡盘可能适合 44100/256=172Hz 的一个周期,并且 DFT 将给我 172 的正弦幅度, 172*2, 172*3 等等,对吗?那么你如何找到其他频率的强度呢?我想看到从 20Hz 到大约 15Khz 的频谱,以大约 1Hz 的增量。

4

3 回答 3

3

傅立叶分解允许您获取任何时间函数并将其描述为正弦波的总和,每个正弦波具有不同的幅度和频率。但是,如果您想使用 DFT 解决此问题,则需要确保在频域中有足够的分辨率以区分不同的频率。一旦你有了它,你就可以确定哪些频率在信号中占主导地位,并创建一个由与这些频率相对应的多个正弦波组成的信号。您说得对,采样频率为 44.1 kHz,仅查看 256 个样本,您能够在这 256 个样本中检测到的最低频率是 172 Hz 的频率。

在频域中获得足够的分辨率:

频率的幅度值“仅在某些频率,基频的倍数”,对于傅里叶分解是正确的,而不是 DFT,它将具有一定增量的频率分辨率。DFT 的频率分辨率与用于计算 DFT 的时域信号的采样率和样本数有关。减小频率间隔将使您能够更好地区分靠近的两个频率,这可以通过两种方式完成;

  1. 降低采样率,但这会使频率上的周期性重复更靠近。(记住这里的奈奎斯特定理)
  2. 增加用于计算 DFT 的样本数。如果只有 256 个样本可用,则可以执行“零填充”,其中将 0 值样本附加到数据的末尾,但是需要考虑对此的一些影响。

如何得出结论:

如果您将不同音频信号的频率内容描绘成单独的图表,您会发现幅度略有不同。这是因为各个信号的声音不会相同,并且任何信号中总是存在固有的噪声(来自环境和硬件本身)。因此,您要做的是取两个或多个 DFT 信号的平均值以去除噪声并获得更准确的频率内容表示。根据您的应用程序,如果您正在捕获的声音随着时间的推移而显着变化(例如语音或音乐),这可能是不可能的。因此,仅当所有要平均的信号在声音上几乎相等时(“同一事物”的单独单独录音),平均才有用。只是为了澄清,例如,从四个时域信号,您想创建四个频域信号(使用 DFT 方法),然后将四个频域信号的平均值计算为单个平均频域信号。这将消除噪音并让您更好地表示音频中固有的频率。

另一种解决方案:

如果您知道您的信号应该包含一定数量的主频率(不是太多)并且这些是您唯一感兴趣的,那么我建议您使用 Pisarenko 的谐波分解 (PHD) 或多信号分类 ( MUSIC,不错的缩写!)来查找这些频率(及其相应的幅度值)。这比 DFT 在计算上的密集程度低。例如。如果您知道信号包含 3 个主要频率,Pisarenko 将返回这三个频率的频率值,但请记住,DFT 揭示了更多信息,让您得出更多结论。

于 2012-11-02T11:24:46.353 回答
2

你最初的假设是不正确的。FFT/DFT 不会仅在某些离散频率上为您提供幅度。这些离散频率只是 bin 的中心,每个 bin 构成一个窄带滤波器,其主瓣具有非零带宽,大致为 FFT bin 间隔的一两个宽度,具体取决于窗口(矩形、von Hann 等.) 在 FFT 之前应用。因此,bin 中心之间的频谱内容幅度将显示出来,但会分布在多个 FFT 结果 bin 中。

如果关键信号的分离足够大并且噪声水平足够低,那么您可以对 FFT 结果进行插值以检查 bin 中心之间的频率。您可能需要使用高质量的插值器,例如 Sinc 内核。

如果您的信号分离较小或噪声水平较高,那么您可能需要较长的数据窗口来提供较长的 FFT 以收集足够的分辨率信息。在 44.1k 采样率下,长度为 256 的 FFT 窗口几乎可以肯定地太短,无法收集有关低于 100 Hz 的频谱内容的足够信息,如果这些频率属于您希望检查的频率,因为它们无法分离干净地来自直流偏置(bin 0)。

于 2012-11-02T21:04:41.477 回答
1

不幸的是,在信号的固定样本中识别频率存在一定程度的不确定性。如果您使用较短的 FFT,则无法区分相当宽范围内的频率差异。如果您使用长 FFT 在频域中获得更高的分辨率,那么您将无法快速检测到频率变化。这是数学固有的。

突然想到:如果你想要一个 15kHz 的范围,以 1Hz 为增量,你需要一个 15000 点的 FFT,这在 44.1kHz 意味着你将获得每秒 3 次的频率图。(我可能错过了 2 倍,因为我不记得奈奎斯特限制是否意味着您实际上需要 30kHz 带宽。)

您可能还对短时傅里叶变换感兴趣。它不能解决基本的权衡问题,但在实践中可能会得到你想要的。

于 2012-11-02T01:36:16.810 回答