import matplotlib.pyplot as plt
import numpy as np

# Define a symmetric time vector around 0 (essential for even/odd decomposition)
t = np.linspace(-5, 5, 1000)

# Dictionary containing all 6 signals and their names
signals = {
    1: ('sin(t)', lambda t: np.sin(t)),
    2: ('cos(t)', lambda t: np.cos(t)),
    3: ('exp(t)', lambda t: np.exp(t)),
    4: ('exp(-t)', lambda t: np.exp(-t)),
    5: ('Unit Step mu(t)', lambda t: np.heaviside(t, 1.0)),
    6: ('Ramp r(t)', lambda t: np.maximum(0, t)),
}

# --- SELECT YOUR SIGNAL HERE (1 to 6) ---
choice = 1
signal_name, func = signals[choice]

# 1. Original signal x(t)
xt = func(t)

# 2. Time reverse signal x(-t) (evaluated at -t since t is symmetric)
xt_rev = func(-t)

# 3. Even part of the signal: x_e(t) = 0.5 * (x(t) + x(-t))
xe_t = 0.5 * (xt + xt_rev)

# 4. Odd part of the signal: x_o(t) = 0.5 * (x(t) - x(-t))
xo_t = 0.5 * (xt - xt_rev)

# 5. Reconstructed signal: x(t) = x_e(t) + x_o(t)
x_reconstructed = xe_t + xo_t

# --- PLOTTING ---
fig, axs = plt.subplots(5, 1, figsize=(9, 12), sharex=True)
fig.suptitle(
    f'Signal Decomposition & Transformations for: {signal_name}',
    fontsize=14,
    fontweight='bold',
)

plots_data = [
    (xt, '1. Original Signal x(t)', 'tab:blue'),
    (xt_rev, '2. Time Reversed Signal x(-t)', 'tab:orange'),
    (xe_t, '3. Even Part x_e(t)', 'tab:green'),
    (xo_t, '4. Odd Part x_o(t)', 'tab:red'),
    (
        x_reconstructed,
        '5. Reconstructed Signal x(t) = x_e(t) + x_o(t)',
        'tab:purple',
    ),
]

for ax, (data, title, color) in zip(axs, plots_data):
  ax.plot(t, data, color=color, linewidth=2)
  ax.set_title(title, fontsize=10, loc='left')
  ax.grid(True, linestyle='--', alpha=0.6)
  ax.axhline(0, color='black', linewidth=0.8, linestyle='-')
  ax.axvline(0, color='black', linewidth=0.8, linestyle='-')

plt.xlabel('Time (t)', fontsize=11)
plt.tight_layout()
plt.show()