A continuación se mostrarán varias gráficas de BER vs EbN0 resultado de las simulaciones con el
programa desarrollado en C++. En el anexo C se muestra un ejemplo de la salida de una de las simulaciones en el archivo “outputUMTSTurbo.txt” que genera el modelo. Primeramente se simulan en el programa en C un tren de símbolos con N = 60,000 bits con bloques de tamaño = 40 lo que le correspondería por el estándar de UMTS un interleaver de 5 x 8, (figura 5.2)
Figura 5.2 BER del Turbo Codificador en C++ con bits enviados N = 60,000 con tamaño de bloques = 40 para diferentes iteraciones (original en color)
En la figura 5.2, se puede apreciar para las primeras iteraciones que la probabilidad de error no mejora con el aumento de la potencia pero sí con el número de iteraciones aunque no lo hace de manera considerable. A partir de la iteración 6, no existe una mejora en el rendimiento con cada iteración ya que se tiene una tasa de error de 2.33 x 10-3 a 0 dB y con 9 iteraciones se tienen 2.21 x 10-3. A partir de la iteración 7, la diferencia es casi nula. Aquí se puede ver la tendencia de la curva donde a 3dB se tienen 5 x 10-5, a 3.3 dB 1.66 x 10-5 y a 3.4dB el error se hace cero.
Por otro lado, se simularon otras pruebas con el mismo interleaver de 5 x 8 pero con 400 datos como se muestra en la figura 5.3:
Figura 5.3 BER del Turbo Codificador en C++ con bits enviados N = 400 con tamaño de bloques = 40 para diferentes iteraciones (original en color)
En la gráfica de la figura 5.3 se puede apreciar el mismo comportamiento que en la figura 5.2, sin embargo, al procesar menos bits la tendencia de la curva prácticamente se hace cero a 0.3 dB con 4 iteraciones. Esto significa que son necesarias más iteraciones para mejorar el rendimiento cuando se tienen más datos.
En la figura 5.4 se puede apreciar a más detalle esta tendencia de la curva donde el tamaño del interleaver es de 5 x 8 y a 0.2 dB se tiene una tasa de error de 2.5 x 10-3 para tender a cero a 0.3 dB. El rendimiento del turbo codificador es estable a más número de bits procesados para alcanzar las tasas de errores de 10-6 que muestra la literatura.
En la figura 5.5 se muestra una curva con N = 40,000 bits enviados con un tamaño de interleaver de 5 x 8 con 5 iteraciones donde se puede observar que a 2dB se tiene una tasa de error de 1.2 x 10-4 y a 3dB se tiene una tasa de error de 2.5 x 10-5. Aquí se puede apreciar que a mayor número de bits enviados se requieren más iteraciones para corregir los errores y mejorar el rendimiento.
Figura 5.4 BER del Turbo Codificador en C++ con bits enviados N = 400 con tamaño de bloques = 40 para 4 iteraciones (original en color)
Figura 5.5 BER del Turbo Codificador en C++ con bits enviados N = 40,000 con tamaño de bloques = 40 para 5 iteraciones (original en color)
Partiendo de la figura 5.5, se realizó una comparativa con uno de los trabajos enfocados al diseño de turbo codificadores para WCDMA, [30] con parámetros cercanos a los simulados para un tamaño de bloques = 40 y 6 iteraciones.
De esta forma, se puede apreciar en la figura 5.6 un comportamiento parecido en cuanto a la tendencia de las curvas, sin embargo, la curva del programa en C muestra un rendimiento de 2.5 x 10-5 a 3dB contra un rendimiento de 2.5 x 10-4 para [30]. Esta diferencia se debe mucho a las condiciones de simulación, donde los autores lo implementan en un FPGA con 10 millones de muestras y el programa en C utiliza 40,000 bits donde la corrección de errores es mayor. La razón de implementarlo con menos bits es por el tiempo de procesamiento que se lleva en C que será mostrado en una gráfica posterior esta diferencia en tiempos.
Figura 5.6 Comparativa BER vs EbN0 del program en C++ y BER generado por X. J. Zeng y Z. L. Hong10 (original en color)
Se generó otra gráfica con N = 4000 bits enviados con bloques de tamaño = 400, lo que le corresponde un interleaver de 10 x 40 por el estándar UMTS y 5 iteraciones como se muestra en la figura 5.7:
10 Curva obtenida de X. J. Zeng, Z. L. Hong, “Design and Implementation of a Turbo Decoder for 3G W-CDMA
Figura 5.7 BER del Turbo Codificador en C++ con bits enviados N = 4000 con tamaño de bloques = 400 para 5 iteraciones (original en color)
En la figura se puede apreciar el comienzo en 0 dB con una tasa de error de 3 x 10-3 y cayendo a 7.5 x 10-4 a 0.6 dB comenzando a bajar más suavemente hacia 1.2 dB con 5 x 10-4. El fenómeno que se observa de los 0.6 dB a 1.2 dB es conocido como “error floor” donde la probabilidad de error a altos SNR´s es dominado por la distancia libre del código debido a la estructura de los polinomios generadores y el interleaver. Esto ocasiona que la caída del BER sea más lenta, definido como el comportamiento asintótico de los turbo códigos, [9].
Por otro lado, en la figura 5.8 se muestra una simulación para un tren de bits de N=600,000 con un tamaño de interleaver = 5 x 12 para bloques de 60 bits. Aquí se aprecia que a 4 dB se tiene ya una tasa de error de 3.33 x 10-6 que comparado con la figura 5.5 con N = 40,000 bits y 5 Iteraciones, aún no se hace cero. Estas mismas condiciones se generaron para Simulink, donde se muestra en la figura 5.9. Se puede apreciar que a 4 dB se tiene una tasa de error de 4.5 x 10-4 que comparado con la figura 5.8, tiene una diferencia de 4.4 x 10-4.
Figura 5.8 BER del Turbo Codificador en C++ con bits enviados N = 600,000 con tamaño de bloques = 60 para 7 iteraciones (original en color)
Figura 5.9 BER del Turbo Codificador en Simulink con bits enviados N = 600,000 con tamaño de bloques = 60 para 7 iteraciones (original en color)
En las simulaciones se midieron los tiempos del procesador para cada curva y cada iteración. De esta manera, en la figura 5.10, se procesaron las curvas para un envío N = 600,000 bits para 1, 3, 5 y 7 iteraciones. El tamaño del interleaver es de 5 x 12 correspondientes al estándar UMTS para bloques de 60 bits.
Figura 5.10 BER del Turbo Codificador en C++ con bits enviados N = 600,000 con tamaño de bloques = 60 para diferentes iteraciones (original en color)
Tabla 5.2 Tiempos de procesamiento para N = 600,000 bits
Turbo Codificador C++ Interleaver 5 x 12, N = 600,000
Iteración Tiempo en segundos por
cada dB Total en minutos (0 – 4 dB) 1 247.86 20.6 3 739.28 61.6 5 1230.70 102 7 1981.41 162 Total en horas 5.8
La figura 5.11 muestra el mismo proceso para decodificar 600,000 bits con 7 iteraciones, pero con diferentes interleavers, uno para un tamaño de bloque de 60 y otro para un tamaño de bloque de 600. Se observa un mejor rendimiento conforme el tamaño de bloque es mayor, sin embargo, los tiempos producidos por el programa se incrementan, como se muestra en la tabla 5.3.
Figura 5.11 BER del Turbo Codificador en C++ con bits enviados N = 600,000 con diferentes tamaños de bloques para 7 iteraciones (original en color)
Turbo Codificador C++ N = 600,000, Iteraciones = 7
Interleaver Tiempo en horas
5 x12 2.4
20 x 30 30.57
En la figura 5.12 se muestra un proceso con 1, 000,000 de bits y un interleaver = 5 x 20 con 7 iteraciones. Se puede observar la tendencia de la curva desde una tasa de error de 2.3 x 10-3 con 0 dB hasta una tasa de error de 1 x 10-6 con 5 dB.
Figura 5.12 BER del Turbo Codificador en C++ con bits enviados N = 1000,000 con tamaño de bloque = 100 para 7 iteraciones (original en color)
En la figura 5.13 se muestran las tres curvas correspondientes a diferente número de bits enviados donde se puede observar que el número de bits mientras mayor sea, más va a tardar en corregir los errores, sin embargo muestra un muy buen rendimiento hacia un mayor tamaño de bloques. También se genera una comparación de rendimiento con estas mismas condiciones para el caso con Simulink mostrado en la figura 5.14. Aquí se vuelve a observar que el rendimiento en el programa en C es mejor que en Simulink.
Figura 5.13 Comparativa entre diferente número de bits enviados (original en color)
Figura 5.14 BER del Turbo Codificador en C++ vs Simulin con bits enviados N = 1000,000 con tamaño de bloque = 100 para 7 iteraciones (original en color)
Capítulo 6
Conclusiones y trabajo futuro
Este capítulo contiene las conclusiones obtenidas del trabajo desarrollado durante toda la tesis y las correspondientes a los resultados generados por la herramienta en C++. Además se hace una reflexión sobre los objetivos planteados inicialmente en el proyecto proponiendo mejoras al programa en C++ y hacer recomendaciones para el trabajo futuro tomando como base este proyecto realizado.