在Python中绘制快速傅里叶变换

21 浏览
0 Comments

在Python中绘制快速傅里叶变换

我可以访问NumPy和SciPy,并且想要创建一个简单的数据集FFT。我有两个列表,一个是y值,另一个是对应y值的时间戳。

将这些列表输入SciPy或NumPy方法并绘制结果的FFT的最简单方法是什么?

我查找了一些例子,但它们都依赖于创建一组带有某个特定数据点数量和频率等的虚假数据,并没有真正展示如何处理仅有一组数据和相应时间戳的情况。

我尝试了以下示例:

from scipy.fftpack import fft
# 样本点数
N = 600
# 样本间距
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
yf = fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
import matplotlib.pyplot as plt
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]))
plt.grid()
plt.show()

但是当我将fft的参数更改为我的数据集并绘制时,得到的结果非常奇怪,频率的缩放似乎有问题。我不确定。

这是我尝试进行FFT的数据的pastebin链接:

http://pastebin.com/0WhjjMkb

http://pastebin.com/ksM4FvZS

当我对整个数据集使用fft()时,只有一个在零处的巨大峰值,没有其他内容。

以下是我的代码:

## 使用SciPy执行FFT
signalFFT = fft(yInterp)
## 获取功率谱密度
signalPSD = np.abs(signalFFT) ** 2
## 获取与信号PSD对应的频率
fftFreq = fftfreq(len(signalPSD), spacing)
## 获取正频率的一半
i = fftfreq>0
##
plt.figurefigsize = (8, 4)
plt.plot(fftFreq[i], 10*np.log10(signalPSD[i]));
#plt.xlim(0, 100);
plt.xlabel('Frequency [Hz]');
plt.ylabel('PSD [dB]')

Spacing只是等于xInterp[1]-xInterp[0]

0