如何在 Python 中生成梯形波?

我研究了 SciPy 和 NumPy 等模块,但徒劳无功。是否有诸如 scipy.signal.gaussian 之类的模块返回表示高斯函数波的值数组?

python-3.x - Python中的梯形波-LMLPHP

我使用 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()

python-3.x - Python中的梯形波-LMLPHP

请注意,您可能还想根据用例定义一个阶段。

为了定义单个脉冲,您可能需要稍微修改函数并提供一个范围超过 [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中的梯形波-LMLPHP

关于python-3.x - Python中的梯形波,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44539696/

10-10 22:20