# -*- coding: utf-8 -*-
"""
Created on Tue Oct 15 16:46:07 2024

@author: ernesto311
"""

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import welch
from matplotlib.animation import FuncAnimation, PillowWriter

# Generate distances and corresponding frequencies
distances = np.arange(-400, 451, 1)
f1 = 800
f2 = f1 + distances

# Time parameters
dt = 0.00001
t = np.arange(0, 2, dt)

# Set up the figure and axis for the animation
fig, axs = plt.subplots(1, 2, layout='constrained')
axs[0].set_xlabel('Time [s]')
axs[0].set_ylabel('Amplitude')
axs[1].set_xlabel('Frequency [Hz]')
axs[1].set_ylabel('Power [1/Hz]')
axs[1].set_xlim(0, 1500)

# Function to compute and plot the power spectrum
def plot_powerspectrum(i):
    # Clear the previous plots
    axs[0].cla()
    axs[1].cla()
    
    # Generate the signal
    x = np.sin(2*np.pi*f1*t) + 0.2 * np.sin(2*np.pi*f2[i]*t)
    x[x < 0] = 0  # Apply half-wave rectification

    # Plot the signal (first 20 ms for clarity)
    axs[0].plot(t[t < 0.02], x[t < 0.02])
    axs[0].set_title(f"Signal (f2={f2[i]} Hz)")
    axs[0].set_xlabel('Time [s]')
    axs[0].set_ylabel('Amplitude')
    axs[0].set_ylim(0, 1.2)

    # Compute power spectrum
    freq, power = welch(x, fs=1/dt, nperseg=2**16)

    # Plot the power spectrum
    axs[1].plot(freq, power)
    axs[1].set_xlim(0, 1500)
    axs[1].set_ylim(0, 0.05)
    axs[1].set_title(f'Power Spectrum (f2={f2[i]} Hz)')
    axs[1].set_xlabel('Frequency [Hz]')
    axs[1].set_ylabel('Power [1/Hz]')

# Create the animation
ani = FuncAnimation(fig, plot_powerspectrum, frames=len(distances), interval=500)

# Display the animation
ani.save("signal_animation.gif", writer=PillowWriter(fps=30))
plt.show()