gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:49:37 24 4
gpt4 key购买 nike

我正在用 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 处看到尖峰,表示找到了周期等于样本数的正弦波。

现在让 wave 更复杂一些

>>> 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 处的尖峰。周期为 nn/3n/5 的正弦波(其中 n 是输入样本的数量)。

编辑

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com