【问题标题】:Can't find the frequency of the signal using Fourier transform使用傅里叶变换找不到信号的频率
【发布时间】:2021-05-12 21:45:31
【问题描述】:

我使用odeint 整合了一个由 400 个微分方程组成的系统(前 200 个方程是 200 个神经元的 x 分量的方程,另外 200 个 y 分量的方程)。所以我做集成的代码主体是这样的

t_final = 100.0
dt = 0.01
t = np.arange(0, t_final, dt)
sol = odeint(full_derivative, z0, t)
x10 = sol[:,9]
y10 = sol[:,209]

我使用哪个模型并不重要(我不想让事情变得更复杂),但集成部分是正确的。在x10 中有我系统的第 10 个振荡器的 x 分量信号,看起来像这样

很明显,这是一个具有特定周期和频率的周期信号。所以我想做一个傅里叶变换来找到这个频率。我使用此代码进行转换

from scipy import fftpack

f_s = len(t)//2

X = fftpack.fft(x10)
freqs = fftpack.fftfreq(len(x10)) * f_s

fig, ax = plt.subplots()

ax.stem(freqs, np.abs(X))
ax.set_xlabel('Frequency in Hertz [Hz]')
ax.set_ylabel('Frequency Domain (Spectrum) Magnitude')
ax.set_xlim(-f_s / 2, f_s / 2)
#ax.set_ylim(-5, 110)

我得到的结果是这个(这不是很漂亮,因为它表明频率大约为零)。

我可以做些什么来修复我的代码中的错误?

p.s. 也许在这个例子中系统的频率是比较明显的,但是如果我改变我的问题的参数,我最终会得到更复杂的解决方案。这就是我想做傅立叶变换的原因。

【问题讨论】:

  • 直到你得到可靠的结果我建议你使用正弦曲线作为你的输入信号......它给你一个已知的输入频率和一个可预测的输出......用正弦曲线收紧你的代码直到您的输出显示与您的输入匹配的频率,然后担心复杂的输入信号

标签: python python-3.x scipy signal-processing fft


【解决方案1】:

如果第一绘图中的时间单位是秒的时间单位,则该图对我来说是有道理的,因为那么你应该具有接近0.1Hz的重要频率分量。

我在第一部分看到你在使用dt = 0.01,我理解这是抽样间隔。在第二个你正在使用f_s = len(t) // 2这应该是一个1.0/dt这将实际上会让你会发现甚至更小,因为现在f_s将是100而不是5000,但你搜索的频率仍然〜0.2%采样频率,所以你必须放大到感兴趣的区域。要注意的其他事情是,如果信号具有非零的意义,则将有一个与频率为零的峰值。

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多