Skip to content
Advertisement

Python: Plot sin wav with 3 discrete amplitudes

Using the code below I am able to create a sign wave

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')

enter image description here

I would like to create a sin wave which changes it’s amplitude at time 4s, and 8s so that the sin wave looks like the image below

enter image description here

I know how to create each of the 3 sin waves in that img, but I don’t know how to combine them into one.

I’ve tried to combine the first two by doing

np.concatenate(sinWav(amp=0.25, freq=2, time=time[0]), sinWav(amp=1, freq=2, time=time[0]))

and receive the error

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

Advertisement

Answer

You can concatenate arrays by making a list of them as parameter to np.concatenate (e.g. np.concatenate([array1,array2,array3]) or as tuple: np.concatenate((array1,array2,array3))) :

import matplotlib.pyplot as plt
import numpy as np

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.plot(np.concatenate([time[0], time[1], time[2]]),
         np.concatenate([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('Time (ms)')
plt.ylabel('Amplitude')
plt.title('Time domain')
plt.tight_layout()
plt.show()

resulting plot

User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement