python - 如何理解音频分析中的傅里叶变换结果

标签 python numpy fft frequency-analysis audio-analysis

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

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

我确实了解傅里叶变换从时域变换到频域,但不完全了解它的数学工作原理。这就是为什么我不太明白结果。

  • numpy.fftpack.fft() 返回的列表中的值有何含义?我如何使用它/解释它?
  • 如上所述对列表执行傅里叶变换的最大/最小值是多少?
  • 如何才能实现 {Frequency : Volume (0.0 - 1.0) } 形式的字典的最终目标?

谢谢。如果我对傅里叶变换缺乏了解,让你捂脸的话,我很抱歉。

最佳答案

考虑正弦波单个周期的 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/3n/5 (其中 n 表示输入样本的数量)。

编辑

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

关于python - 如何理解音频分析中的傅里叶变换结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23600820/

相关文章:

android - Xamarin Android 音频 DSP

python : Trying to POST form using requests

python 在计算一般矩阵的特征值时引发语法错误

python - 使用 np.vectorize 时出现 ValueError - 我哪里出错了?

python - 与 numpy 对象数组相比,列表列表在速度方面有哪些优点/缺点?

matlab - 在 MATLAB 中将 FFT 的幅度缩放为 2

python Spark 替代非常大的数据爆炸

python - 如何在不使用 gdata oauth2 工作流程的情况下授权 gdata 客户端?

python - 猴子在Python的另一个模块中修补一个类

python - 为什么 FFT 结果显示单个频率样本有 2 个非零幅度?