我有这个带有振荡的数据集:
y = array([ 9.88706879e-05, -1.80853647e-05, 2.42572582e-05,
1.12215205e-04,
1.32105126e-04, 1.13424614e-05, -1.58262175e-04, -2.62013276e-04,
-2.58070932e-04, -1.53975865e-04, -8.19357356e-05, -1.55734157e-04,
-2.90791620e-04, -3.70294471e-04, -3.46855608e-04, -2.23495910e-04,
-1.35441615e-04, -2.11411786e-04, -4.21891416e-04, -6.77753516e-04,
-8.09657243e-04, -6.97948704e-04, -5.01935670e-04, -4.20075723e-04,
-5.28464040e-04, -8.14942203e-04, -1.03669983e-03, -9.76604755e-04,
-7.50889655e-04, -5.34882634e-04, -4.06928662e-04, -3.96093220e-04,
-4.31306957e-04, -4.25399844e-04, -3.26933980e-04, -1.32440493e-04,
5.40550849e-06, -4.87299567e-05, -2.04672372e-04, -3.15870097e-04])
x = array([-25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35,
40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100,
105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165,
170])
如何在 Python 中测量快速傅里叶变换?
这是 FFT 的输出:
N = np.shape(x)
T = (200/N)*10e-12 #time step in sec
xf = fftfreq(N,1/T)[:N//2]
yf = fft(y)
plt.figure()
plt.plot(xf, 2.0/N*np.abs(yf[0:N//2]))
plt.xlabel('freq.(Hz)')
plt.ylabel('f(t)')
我想知道脚本是否正确。
您的原始代码中有两个实际错误:
10e-12
不是 10^-12;是 10^-11。使用 1e-12
表示 10^-12
N = np.shape(x)
导致 N
成为一个元组,这在代码的其他部分中不应该起作用。因此给定的代码失败并显示 TypeError
。
但这并不能解决你的问题。我对 FFT 不太熟悉,但是稍微简化一下代码,结合一些直觉(可能不正确),我可以获得以下看似正确的结果:
N = len(x)
dt = 5e-12
xf = fftfreq(N, dt)[:N//2]
yf = fft(y)
plt.figure()
plt.plot(xf, 2.0/N * np.abs(yf)[0:N//2])
plt.xlabel('freq.(Hz)')
plt.ylabel('f(t)')
(“神奇”
5e-12
可以通过多种方式获得。一种方法是dt = (x[1] - x[0]) * 1e-12
,假设x
的间距相等(无论如何它都应该有)并转换为秒。)
这会产生下图。 3e10 Hz 附近有一个小峰值,大约等于 1 / 3e10 = 3.3e-11 秒或 33 皮秒的周期。看看你问题中的 x-y 数据图,这似乎是正确的。