我们如何从python中执行FFT后获得的一组复数中获得频率的大小?

时间:2010-09-12 14:33:04

标签: python

我不知道在wav文件中从FFT获得一组复数后该怎么办。如何获得相应的频率。这是执行FFT后得到的输出,如下所示

[ 12535945.00000000    +0.j            -30797.74496367 +6531.22295858j
    -26330.14948055-11865.08322966j ...,     34265.08792783+31937.15794965j
    -26330.14948055+11865.08322966j    -30797.74496367 -6531.22295858j]

3 个答案:

答案 0 :(得分:4)

实际上,abs(x)操作仅将结果列表中的实/虚对转换为幅度。这样做除非你想保留想象部分以备将来使用。因此,转换后,结果列表中的每个数字代表频谱中特定频率的信号幅度。所以频率由列表索引表示。在XY图上绘制数据时,您看到的是源信号包含的频率大小。不要忘记只有前半部分数据有效。由于混叠,另一半通常是前半部分的镜像。

例如,假设您在包含以10Khz采样的数据的wav文件上运行1024点FFT。 FFT将采用10Khz频谱并将其划分为1024个“频段”。然后,FFT将决定源wav文件中每个频谱块的数量。你的输出应该是那些箱子。通常,当我进行频率分析时,我得到的实际数字并不重要。它是我感兴趣的相对于周围垃圾箱的大小。


稍微详细一点,我们依赖于叠加原理,该原理指出任何包含许多频率的时变信号都可以分成许多信号,每个信号包含一个分量频率,反之亦然。因此FFT输出反映了这个属性。输出列表的每个值表示源信号中存在的单个频率信号(通常称为“bin”)的幅度。将所有这些信号组合在一起,你应该得到你的源信号。

哦,如果您不知道,由于奈奎斯特规则(或法律,不确定),只有结果列表的前半部分有效,该规则表明所有采样系统只能复制信号中的频率大部分采样频率。因此,如果您以10Khz采样信号,则只能从采样期间采集的数据中再现高达5Khz的频率。同样的原理是只有前半部分FFT数据有效的原因。下半场是上半场的别名。

对于冗长的解释感到抱歉,你的问题没有表明你有什么经验所以我认为需要对FFT的一般要点进行解释。

答案 1 :(得分:1)

正如@KennyTM已就重复问题解释:

频率由阵列的索引决定。每个元素对应一个频率。

要确定每个元素所代表的频率,您需要知道数据的采样频率和数组的长度。

基本上,它会是这样的:

sampling_freq = 1000.0 # in Hz
freq = np.linspace(0, (1.0 / sampling_freq / 2.0), (x.size / 2) + 1)

对于fft阵列的一半(关于中心对称)。不过,我的记忆很生疏,所以这可能有点不对......

无论哪种方式,numpy都有一个辅助函数来为你完成:numpy.fft.fftfreq

答案 2 :(得分:0)

如果我没记错,可以通过计算复数的大小来获得频率。因此,每个复数上的简单abs(x)都应返回频率。