如何使用离散傅里叶变换找到音频中的所有频率?

时间:2012-11-02 01:25:14

标签: fft dft

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

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

3 个答案:

答案 0 :(得分:2)

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

在频域中获得足够的解决方案:

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

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

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

    另类解决方案:

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

答案 1 :(得分:2)

您的初步假设不正确。 FFT / DFT不会仅在某些离散频率下提供幅度。那些离散频率只是箱的中心,每个箱构成一个窄带滤波器,主波瓣的非零带宽,大约是FFT箱分离的宽度或两个,取决于窗口(矩形,冯汉等) 。)在FFT之前应用。因此,二进制中心之间的频谱内容幅度将显示,但会扩展到多个FFT结果区间。

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

如果您的信号间隔较小或噪声级别较高,则可能需要更长的数据窗口来提供更长的FFT以收集足够的分辨率信息。在44.1k采样率下长度为256的FFT窗口几乎肯定太短,无法收集有关频谱内容低于几百Hz的足够信息,如果这些信息属于您希望检查的频率,因为它们不能与DC偏压(bin 0)完全分开。

答案 2 :(得分:1)

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

离开我的头顶:如果你想要1Hz增量的15kHz范围,你需要15000点FFT,44.1kHz意味着你将获得每秒三次的频率图。 (我可能会错过因子2,因为我无法回想奈奎斯特限制是否意味着你实际上需要30kHz的带宽。)

您可能也对Short-time Fourier transform感兴趣。它并没有解决基本的权衡问题,但在实践中可能会得到你想要的东西。