我正在与窦波调制作斗争。 我有一个频率(来自混乱的数据 - 随时间变化),现在我需要绘制具有相应频率的正弦波。
蓝线只是实际数据的绘制点,绿色是我到目前为止所做的,但它根本没有对应真实数据。
绘制sin wave的代码是底部:
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,26.86,-25.86,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,710 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]
答案 0 :(得分: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()
结果如下所示(如果包含完整数组):