[英]How to scale and crop a sine wave in python and bumpy
我正在尝试生成一个符合我对幅度、相数以及开始和结束值的要求的正弦波。
我可以准确地控制幅度和相位数,但我不知道如何准确地设置开始值和结束值。 我相信有一种数学方法可以解决这个问题,但我不知道从哪里开始。
我还尝试通过在开始之前和结束之后切割y
的元素来实际“裁剪”波浪,但除了不是很优雅之外,我还遇到了准确性问题。
谢谢你的帮助
import numpy as np
import math
import matplotlib.pylab as plt
min=0
max=180
f = 2
start = 45
stop = 60
t = np.linspace(0, 2*np.pi, 1000)
y = ((max+min)/2) + (((max-min)/2) * np.sin(f*t + 100)) # "100" set manually by experimenting
actual_min, actual_max = np.min(y), np.max(y)
actual_start, actual_stop = y[0], y[-1]
print(f"min: {actual_min}, max: {actual_max}")
print(f"start: {actual_start}, stop: {actual_stop}")
plt.plot(t, y)
min: 0.00019246157938823671, max: 179.99994783571566
start: 44.42709230012171, stop: 44.42709230012167
您需要arcsin
来获取给定y
的t
:
import numpy as np
import matplotlib.pylab as plt
min = 0
max = 180
f = 2
start = 45
stop = 60
a = (max + min) / 2
b = (max - min) / 2
t0 = np.arcsin((start - a) / b) / f
t1 = np.arcsin((stop - a) / b) / f + 2 * np.pi
t = np.linspace(t0, t1, 1000)
y = a + b * np.sin(f * t)
assert np.allclose([start, stop], [y[0], y[-1]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.