Simulación de modulación AM y FM con Python y NumPy: de principios matemáticos a visualización interactiva

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")

Etiquetas: Python NumPy AM modulation FM modulation Matplotlib

Publicado el 6-18 08:00