如何在 Python 中生成梯形波?
我研究了 SciPy 和 NumPy 等模块,但徒劳无功。是否有诸如 scipy.signal.gaussian 之类的模块返回表示高斯函数波的值数组?
我使用 Astropy 的梯形内核生成了这个,
Trapezoid1DKernel(30,slope=1.0)
.我想在不使用 Astropy 的情况下在 Python 中实现它。
最佳答案
虽然宽度和斜率足以定义三角信号,但您需要梯形信号的第三个参数:幅度。
使用这三个参数,您可以轻松地调整 scipy.signal.sawtooth
函数,通过截断和偏移三角形函数来为您提供梯形形状。
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
def trapzoid_signal(t, width=2., slope=1., amp=1., offs=0):
a = slope*width*signal.sawtooth(2*np.pi*t/width, width=0.5)/4.
a[a>amp/2.] = amp/2.
a[a<-amp/2.] = -amp/2.
return a + amp/2. + offs
t = np.linspace(0, 6, 501)
plt.plot(t,trapzoid_signal(t, width=2, slope=2, amp=1.), label="width=2, slope=2, amp=1")
plt.plot(t,trapzoid_signal(t, width=4, slope=1, amp=0.6), label="width=4, slope=1, amp=0.6")
plt.legend( loc=(0.25,1.015))
plt.show()
请注意,您可能还想根据用例定义一个阶段。
为了定义单个脉冲,您可能需要稍微修改函数并提供一个范围超过
[0,width]
的数组。from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
def trapzoid_signal(t, width=2., slope=1., amp=1., offs=0):
a = slope*width*signal.sawtooth(2*np.pi*t/width, width=0.5)/4.
a += slope*width/4.
a[a>amp] = amp
return a + offs
for w,s,a in zip([2,5], [2,1], [1,0.6]):
t = np.linspace(0, w, 501)
l = "width={}, slope={}, amp={}".format(w,s,a)
plt.plot(t,trapzoid_signal(t, width=w, slope=s, amp=a), label=l)
plt.legend( loc="upper right")
plt.show()
关于python-3.x - Python中的梯形波,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44539696/