# Easily generate sine/cosine waveform data in Python using UliEngineering

In order to generate sinusoid test data in Python you can use the UliEngineering library which provides an easy-to-use functions in `UliEngineering.SignalProcessing.Simulation`

:

### How to install UliEngineering

UliEngineering is a Python 3 only library. Install using `pip`

:

```
sudo pip3 install -U UliEngineering
```

### Basic example

```
from UliEngineering.SignalProcessing.Simulation import sine_wave
# Default: Generates 1 second of data with amplitude = 1.0 (swing from -1.0 ... 1.0)
sine = sine_wave(frequency=10.0, samplerate=10e3)
cosine = cosine_wave(frequency=10.0, samplerate=10e3)
```

### Amplitude & offset

Use `amplitude=0.5`

to specify that the sine wave should swing between `-0.5`

and `0.5`

.

Use `offset=2.0`

to specify that the sine wave should be centered vertically around `2.0`

:

```
from UliEngineering.SignalProcessing.Simulation import sine_wave
data = sine_wave(frequency=10.0, samplerate=10e3, amplitude=0.5, offset=2.0)
```

### Phaseshift example

You can specify the phaseshift to use - to use a `180°`

phaseshift, just use `phaseshift=180.0`

```
from UliEngineering.SignalProcessing.Simulation import sine_wave
original = sine_wave(frequency=10.0, samplerate=10e3)
shifted = sine_wave(frequency=10.0, samplerate=10e3, phaseshift=180.)
```

### Time delay example

While this is functionally equivalent to phase offset, it is often convenient to specify the *time delay* in seconds instead of the phase shift in degrees:

```
from UliEngineering.SignalProcessing.Simulation import sine_wave
original = sine_wave(frequency=10.0, samplerate=10e3)
# Shifted signal is delayed 0.01s = 10 milliseconds compared to original
shifted = sine_wave(frequency=10.0, samplerate=10e3, timedelay=0.01)
```

Note that in the time domain, the signals appear to be shifted backwards when you use a positive timedelay value. This is in accordance with the *delay* naming, implying that the signal is *delayed* by that amount.

You can specify both *phase shift* and *time delay*, meaning that both will be applied (the offset is added)

### Plotting

If you want to debug your signals visually, this is the code that was used inside Jupyter to generate the plots shown above:

```
%matplotlib inline
from matplotlib import pyplot as plt
plt.style.use("ggplot")
# Generate data
from UliEngineering.SignalProcessing.Simulation import sine_wave
original = sine_wave(frequency=10.0, samplerate=10e3)
shifted = sine_wave(frequency=10.0, samplerate=10e3, timedelay=0.01)
# set_size_inches(20, 10) to make it even larger!
plt.gcf().set_size_inches(10, 5)
plt.plot(original, label="original")
plt.plot(shifted, label="shifted")
plt.savefig("/dev/shm/timedelay.svg")
plt.legend(loc=1) # Top right
```