If you're looking for just periodic pulse trains, like the example you gave - here's a pulse train that is on for 5 cycles then off for five cycles:
N = 100 # sample count
P = 10 # period
D = 5 # width of pulse
sig = np.arange(N) % P < D
Giving
plot(sig)
You can replace np.arange(N)
with your linspace
here. Note this is not equivalent to your code, as the pulses are not centered.
And here's a fully configurable pulse train:
def rect(T):
"""create a centered rectangular pulse of width $T"""
return lambda t: (-T/2 <= t) & (t < T/2)
def pulse_train(t, at, shape):
"""create a train of pulses over $t at times $at and shape $shape"""
return np.sum(shape(t - at[:,np.newaxis]), axis=0)
sig = pulse_train(
t=np.arange(100), # time domain
at=np.array([0, 10, 40, 80]), # times of pulses
shape=rect(10) # shape of pulse
)
Giving:
I think this is one of those cases where matlab's pulsetran
function is more confusing than the one-line implementation of it in python, which is possibly why scipy does not provide it.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…