Python 中的快速傅立叶变换?

问题描述 投票:0回答:1

我有这个带有振荡的数据集:

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)')

我想知道脚本是否正确。

python signal-processing fft continuous-fourier
1个回答
0
投票

您的原始代码中有两个实际错误:

  • 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 数据图,这似乎是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.