Wavy signal generation

Sinusoidal waves are very useful in signal generation. The sine wave equation can be used to generate a simple wave (wave 1 in the top left panel) or complex signals in a few steps. The figure below shows the generation of four different waves that are recursively added together to create an increasingly complex signal. And, combining it with other signals, such as sloping line, increases its functionality. The bottom panel of the figure shows all the waves plus a linearly increasing signal.

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

from indsl.signals.generator import line, sine_wave
from indsl.signals.noise import white_noise


# Define the signal and wave parameters
start = pd.Timestamp("1975-05-09")
end = pd.Timestamp("1975-05-14")
freq = pd.Timedelta("1 m")
w_period = [pd.Timedelta("1 D"), pd.Timedelta("2 D"), pd.Timedelta("3 D"), pd.Timedelta("4 D")]
w_mean = [0, 2, 4, 6]
w_amplitude = [10, 15, 20, 25]
w_phase = [0, np.pi * 1 / 3, np.pi * 2 / 3, np.pi]
color = ["b", "g", "r", "c"]

# Generate a plotting grid and recursively add all the waves
fig = plt.figure(tight_layout=True, figsize=[12, 7])
index = pd.date_range(start="1975-05-09", end="1975-05-14", freq="min")
all_waves = pd.Series(data=np.zeros(len(index)), index=index, dtype=float)
for item in range(len(w_period)):
    wave = sine_wave(
        start_date=start,
        end_date=end,
        sample_freq=freq,
        wave_period=w_period[item],
        wave_mean=w_mean[item],
        wave_amplitude=w_amplitude[item],
        wave_phase=w_phase[item],
    )
    all_waves = all_waves.add(wave)

    ax = plt.subplot(3, 2, item + 1)
    if item != 0:
        ax.plot(all_waves, label=f"Sum of waves {np.arange(item + 1) + 1}")
    ax.plot(wave, label=f"Wave {item + 1}")
    ax.legend(loc=1)
    ax.grid(True)

# Create a sloping line and add it to the sum of all the waves
linear_sig = line(
    start_date=start,
    end_date=end,
    sample_freq=freq,
    slope=1e-3,
    intercept=-40,
)

sloping_waves = all_waves + linear_sig
ax = plt.subplot(3, 2, (5, 6))
ax.plot(sloping_waves, label="All waves + linear signal")
ax.legend(loc=2)
ax.grid(True)
fig.suptitle("Generating and Adding Sinusoidal Signals")
plt.show()
Generating and Adding Sinusoidal Signals

Add white noise

To make the final signal more realistic, let’s add white noise to it. We can use the indsl.signals.noise.white_noise() method. It will estimate the power (i.e. variance) of the signal and add white (random) noise to it, with a given signal-to-noise ratio (SNR).

fig = plt.figure(tight_layout=True, figsize=[9, 6])
plt.plot(white_noise(sloping_waves, snr_db=30))
plt.title("Signal with White Noise")
plt.show()
Signal with White Noise

Total running time of the script: ( 0 minutes 0.484 seconds)

Gallery generated by Sphinx-Gallery