【发布时间】:2014-11-02 07:34:48
【问题描述】:
我可以访问 NumPy 和 SciPy,并希望创建一个数据集的简单 FFT。我有两个列表,一个是 y 值,另一个是那些 y 值的时间戳。
将这些列表输入 SciPy 或 NumPy 方法并绘制结果 FFT 的最简单方法是什么?
我查找了示例,但它们都依赖于创建一组具有一定数量数据点和频率等的假数据,并没有真正展示如何仅使用一组数据和对应的时间戳。
我尝试了以下示例:
from scipy.fftpack import fft
# Number of samplepoints
N = 600
# Sample spacing
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 的数据的粘贴箱
http://pastebin.com/0WhjjMkb http://pastebin.com/ksM4FvZS
当我在整个事情上使用fft() 时,它只是在零处出现了一个巨大的峰值,没有别的。
这是我的代码:
## Perform FFT with SciPy
signalFFT = fft(yInterp)
## Get power spectral density
signalPSD = np.abs(signalFFT) ** 2
## Get frequencies corresponding to signal PSD
fftFreq = fftfreq(len(signalPSD), spacing)
## Get positive half of frequencies
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]')
间距正好等于xInterp[1]-xInterp[0]。
【问题讨论】:
-
向我们展示您的尝试、失败的原因以及您正在使用的示例。
-
我发布了我尝试过的示例以及我的想法,我想我只是对如何正确绘制输出感到困惑。
-
这是一个很好的例子,但问题到底出在哪里?该代码对我很有用。剧情根本就没有出现吗?
-
即,您使用的是哪种参数(我们至少需要查看您的一些数据)
-
我添加了 x 和 y 轴的 pastebin,x 数据以秒为单位,y 数据只是传感器读数。当我将这些数据列表放入 fft 示例时,它只是在零处出现了巨大的峰值