# -*- coding: utf-8 -*-
"""
Created on Sun Nov  9 13:15:53 2025

@author: AKourgli
"""

import numpy as np
import matplotlib.pyplot as plt

# Paramètres de simulation
Fe = 200e3       # fréquence d'échantillonnage (Hz)
Te = 1 / Fe
N = 100000       # nombre d'échantillons
t = np.arange(N) * Te

# Paramètres du signal
fc = 10e3        # fréquence porteuse (Hz)
kf = 100         # sensibilité de fréquence (faible pour bande étroite)

# Signal modulant : somme de plusieurs cosinus
f_mod = [200, 500, 1000]   # fréquences du signal modulant (Hz)
A_mod = [1.0, 0.7, 0.5]    # amplitudes relatives
m_t = sum(A_mod[i] * np.cos(2 * np.pi * f_mod[i] * t) for i in range(len(f_mod)))

# Modulation NBFM (approximation)
# s(t) ≈ cos(2πfc t) - (kf / fm_eq) * m(t) * sin(2πfc t)
# On prend fm_eq = max(f_mod) pour simplifier
fm_eq = max(f_mod)
s_t = np.cos(2 * np.pi * fc * t) - (kf / fm_eq) * m_t * np.sin(2 * np.pi * fc * t)

# Affichage temporel (zoom sur quelques ms)
plt.figure(figsize=(10,4))
plt.plot(t[:4000]*1e3, s_t[:4000])
plt.title("Signal FM bande étroite (somme de plusieurs fréquences)")
plt.xlabel("Temps (ms)")
plt.ylabel("Amplitude")
plt.grid()

# Spectre
f = np.linspace(-Fe/2, Fe/2, N)
S_f = np.fft.fftshift(np.fft.fft(s_t))
S_f = np.abs(S_f) / N

plt.figure(figsize=(10,4))
plt.plot(f/1e3, 20*np.log10(S_f + 1e-12))
plt.title("Spectre du signal NBFM")
plt.xlabel("Fréquence (kHz)")
plt.ylabel("Amplitude (dB)")
plt.grid()
plt.xlim(fc/1e3 - 5, fc/1e3 + 5)  # zoom autour de la porteuse
plt.tight_layout()
plt.show()
