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()
aW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAppbXBvcnQgbnVtcHkgYXMgbnAKCiMgRGVmaW5lIGEgc3ltbWV0cmljIHRpbWUgdmVjdG9yIGFyb3VuZCAwIChlc3NlbnRpYWwgZm9yIGV2ZW4vb2RkIGRlY29tcG9zaXRpb24pCnQgPSBucC5saW5zcGFjZSgtNSwgNSwgMTAwMCkKCiMgRGljdGlvbmFyeSBjb250YWluaW5nIGFsbCA2IHNpZ25hbHMgYW5kIHRoZWlyIG5hbWVzCnNpZ25hbHMgPSB7CiAgICAxOiAoJ3Npbih0KScsIGxhbWJkYSB0OiBucC5zaW4odCkpLAogICAgMjogKCdjb3ModCknLCBsYW1iZGEgdDogbnAuY29zKHQpKSwKICAgIDM6ICgnZXhwKHQpJywgbGFtYmRhIHQ6IG5wLmV4cCh0KSksCiAgICA0OiAoJ2V4cCgtdCknLCBsYW1iZGEgdDogbnAuZXhwKC10KSksCiAgICA1OiAoJ1VuaXQgU3RlcCBtdSh0KScsIGxhbWJkYSB0OiBucC5oZWF2aXNpZGUodCwgMS4wKSksCiAgICA2OiAoJ1JhbXAgcih0KScsIGxhbWJkYSB0OiBucC5tYXhpbXVtKDAsIHQpKSwKfQoKIyAtLS0gU0VMRUNUIFlPVVIgU0lHTkFMIEhFUkUgKDEgdG8gNikgLS0tCmNob2ljZSA9IDEKc2lnbmFsX25hbWUsIGZ1bmMgPSBzaWduYWxzW2Nob2ljZV0KCiMgMS4gT3JpZ2luYWwgc2lnbmFsIHgodCkKeHQgPSBmdW5jKHQpCgojIDIuIFRpbWUgcmV2ZXJzZSBzaWduYWwgeCgtdCkgKGV2YWx1YXRlZCBhdCAtdCBzaW5jZSB0IGlzIHN5bW1ldHJpYykKeHRfcmV2ID0gZnVuYygtdCkKCiMgMy4gRXZlbiBwYXJ0IG9mIHRoZSBzaWduYWw6IHhfZSh0KSA9IDAuNSAqICh4KHQpICsgeCgtdCkpCnhlX3QgPSAwLjUgKiAoeHQgKyB4dF9yZXYpCgojIDQuIE9kZCBwYXJ0IG9mIHRoZSBzaWduYWw6IHhfbyh0KSA9IDAuNSAqICh4KHQpIC0geCgtdCkpCnhvX3QgPSAwLjUgKiAoeHQgLSB4dF9yZXYpCgojIDUuIFJlY29uc3RydWN0ZWQgc2lnbmFsOiB4KHQpID0geF9lKHQpICsgeF9vKHQpCnhfcmVjb25zdHJ1Y3RlZCA9IHhlX3QgKyB4b190CgojIC0tLSBQTE9UVElORyAtLS0KZmlnLCBheHMgPSBwbHQuc3VicGxvdHMoNSwgMSwgZmlnc2l6ZT0oOSwgMTIpLCBzaGFyZXg9VHJ1ZSkKZmlnLnN1cHRpdGxlKAogICAgZidTaWduYWwgRGVjb21wb3NpdGlvbiAmIFRyYW5zZm9ybWF0aW9ucyBmb3I6IHtzaWduYWxfbmFtZX0nLAogICAgZm9udHNpemU9MTQsCiAgICBmb250d2VpZ2h0PSdib2xkJywKKQoKcGxvdHNfZGF0YSA9IFsKICAgICh4dCwgJzEuIE9yaWdpbmFsIFNpZ25hbCB4KHQpJywgJ3RhYjpibHVlJyksCiAgICAoeHRfcmV2LCAnMi4gVGltZSBSZXZlcnNlZCBTaWduYWwgeCgtdCknLCAndGFiOm9yYW5nZScpLAogICAgKHhlX3QsICczLiBFdmVuIFBhcnQgeF9lKHQpJywgJ3RhYjpncmVlbicpLAogICAgKHhvX3QsICc0LiBPZGQgUGFydCB4X28odCknLCAndGFiOnJlZCcpLAogICAgKAogICAgICAgIHhfcmVjb25zdHJ1Y3RlZCwKICAgICAgICAnNS4gUmVjb25zdHJ1Y3RlZCBTaWduYWwgeCh0KSA9IHhfZSh0KSArIHhfbyh0KScsCiAgICAgICAgJ3RhYjpwdXJwbGUnLAogICAgKSwKXQoKZm9yIGF4LCAoZGF0YSwgdGl0bGUsIGNvbG9yKSBpbiB6aXAoYXhzLCBwbG90c19kYXRhKToKICBheC5wbG90KHQsIGRhdGEsIGNvbG9yPWNvbG9yLCBsaW5ld2lkdGg9MikKICBheC5zZXRfdGl0bGUodGl0bGUsIGZvbnRzaXplPTEwLCBsb2M9J2xlZnQnKQogIGF4LmdyaWQoVHJ1ZSwgbGluZXN0eWxlPSctLScsIGFscGhhPTAuNikKICBheC5heGhsaW5lKDAsIGNvbG9yPSdibGFjaycsIGxpbmV3aWR0aD0wLjgsIGxpbmVzdHlsZT0nLScpCiAgYXguYXh2bGluZSgwLCBjb2xvcj0nYmxhY2snLCBsaW5ld2lkdGg9MC44LCBsaW5lc3R5bGU9Jy0nKQoKcGx0LnhsYWJlbCgnVGltZSAodCknLCBmb250c2l6ZT0xMSkKcGx0LnRpZ2h0X2xheW91dCgpCnBsdC5zaG93KCk=