上个月,我发布了this question关于如何在生成正弦波时连接正弦波,但现在我遇到了一个不同的情况,我将生成一个正弦,并使它从另一个我没有生成的正弦的末尾继续。在
我的解决方案是基于对我前一个问题的第二个答案,计算希尔伯特变换,然后用纽比角通过加上90,然后从那里生成下一个正弦。它是有效的,但只有当我的频率值的单位是0或5时,波不匹配,我不知道为什么。在
from scipy.signal import hilbert
import numpy as np
from matplotlib import pyplot as plt
N = 1024
t = np.linspace(0, 1, N)
freq = 5.0
c = np.sin(2 * np.pi * freq * t + 0.0)
c2 = np.angle(hilbert(c), True) # in degrees
plt.subplot(2, 1, 1)
plt.grid()
plt.plot(c)
plt.subplot(2, 1, 2)
phase = c2[-1] + 90
c3 = np.sin(2.0 * np.pi * freq * t + np.deg2rad(phase))
plt.grid()
plt.plot(c3)
plt.show()
频率:5.0
频率:5.8
当时间间隔开始和结束时的值不一致时,会出现边界效应,从而扭曲Hilbert变换。(回想一下Fourier变换对不连续性的反应很差。)这可以通过绘制
c2
:plt.plot(c2[-200:] + 90)
的结尾来观察:注意,曲线向末端的扭曲,曲线应该以恒定的斜率上升。在从时间窗口的边缘后退一个时段,您将获得更好的结果:
我试过频率为5.8:第二条曲线的起点与第一条曲线的终点相匹配。在
目前还不清楚您的具体问题范围是什么。在上一个问题中,在一个引发后续问题的评论中,你说:
这是否意味着数据不一定是正弦波?吵吗?大小不一?你提到了DSP:你是在实时进行处理,还是可以根据需要进行长时间的分析?在
如果它是一个已知大小的干净的正弦波,那么从信号的末尾提取相位相对容易,以便平滑地继续。在
相是
sin⁻¹(y/mag)
。对sin(angle)
有两个输入,其结果是值y/mag
,一个用于sin(angle)
随angle
的增加而增加,另一个用于当其减小时。通过观察前一点,我们可以确定我们需要哪一点。在从最后一个点的相位和最后第二个点的相位,我们可以推断下一个点的相位。在
^{pr2}$将上一个块传递给
next_phase()
将计算顺利继续该块所需的阶段参数。在相关问题 更多 >
编程相关推荐