我查看了许多scipy.fft和numpy.fft的例子。具体来说,这个例子Scipy/Numpy FFT Frequency Analysis与我想要做的非常相似。因此,我使用相同的子图定位,一切看起来非常相似。
我想从一个文件中导入数据,该文件只包含一列,以使我的第一次测试尽可能简单。
我的代码写得像这样:
import numpy as np
import scipy as sy
import scipy.fftpack as syfp
import pylab as pyl
# Read in data from file here
array = np.loadtxt("data.csv")
length = len(array)
# Create time data for x axis based on array length
x = sy.linspace(0.00001, length*0.00001, num=length)
# Do FFT analysis of array
FFT = sy.fft(array)
# Getting the related frequencies
freqs = syfp.fftfreq(array.size, d=(x[1]-x[0]))
# Create subplot windows and show plot
pyl.subplot(211)
pyl.plot(x, array)
pyl.subplot(212)
pyl.plot(freqs, sy.log10(FFT), 'x')
pyl.show()
问题在于我总是将我的峰值精确地归零,这根本不应该是这种情况。它确实应该出现在200赫兹左右。
范围较小:
零点处的最大峰值。
答案 0 :(得分:3)
正如已经提到的,看起来你的信号有一个直流分量,它会在f = 0时产生一个峰值。尝试删除平均值,例如arr2 = array - np.mean(array)
。
此外,为了分析信号,您可能需要尝试绘制功率谱密度。:
import matplotlib.pylab as plt
import matplotlib.mlab as mlb
Fs = 1./(d[1]- d[0]) # sampling frequency
plt.psd(array, Fs=Fs, detrend=mlb.detrend_mean)
plt.show()
查看plt.psd()
的文档,因为有很多选项可供选择。为了研究频谱随时间的变化,plt.specgram()
派上用场。