【问题标题】:got frequency, need plot sinus wave in python获取频率,需要在 python 中绘制正弦波
【发布时间】:2016-09-02 22:43:02
【问题描述】:

我只是在与正弦波调制作斗争。 我有一个频率(来自混乱的数据 - 随时间变化),现在我需要绘制具有相应频率的正弦波。

蓝线只是真实数据的绘制点,绿色是我到目前为止所做的,但它与真实数据完全不对应。

绘制正弦波的代码在底部:

def plotmodulsin():
    n = 530
    f1, f2 = 16, 50 # frequency

    t = linspace(6.94,8.2,530)
    dt = t[1] - t[0] # needed for integration
    print t[1]
    print t[0]
    f_inst = logspace(log10(f1), log10(f2), n)
    phi = 2 * pi * cumsum(f_inst) * dt # integrate to get phase
    pylab.plot(t, 5*sin(phi))

幅度向量:

[2.64, -2.64, 6.14, -6.14, 9.56, -9.56, 12.57, -12.57, 15.55, -15.55, 18.04, -18.04, 21.17, -21.17, 23.34, -23.34, 25.86, -25.86, 28. , -28.03, 30.49, -30.49, 33.28, -33.28, 35.36, -35.36, 36.47, -36.47, 38.86, -38.86, 41.49, -41.49, 42.91, -42.91, 44.41, -44.41, 45.8, -44.41, 45.8 , -47.63, 47.63, -47.63, 51.23, -51.23, 51.23, -51.23, 53.18, -53.18, 55.24, -55.24, 55.24, -55.24, 55.24, -55.24, 57.43, -557.43, 57.4, -557.43, 559.3, , -59.75, 59.75, -59.75, 59.75, -59.75, 59.75, -59.75, 62.22, -62.22, 59.75, -59.75, 62.22, -62.22, 59.75, -59.75, 62.22, -62.22, 62.2, -62.22, 62.2, , -59.75, 62.22, -62.22, 62.22, -62.22, 59.75, -59.75, 62.22, -62.22, 62.22, -62.22, 62.22, -62.22, 59.75, -59.75, 62.22, -62.22, 59.2, -62.22, 59.7 , -62.22, 59.75, -59.75, 59.75]

真实数据的时间向量:

[6.954, 6.985, 7.016, 7.041, 7.066, 7.088, 7.11, 7.13, 7.149, 7.167, 7.186, 7.202, 7.219, 7.235, 7.251, 7.266, 7.282, 7.296, 7.311, 7.325, 7.339, 7.352, 7.366, 7.379, 7.392, 7.404, 7.417, 7.43, 7.442, 7.454, 7.466, 7.478, 7.49, 7.501, 7.513, 7.524, 7.536, 7.547, 7.558, 7.569, 7.58, 7.591, 7.602, 7.613, 7.624, 7.634, 7.645, 7.655, 7.666, 7.676, 7.686, 7.697, 7.707, 7.717, 7.728, 7.738, 7.748, 7.758, 7.768, 7.778, 7.788, 7.798, 7.808, 7.818, 7.828, 7.838, 7.848, 7.858, 7.868, 7.877, 7.887, 7.897, 7.907, 7.917, 7.927, 7.937, 7.946, 7.956, 7.966, 7.976, 7.986, 7.996, 8.006, 8.016, 8.026, 8.035, 8.045, 8.055, 8.065, 8.075, 8.084, 8.094, 8.104, 8.114, 8.124, 8.134, 8.144, 8.154, 8.164、8.174、8.184、8.194、8.20]

所以我需要生成具有恒定幅度和以下频率的窦:

[10.5, 16.03, 20.0, 22.94, 25.51, 27.47, 29.76, 31.25, 32.89, 34.25, 35.71, 37.31, 38.46, 39.06, 40.32, 41.67, 42.37, 43.1, 43.86, 44.64, 44.64, 46.3, 46.3, 47.17、48.08、48.08、48.08、49.02、49.02、50.0、50.0、50.0、50.0]

【问题讨论】:

  • 您绘制了一个恒定幅度的正弦曲线 (5)。因此,您不能期望它与具有幅度的数据相匹配,该幅度似乎或多或少地线性增加,直到达到 60。但是如果没有数据的形式以及有关其所代表内容的任何信息,就无法真正决定如何拟合你的数据。最好的办法是绘制在质量上看起来相似的东西......
  • 我现在需要的是匹配数据 olny 和它们的频率。幅度可以作为下一步。这就是为什么我乘以常数。
  • 如果有人可以处理,我添加了我的向量?
  • 您可以用这些频率绘制正弦曲线,但问题是,它们与您的真实数据不匹配,因为您可以通过将它们与 1/(Dt) 进行比较来简单地检查,其中 Dt 是最大值之间的时间或真实数据中的最小值...
  • 好的,我该怎么做?

标签: python trigonometry modulation


【解决方案1】:

您可以通过从数据中提取频率和幅度的估计值,尝试将您的函数与正弦或实际上类似余弦的函数相匹配。如果我理解正确,您的数据是最大值和最小值,并且您希望有一个类似的三角函数。如果您的数据保存在两个数组timevalue 中,则幅度估计值仅由np.abs(value) 给出。频率以最大值和最小值之间的时间差的两倍的倒数给出。 freq = 0.5/(time[1:]-time[:-1]) 为您提供每个时间间隔中点的频率估计值。因此,相应的时间以freqTimes = (time[1:]+time[:-1])/2. 给出。

为了获得更平滑的曲线,您现在可以对这些幅度和频率值进行插值,以获取介于两者之间的值的估计值。一个非常简单的方法是使用np.interp,它会做一个简单的线性插值。您必须指定在哪些时间点进行插值。我们将为此构造一个数组,然后通过以下方式进行插值:

n = 10000
timesToInterpolate = np.linspace(time[0], time[-1], n, endpoint=True)
freqInterpolated = np.interp(timesToInterpolate, freqTimes, freq)
amplInterpolated = np.interp(timesToInterpolate, time, np.abs(value))

现在您可以通过以下方式进行您在示例中已有的集成:

phi = (2*np.pi*np.cumsum(freqInterpolated)
       *(timesToInterpolate[1]-timesToInterpolate[0]))

现在你可以绘图了。所以把它们放在一起会给你:

import numpy as np
import matplotlib.pyplot as plt

time  = np.array([6.954, 6.985, 7.016, 7.041, 7.066, 7.088, 7.11, 7.13]) #...
value = np.array([2.64, -2.64, 6.14, -6.14, 9.56, -9.56, 12.57, -12.57]) #...

freq = 0.5/(time[1:]-time[:-1])
freqTimes = (time[1:]+time[:-1])/2.

n = 10000
timesToInterpolate = np.linspace(time[0], time[-1], n, endpoint=True)
freqInterpolated   = np.interp(timesToInterpolate, freqTimes, freq)
amplInterpolated   = np.interp(timesToInterpolate, time, np.abs(value))

phi = (2*np.pi*np.cumsum(freqInterpolated)
       *(timesToInterpolate[1]-timesToInterpolate[0]))

plt.plot(time, value)
plt.plot(timesToInterpolate, amplInterpolated*np.cos(phi)) #or np.sin(phi+np.pi/2)
plt.show()

结果如下所示(如果包含完整的数组):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-16
    • 2023-04-06
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多