从inpu平滑连接正弦波

2024-04-28 20:38:48 发布

您现在位置:Python中文网/ 问答频道 /正文

上个月,我发布了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

Frequency of 5.0, match

频率:5.8

Frequency of 5.8, miss


Tags: fromimportasnppipltsingrid
2条回答

当时间间隔开始和结束时的值不一致时,会出现边界效应,从而扭曲Hilbert变换。(回想一下Fourier变换对不连续性的反应很差。)这可以通过绘制c2:plt.plot(c2[-200:] + 90)的结尾来观察:注意,曲线向末端的扭曲,曲线应该以恒定的斜率上升。在

bad

从时间窗口的边缘后退一个时段,您将获得更好的结果:

phase = c2[-1 - int(N//freq)] + 90

我试过频率为5.8:第二条曲线的起点与第一条曲线的终点相匹配。在

match

目前还不清楚您的具体问题范围是什么。在上一个问题中,在一个引发后续问题的评论中,你说:

If I don't have the generation equation ( say, I've got a chunk from mic ) what would be the approach?

这是否意味着数据不一定是正弦波?吵吗?大小不一?你提到了DSP:你是在实时进行处理,还是可以根据需要进行长时间的分析?在


如果它是一个已知大小的干净的正弦波,那么从信号的末尾提取相位相对容易,以便平滑地继续。在

相是sin⁻¹(y/mag)。对sin(angle)有两个输入,其结果是值y/mag,一个用于sin(angle)angle的增加而增加,另一个用于当其减小时。通过观察前一点,我们可以确定我们需要哪一点。在

def ending_phase(c, mag):
    angle = math.asin(c[-1] / mag)
    if c[-2] > c[-1]:
        angle = np.pi - angle
    return angle

从最后一个点的相位和最后第二个点的相位,我们可以推断下一个点的相位。在

^{pr2}$

将上一个块传递给next_phase()将计算顺利继续该块所需的阶段参数。在

N = 1024
t = np.linspace(0, 1, N)

mag = 1.2
freq = 5.2
phase = 2.2
c1 = mag * np.sin(2 * np.pi * freq * t + phase)

plt.subplot(2,2,1)
plt.grid()
plt.plot(c1)


freq = 3.8
phase = next_phase(c1, mag)

c2 = mag * np.sin(2 * np.pi * freq * t + phase)
plt.subplot(2,2,2)
plt.grid()
plt.plot(c2)


c3 = np.concatenate((c1, c2))
plt.subplot(2,1,2)
plt.grid()
plt.plot(c3)


plt.show()

enter image description here

相关问题 更多 >