2

我正在用 Python 进行音频分析。我的最终目标是获取频率列表及其各自的音量,例如{ frequency : volume (0.0 - 1.0) }.

我将音频数据作为帧列表,其值介于-1.0和之间+1.0。我在这个列表中使用了 numpy 的傅立叶变换—— numpy.fftpack.fft()。但结果数据对我来说毫无意义。

我确实了解傅立叶变换从时域转换到频域,但在数学上并不完全是这样。这就是为什么我不太了解结果的原因。

  • 返回的列表中的值numpy.fftpack.fft()是什么意思?我如何使用它/解释它?
  • 如上所述对列表执行的傅立叶变换的最大/最小值是多少?
  • 如何以表格形式实现字典的最终目标{ frequency : volume (0.0 - 1.0) }

谢谢你。抱歉,如果我对傅立叶变换的理解不足让您大吃一惊。

4

1 回答 1

4

考虑正弦波单个周期的 FFT:

>>> t = np.linspace(0, 2*np.pi, 100)
>>> x = np.sin(t)
>>> f = np.fft.rfft(x)
>>> np.round(np.abs(f), 0)
array([  0.,  50.,   1.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.])

FFT 返回一个复数数组,给出频率的幅度和相位。假设您只对幅度感兴趣,我习惯于np.abs获取每个频率的幅度,并使用 将其四舍五入为最接近的整数np.round(__, 0)。您可以在索引处看到尖峰,1表明发现了一个周期等于样本数的正弦波。

现在让波浪更复杂一点

>>> x = np.sin(t) + np.sin(3*t) + np.sin(5*t)
>>> f = np.fft.rfft(x)
>>> np.round(np.abs(f), 0)
array([  0.,  50.,   1.,  50.,   0.,  48.,   4.,   2.,   2.,   1.,   1.,
         1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.])

我们现在看到与我们的输入相对应的指标 1、3 和 5 处的尖峰。n周期为和n/3的正弦波n/5(其中 n 为输入样本数)。

编辑

这是傅里叶变换的一个很好的概念解释:http: //betterexplained.com/articles/an-interactive-guide-to-the-fourier-transform/

于 2014-05-12T05:24:16.787 回答