Este artículo explora la simulación de sistemas de modulación AM y FM utilizando Python y NumPy. Comenzamos con la configuración del entorno y la generación de señales base, avanzando hacia la implementación de la modulación AM con visualización en tiempo real usando Matplotlib.
Configuración del entorno y creación de señales iniciales
Para iniciar, se recomienda configurar un entorno de Python dedicado para evitar conflictos de dependencias:
conda create -n simulacion_mod python=3.9
conda activate simulacion_mod
pip install numpy matplotlib scipy
Generación de señales fundamentales
La modulación implica mezclar una señal de mensaje de baja frecuencia con una portadora de alta frecuencia. Definimos los parámetros y creamos las señales:
import numpy as np
import matplotlib.pyplot as plt
# Definición de parámetros clave
tasa_muestreo = 44100 # Tasa de muestreo en Hz
duracion_senal = 1.0 # Duración en segundos
vector_tiempo = np.linspace(0, duracion_senal, int(tasa_muestreo * duracion_senal), endpoint=False)
# Creación de la señal de mensaje (simula una onda de baja frecuencia)
frecuencia_msg = 5 # Frecuencia en Hz
senal_msg = 0.5 * np.sin(2 * np.pi * frecuencia_msg * vector_tiempo)
# Creación de la portadora de alta frecuencia
frecuencia_carrier = 100 # Frecuencia en Hz
portadora = np.sin(2 * np.pi * frecuencia_carrier * vector_tiempo)
Visualización de las señales
Para observar las características temporales, graficamos segmentos de las señales:
def mostrar_senal(eje_temporal, datos, etiqueta):
plt.figure(figsize=(10, 4))
plt.plot(eje_temporal[:1000], datos[:1000])
plt.title(etiqueta)
plt.xlabel('Tiempo (s)')
plt.ylabel('Amplitud')
plt.grid(True)
plt.show()
mostrar_senal(vector_tiempo, senal_msg, "Señal de mensaje (5 Hz)")
mostrar_senal(vector_tiempo, portadora, "Señal portadora (100 Hz)")
Implementación de la modulación AM
La modulación AM varía la amplitud de la portadora según la señal de mensaje. Su expresión matemática es:
s(t) = [A + m(t)] · c(t)
Donde A es un sesgo DC para evitar sobremodulación, m(t) la señal de mensaje y c(t) la portadora. A continuación, se codifica el proceso:
def aplicar_modulacion_am(datos_mensaje, onda_portadora, factor_mod=0.5):
"""
Genera una señal modulada en amplitud (AM).
:param datos_mensaje: Array con la señal de mensaje.
:param onda_portadora: Array con la onda portadora.
:param factor_mod: Índice de modulación entre 0 y 1.
:return: Señal AM resultante.
"""
mensaje_amplificado = datos_mensaje * factor_mod
senal_am = (1 + mensaje_amplificado) * onda_portadora
return senal_am
senal_am_resultante = aplicar_modulacion_am(senal_msg, portadora)
mostrar_senal(vector_tiempo, senal_am_resultante, "Señal AM modulada")