我正在尝试在python中实现矩形脉冲序列。
我搜查了scipy并且没有实现的信号。 http://docs.scipy.org/doc/scipy/reference/signal.html
在matlab中有一个名为pulstran的信号: http://es.mathworks.com/help/signal/ref/pulstran.html
matlab中的代码示例如下:
T=10; %Period
D=5; %Duration
N=10; %Number of pulses
x=linspace(0,T*N,10000);
d=[0:T:T*N];
y=pulstran(x,d,'rectpuls',D);
plot(x,y);
ylim([-1,2]);
我如何在python中实现这个信号?
感谢。
答案 0 :(得分:6)
如果你正在寻找周期性的脉冲序列,比如你给出的例子 - 这里的脉冲序列开启5个周期,然后关闭5个周期:
N = 100 # sample count
P = 10 # period
D = 5 # width of pulse
sig = np.arange(N) % P < D
给予
plot(sig)
您可以在此处使用np.arange(N)
替换linspace
。请注意,这与代码不是等效,因为脉冲不是居中的。
这是一个完全可配置的脉冲序列:
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
)
,并提供:
我认为这是matlab的pulsetran
函数比python中的单行实现更令人困惑的情况之一,这可能是scipy没有提供它的原因。
答案 1 :(得分:6)
您可以使用square
中的scipy.signal
功能:
逐字here:
from scipy import signal
import matplotlib.pyplot as plt
t = np.linspace(0, 1, 500, endpoint=False)
plt.plot(t, signal.square(2 * np.pi * 5 * t))
plt.ylim(-2, 2)
因此,对于您的示例,请执行以下操作:
T=10
D=5
N=10
shift = 1/4 # number of cycles to shift (1/4 cycle in your example)
x = np.linspace(0, T*N, 10000, endpoint=False)
y=signal.square(2 * np.pi * (1/T) * x + 2*shift*np.pi)
plt.plot(x,y)
plt.ylim(-2, 2)
plt.xlim(0, T*N)
答案 2 :(得分:0)
所有答案都很好,但是我发现它们在scipy.integrate
方面存在一些问题,因此我特别牢记scipy.integrate
创建了3种类型:
def uniform_pulse_function(self, t, start, stop, pulsewidth, period, amplitude):
func = amplitude * np.where((t > start and t < stop and (t % period <(pulsewidth))),
1, 0)
func = (amplitude[int(t//period)])*np.where((t>start and t<stop and (t%period<(pulsewidth))), 1, 0)
return func
def custom_pulse_function(self, t, start, stop, pulsewidth, period, amplitude):
func = (amplitude[int(t//period)]) * np.where((t > start and t < stop and (t % period < (pulsewidth[int(t//period)]))), 1, 0)
return func