得到频率,需要绘制正弦波

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

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

real data and sinus

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

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

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.8 6, 28.03, - 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 .98, -45.98, 47.63, - 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, -57.43, 57 .43, -57.43, 59.75, - 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 .22, -62.22, 59.75, - 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 .75, -59.75, 62.22, - 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]

python trigonometry modulation
1个回答
0
投票

您可以尝试通过从数据中提取频率和幅度的估计值,将您的函数与正弦或实际上类似余弦的函数进行匹配。如果我理解正确的话,您的数据是最大值和最小值,并且您希望有一个与此类似的三角函数。如果您的数据保存在两个数组

time
value
中,则幅度估计值仅由
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()

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

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