2017-10-28 48 views
1

我有44100Hz的音频,这意味着每秒有44100个采样。我想分析它,所以我将数据分成长度为1024的子数组。如何解释scipy.fftpack.fft的输出?

对于每个阵列,我应用傅立叶变换(fft),它将返回一个复数数组。这些数字应该是转变和阶段价值。

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

from scipy.fftpack import fft 

res = fft(chunk) 

但是,怎么可能找出结果中给定索引处的频率是多少?

回答

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为采样时间间隔的三分之一等,直到我们达到Nyquist frequency

对于大小为1024的一个示例:

  • 1和-1是采样速率
  • 2的频率1/1024和-2是采样率的频率一千零二十四分之二
  • 3和-3是采样速率
  • 的频率1024分之3...
  • 512为奈奎斯特频率,采样率的1/2 = 512/1024