Skip to content

Refactor: Implementa simulación de Monte Carlo adaptativa (min_tandas…#16

Open
matterod wants to merge 1 commit into
feat/timing-synchronizationfrom
feat/BER
Open

Refactor: Implementa simulación de Monte Carlo adaptativa (min_tandas…#16
matterod wants to merge 1 commit into
feat/timing-synchronizationfrom
feat/BER

Conversation

@matterod

Copy link
Copy Markdown
Collaborator

Refactor: Implementa simulación de Monte Carlo adaptativa (min_tandas y min_errors)

Descripción

Este PR refactoriza por completo la lógica de la simulación de Monte Carlo (run_montecarlo_simulation) para asegurar que los resultados de BER sean estadísticamente robustos y eficientes en todo el rango de Eb/N0.

El cambio principal es la introducción de un parámetro min_tandas que trabaja en conjunto con min_errors para crear una simulación adaptativa.


1. El Problema: Por qué min_errors no era suficiente

El método anterior usaba una sola condición de parada: while (total_errores < min_errors). Esto presentaba un problema fundamental en la zona de Eb/N0 bajo (BER alto, ej. 0-5 dB):

Problema: En esta zona, los errores son muy comunes. La simulación alcanzaba min_errors (ej: 1500) demasiado rápido, a veces en una sola tanda (iteración).

Por qué es malo: Un resultado de BER basado en 1 o 2 tandas no es un promedio; es una anécdota. Depende enteramente de la "suerte" (aleatoriedad) de esa única tanda, resultando en un gráfico "ruidoso" o con picos.


2. La Solución: Lógica Adaptativa con min_tandas

Se introduce un nuevo parámetro, min_tandas, y la lógica del bucle while se actualiza a:

while (total_errores < min_errors OR total_tandas < min_tandas) AND \
      (total_bits < max_bits):

Esta lógica es adaptativa y usa el parámetro de control correcto para cada zona del gráfico:

  • En Eb/N0 bajos (BER Alto): total_errores se alcanza rápido. Pero min_tandas fuerza al bucle a seguir, garantizando un promedio sobre un mínimo de tandas (ej: 500). El jefe aquí es min_tandas.

  • En Eb/N0 altos (BER Bajo): min_tandas se alcanza rápido. Pero total_errores (ej: 300) es difícil de alcanzar. El bucle sigue corriendo hasta lograr la confianza estadística. El jefe aquí es min_errors.


3. ¿Por qué encontrar "X" errores (min_errors) da Confiabilidad?

La confiabilidad se basa en la estabilidad del numerador.

Analogía del Dado: No es lo mismo medir la probabilidad de un evento raro (ej. sacar "triple 6") tirando 100 veces y obteniendo 1 o 2 éxitos (un resultado "ruidoso"), que tirar hasta obtener 300 éxitos.

Al fijar min_errors = 300, estamos fijando el numerador de nuestra fórmula BER = Errores / Total_Bits.

  • Una medición de 8 / N_bits vs 9 / N_bits es muy inestable (una diferencia del 12.5%).
  • Una medición de 300 / N_bits vs 301 / N_bits es extremadamente estable (una diferencia del 0.3%).

Forzar 300 errores nos obliga a simular el Total_Bits (denominador) necesario para que esa medición sea consistente y confiable.


4. Impacto de los Nuevos Parámetros del Sistema (Tandas Chicas)

Adicionalmente, se modificaron los parámetros en params.py (K_TOTAL, N, N_sym) para reducir el tamaño de cada "tanda" a 126 bits (antes 144,000).

Impacto: Como cada tanda es ~1000 veces más pequeña, los valores de simulación debieron re-balancearse drásticamente.

Valores sugeridos:

  • min_errors = 300: Un buen balance entre confianza y tiempo.
  • min_tandas = 500: Asegura un promedio de 500 × 126 = 63,000 bits en la zona de BER alto.
  • max_bits = 10_000_000: Un "freno de seguridad" para evitar que la simulación tarde eternamente en puntos de BER muy bajo.

5. ¿Cómo probarlo y a qué me tengo que aproximar?

El objetivo no es que la curva verde (medida) toque la roja (teórica). El "gap" entre ellas es la penalización real del canal y el ecualizador.

El objetivo es que la curva verde (medida) sea precisa y suave.

Cómo probar:

Observa la izquierda del gráfico (0-7 dB): ¿La curva es "suave" o tiene picos?

  • Si tiene picos, no promediaste lo suficiente. Aumenta min_tandas (ej. de 500 a 1000).

Observa la derecha del gráfico (8-10 dB): ¿La curva se "aplana" o se corta abruptamente?

  • Si quieres más confianza en esta zona, aumenta min_errors (ej. de 300 a 1000).
  • Si al aumentar min_errors, la simulación se corta por max_bits, también deberás aumentar max_bits (ej. de 10M a 20M).

Resultado

El resultado de este PR es una simulación que genera un gráfico de BER robusto, confiable y publicable, como el que se obtuvo en las pruebas.

@matterod matterod requested a review from AguTrachta November 14, 2025 23:32
@matterod matterod self-assigned this Nov 14, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant