Python:用3个离散振幅绘制正弦波形

Python:用3个离散振幅绘制正弦波形,python,numpy,matplotlib,Python,Numpy,Matplotlib,使用下面的代码,我能够创建一个符号波 def normalizedAmp(signalX, hz): '''extract correctly-normalized amplitude''' signalAmp = np.abs(signalX[0:len(hz)]) signalAmp[1:] = 2*signalAmp[1:] return signalAmp def sinWav(amp, freq, time, phase=0): return

使用下面的代码,我能够创建一个符号波

def normalizedAmp(signalX, hz):
    '''extract correctly-normalized amplitude'''
    signalAmp = np.abs(signalX[0:len(hz)])
    signalAmp[1:] = 2*signalAmp[1:]
    return signalAmp

def sinWav(amp, freq, time, phase=0):
    return amp * np.sin(2 * np.pi * (freq * time - phase))

# simulation parameters
srate = 1000
time  = {
    0: np.arange(0, 4, 1/srate),
    1: np.arange(4, 8, 1/srate),
    2: np.arange(8, 12, 1/srate)
}

signal = sinWav(amp=0.25, freq=2, time=time[0])

plt.figure(figsize=(12,3))

# plot time-domain signal
plt.subplot2grid((1,3), (0,0))
plt.plot(time[0], signal)
plt.xlabel('Time (ms)')
plt.ylabel('Amplitude')
plt.title('Time domain')

我想创建一个正弦波,在时间4s和8s改变它的振幅,这样正弦波看起来像下图

我知道如何在img中创建3个sin波中的每一个,但我不知道如何将它们组合成一个

我试着通过这样做将前两种方法结合起来

np.concatenate(sinWav(amp=0.25, freq=2, time=time[0]), sinWav(amp=1, freq=2, time=time[0]))
并接收错误

ValueError: x and y must have same first dimension, but have shapes (4000,) and (8000,)

您可以通过将数组列表作为参数连接到(例如,
np.concatenate([array1,array2,array3])
或元组:
np.concatenate((array1,array2,array3))
):

导入matplotlib.pyplot作为plt
将numpy作为np导入
def sinWav(电流、频率、时间、相位=0):
返回amp*np.sin(2*np.pi*(频率*时间-相位))
#模拟参数
srate=1000
时间={0:np.arange(0,4,1/srate),
1:np.arange(4,8,1/srate),
2:np.arange(8,12,1/srate)}
信号=sinWav(amp=0.25,频率=2,时间=time[0])
plt.图(figsize=(12,3))
#绘制时域信号
plt.plot(np.concatenate([time[0],time[1],time[2]]),
np.串联([sinWav(amp=0.25,freq=2,time=time[0]),
sinWav(amp=1.0,freq=2,time=time[1]),
sinWav(amp=0.5,freq=2,time=time[2]))
plt.xlabel(‘时间(毫秒)’)
plt.ylabel(“振幅”)
产品名称(“时域”)
plt.紧_布局()
plt.show()

您可以通过将数组列表作为参数连接到(例如,
np.concatenate([array1,array2,array3])
或元组:
np.concatenate((array1,array2,array3))
):

导入matplotlib.pyplot作为plt
将numpy作为np导入
def sinWav(电流、频率、时间、相位=0):
返回amp*np.sin(2*np.pi*(频率*时间-相位))
#模拟参数
srate=1000
时间={0:np.arange(0,4,1/srate),
1:np.arange(4,8,1/srate),
2:np.arange(8,12,1/srate)}
信号=sinWav(amp=0.25,频率=2,时间=time[0])
plt.图(figsize=(12,3))
#绘制时域信号
plt.plot(np.concatenate([time[0],time[1],time[2]]),
np.串联([sinWav(amp=0.25,freq=2,time=time[0]),
sinWav(amp=1.0,freq=2,time=time[1]),
sinWav(amp=0.5,freq=2,time=time[2]))
plt.xlabel(‘时间(毫秒)’)
plt.ylabel(“振幅”)
产品名称(“时域”)
plt.紧_布局()
plt.show()

只需将一个接一个的打印到相同的轴(并将所有打印的颜色设置为相同的值)只需将一个接一个的打印到相同的轴(并将所有打印的颜色设置为相同的值)我的第一个参数设置为
plt。plot
是错误的。这是
time[0]
,而它本应该是
np.concatenate([time[0],time[1]])
@JohanC,干得好!。还有一件事。极限x是0和12,然后加上plt.xlim([0,12]),你可以修正它。@JuanCamiloRiveraPalacio谢谢。在x方向拟合曲线的最简单方法是使用
plt.margins(x=0)
。默认matplotlib保留
5%
的边距。我对
plt.plot的第一个参数是错误的。这是
time[0]
,而它本应该是
np.concatenate([time[0],time[1]])
@JohanC,干得好!。还有一件事。极限x是0和12,然后加上plt.xlim([0,12]),你可以修正它。@JuanCamiloRiveraPalacio谢谢。在x方向拟合曲线的最简单方法是使用
plt.margins(x=0)
。默认matplotlib保留
5%的边距