如何解释scipy.fftpack.fft的输出?

时间:2017-10-28 18:21:17

标签: python numpy scipy

我有44100Hz的音频,这意味着每秒有44100个样本。我想分析它,所以我将数据分成长度为1024的子数组。

对于每个数组,我应用傅里叶变换(fft),它返回一个复数数组。这些数字应该是移位和相位值。

结果的长度为1024,就像一个块。但我不知道,数组的哪个元素对应于哪个频率。我检查了documentation,但我唯一能够找到的是结果是对称的,我可以跳过第一部分。

from scipy.fftpack import fft

res = fft(chunk)

但是如何才能找出结果中给定指数的频率是多少?

1 个答案:

答案 0 :(得分:2)

你可以通过对纯音进行FFT来直接看到这一点。在这里我比较:常数函数(零频率),频率1(周期=采样间隔),频率2(周期=采样间隔的一半),依此类推:

import numpy as np
from scipy.fftpack import fft
arr = np.linspace(0, 2*np.pi, 9)[:-1]
for k in range(5):
  print np.round(np.abs(fft(np.cos(k*arr))), 10)

结果:

[ 8.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  4.  0.  0.  0.  0.  0.  4.]
[ 0.  0.  4.  0.  0.  0.  4.  0.]
[ 0.  0.  0.  4.  0.  4.  0.  0.]
[ 0.  0.  0.  0.  8.  0.  0.  0.]

因此,第0个条目是常数项,条目1和-1用于频率,其周期是我们采样的时间间隔;条目2和-2的周期是采样时间间隔的一半; 3和-3的周期是采样时间间隔的1/3等,直到我们达到Nyquist frequency

对于大小为1024的样本:

  • 1和-1是采样率的1/1024频率
  • 2和-2用于采样率的频率2/1024
  • 3和-3用于采样率的频率3/1024
  • ...
  • 512用于奈奎斯特频率,1/2 = 512/1024的采样率