2012-11-02 77 views
0

我想分析一些音频,并尽可能将其分解为正弦波。我之前从未使用过FFT,只是做了一些初步的阅读,以及FFTW和KissFFT等概念和可用库。如何用离散傅立叶变换找到音频中的所有频率?

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

回答

1

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

关闭我的头顶:如果您希望以1Hz为增量提供15kHz范围,则需要15000点FFT,其在44.1kHz意味着您将获得每秒三次的频率曲线。 (我可能会错过2倍,因为我不记得奈奎斯特限制是否意味着您实际上需要30kHz带宽。)

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

+0

这或多或少是正确的,但请注意,重叠FFT以便获得更多频率更加频繁的时变频谱“快照”是很常见的做法。 –

+0

@PaulR,这就是我连接的维基百科文章所要求的STFT,不是吗? –

+1

STFT不一定重叠 - “ST”部分仅意味着“短期”,因为您将DFT/FFT应用于连续的数据块(可能会或可能不会重叠),而不是单个大块整个数据集的DFT/FFT。所以你已经在上面的前两段中描述了STFT,或多或少。 –

2

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

获得足够的解决方案在频域中:“仅在某些频率,基本频率的倍数”为频率

振幅值,是真对傅立叶分解,而不是DFT,这将有一个频率分辨率一定的增量。 DFT的频率分辨率与用于计算DFT的时域信号的采样率和采样数有关。降低频率间隔可以让您更好地区分靠近在一起的两个频率,这可以通过两种方式来完成;

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

如何得出这样一个结论:

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

的替代解决方案:

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

2

你最初的假设是不正确的。 FFT/DFT不会在某些离散频率下给出幅度。这些离散频率仅仅是分箱的中心,每个分箱构成一个带宽为非零带宽的窄带滤波器,根据窗口(矩形,von Hann等)大致为FFT分箱的两个或两个宽度)在FFT之前应用。因此,箱中心之间的频谱内容的振幅将显示出来,但分布在多个FFT结果箱中。

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

如果您的信号间隔较小或噪音水平较高,那么您可能需要较长的数据窗口才能提供更长的FFT以收集足够的分辨率信息。在44.1k采样速率下,长度为256的FFT窗口几乎肯定是太短而无法收集关于低于几百赫兹的频谱内容的足够信息,如果这些频率在你想查看的频率之中,因为它们不能分离干净地从直流偏压(仓0)。

+0

谢谢。我的目标是分析声学乐器和其他自然声音的音频,并将这些信息用于创建虚拟/软件乐器。我从弓弦开始。我应该能够找到大于256的窗口。我只是以此为例。 (当我希望更好地理解事情时,我会在后面标记答案。) –