如何通过离散的傅立叶变换找到音频中的所有频率



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

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

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

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

对于傅立叶分解而非DFT,

频率"仅在某些频率,基本频率的倍数"的幅度值是正确的,而DFT将具有一定的增量的频率分辨率。DFT的频率分辨率与用于计算DFT的时域信号的采样率和样品数量有关。降低频率间距将使您有更好的能力区分两个频率,这可以通过两种方式完成;

  1. 降低采样率,但这将使周期性重复的频率更近。(在这里记住Nyquist定理)
  2. 增加您用于计算DFT的样品数量。如果只有256个样本可用,则可以执行"零填充",其中将0值样本附加到数据末尾,但是需要考虑一些效果。

如何得出结论:

如果将不同音频信号的频率内容描绘成各个图形,您会发现振幅不同。这是因为单个信号在声音中不会相同,并且任何信号(来自周围环境和硬件本身)中始终存在噪声。因此,您要做的是取平均两个或多个DFT信号以消除噪声并更准确地表示频率内容。根据您的应用程序,如果您捕获的声音随着时间的流逝而迅速变化(例如,语音或音乐),则可能是不可能的。因此,只有在所有平均信号的声音上几乎相等的情况下(单独的单独录音"同一事物")才有用。只是为了澄清,例如,从四个时间域信号中澄清,您需要创建四个频域信号(使用DFT方法),然后将四个频域信号的平均值计算为单个平均频域信号。这将消除噪音,并为您提供更好的表示音频固有的频率。

替代解决方案:

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

您的初始假设不正确。FFT/DFT不会仅在某些离散频率下给您振幅。这些离散的频率仅是垃圾箱的中心,每个垃圾箱构成一个狭窄的滤波器,其主叶具有非零带宽,大约是FFT垃圾箱分离的宽度或两个宽度,取决于窗口(矩形,von Hann等)。)在FFT之前应用。因此,将显示箱中心之间光谱含量的幅度,但分布在多个FFT结果箱中。

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

如果您的信号分离较小或噪声水平较高,则可能需要更长的数据窗口来馈送更长的FFT以收集足够的分辨率信息。如果您想看到的频率是,则以44.1k的样本速率以44.1k的样本速率为44.1K的FFT窗口几乎可以肯定太短,无法收集有关光谱内容的足够信息,因为它们是您希望看到的频率之一从直流偏置(bin 0)。

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

我的头顶:如果您想要以1Hz增量的15kHz范围,则需要15000点FFT,这在44.1kHz时意味着您将获得每秒三次的频率图。(我可能缺少其中2个,因为我不记得Nyquist限制是否意味着您实际上想要30kHz带宽。)

您也可能对短期傅立叶变换感兴趣。它不能解决基本的权衡问题,但实际上可能会给您带来想要的东西。

最新更新