来自文件的数据的scipy / numpy FFT

时间:2013-12-17 12:58:31

标签: python numpy scipy fft

我查看了许多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赫兹左右。

enter image description here

范围较小:
enter image description here

零点处的最大峰值。

1 个答案:

答案 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()派上用场。