我在处理FFT数据时遇到了一些小问题。我查看了很多FFT的例子,但是没有一个能满足我的需求。我有一个采样率为44kHz的随机波形文件,我希望每隔X毫秒获取N个谐波的幅值,比如说100毫秒应该足够了。我尝试了以下代码:
import scipy.io.wavfile as wavfile
import numpy as np
import pylab as pl
rate, data = wavfile.read("sound.wav")
t = np.arange(len(data[:,0]))*1.0/rate
p = 20*np.log10(np.abs(np.fft.rfft(data[:2048, 0])))
f = np.linspace(0, rate/2.0, len(p))
pl.plot(f, p)
pl.xlabel("Frequency(Hz)")
pl.ylabel("Power(dB)")
pl.show()
这是我使用的最后一个例子,在stackoverflow上找到的。问题是,它得到了我想要的大小和频率,但完全没有时间。据我所知,FFT分析是三维的,而这是所有谐波的“合并”结果。我得到了这个:X轴 = 频率、Y轴 = 大小、Z轴 = 时间(不可见)。
根据我的代码理解,t是时间,似乎是可以使用的,但在代码中不需要。p是功率数组(或大小),但看起来像是每个频率f的所有大小的平均值,而f是频率数组。我不想要平均/合并值,我想要每X毫秒N个谐波的幅度大小。
简而言之,我们可以得到:所有频率的1个幅度大小。
我们想要:N个频率的所有幅度大小,包括出现某个幅度大小的时间。
结果应该像这样的数组:[时间,频率,振幅]。因此,如果我们想要三个谐波,它会看起来像:
[0,100,2.85489] #100Hz harmonic has 2.85489 amplitude on 0ms
[0,200,1.15695] #200Hz ...
[0,300,3.12215]
[100,100,1.22248] #100Hz harmonic has 1.22248 amplitude on 100ms
[100,200,1.58758]
[100,300,2.57578]
[200,100,5.16574]
[200,200,3.15267]
[200,300,0.89987]
可视化并不是必需的,结果只需要按上面列出的数组(或哈希/字典)形式呈现。