APOYOS DIDACTICOS PARA LA CLASE DE COMUNICACIONES CON MATLAB por Sandra Ivonne Lara Sotelo Presentado a la academia de Sistemas Digitales y Comunicaciones del Instituto de Ingeniería y Tecnología de La Universidad Autónoma de Ciudad Juárez para su evaluación LA UNIVERSIDAD AUTÓNOMA DE CIUDAD JUÁREZ Marzo del 2010 Mtra. Alejandra Mendoza ___________________________________________ Presidente de la academia Dr. Víctor Manuel Hinostroza Zubia Asesor ___________________________________________ Sandra Ivonne Lara Sotelo Alumno ___________________________________________ Justificación de la investigación: Hasta ahora los métodos que se han utilizado para facilitar el aprendizaje de los alumnos en las clases de comunicaciones han sido simples. Actualmente la información que se tiene acerca del área de comunicaciones se imparte mediante un glosario definido, y para esclarecer las definiciones de estas materias los recursos son insuficientes. En esta investigación se da una breve información acerca de programas que pueden ser utilizados por el profesor en las clases de comunicaciones. Todo esto con el fin de que los alumnos tengan una clara idea de muchos de los conceptos en las clases. La habilidad para usar herramientas tales como Matlab se convirtió rápidamente en un requisito para muchas actividades de Ingeniería. Este software es muy sencillo de utilizar y tiene muchas aplicaciones. Además cuenta con muchas librerías y herramientas que son útiles a la hora de resolver problemas matemáticos. Los profesores de comunicaciones impartirían su clase de manera más interpretativa para los alumnos con programas en donde pudieran simular cada uno de los conceptos de comunicaciones. Estos programas pueden emplearse no sólo para reforzar y visualizar conceptos de comunicaciones, sino también para resolver problemas y para el diseño avanzado [1]. Antecedentes: Hasta hace poco, la mayoría de los usuarios de Matlab eran personas que tenían conocimientos previos sobre lenguajes de programación como Fortran o C, y que decidieron cambiarse a Matlab una vez que este software se hizo suficientemente popular [2]. En los últimos años, sin embargo, Matlab se enseña como el primer lenguaje, sobre todo si se trata de clases en donde se manejan conceptos de comunicaciones. Las clases de comunicaciones que se imparten en la universidad son: Comunicaciones I, Comunicaciones II y Comunicaciones Digitales. En estas clases se ha utilizado Matlab para graficar señales y hacer operaciones sencillas con ellas con el objetivo de identificar claramente como es la señal. Un ejemplo es el sumar dos señales y ver cuál es la señal resultante. En algunos programas se inicializa una frecuencia y una fase para luego introducirlas a una señal y percibirla en una gráfica. Pero más allá de esos programas sencillos, los demás conceptos de estas clases hasta ahora se explican en el pizarrón. Existen muchas funciones o programas que nos ayudan en el conocimiento de las comunicaciones. En Matlab los comandos para realizar operaciones son muy sencillos, solo hay que poner el nombre del comando con sus respectivas entradas para que arroje un resultado. Por ejemplo, para realizar la correlación de dos señales solamente hay que introducir la función xcorr (x, y) y asignarla a una variable. También existen otras funciones como la de la convolución, Transformada de Fourier, Transformada de Laplace, etc. Planteamiento del problema: Los profesores que imparten las materias de comunicaciones, en la mayoría de los casos cuando realizan gráficas u operaciones lo hacen en el pizarrón, esta por demás decir que esta manera la más explícita para los alumnos. Esto se debe a que los trazos no son exactos, la precisión del profesor para dibujar no es buena, la gráfica es muy difícil de dibujar, el espacio para dibujar la gráfica no es suficiente, etc. Es por eso que en muchas ocasiones los profesores recurren a medios electrónicos para impartir su clase. Matlab es el recurso más importante que utilizan los profesores de las clases de comunicaciones de la UACJ para resolver problemas. Pero cuando se utiliza Matlab se hacen operaciones muy sencillas, como por ejemplo la graficación de una señal dada. Cuando el profesor imparte su clase se apoya de un proyector para plasmar sus conocimientos a sus alumnos. Este medio es efectivo ya que se muestra la señal graficada de una manera muy precisa; La señal es clara debido a que la imagen es obtenida de algún programa de computadora; sin embargo, se necesitan programas en los que se vea cómo se va formando dicha señal dependiendo del concepto de comunicaciones que se esté enseñando. Marco teórico: Matlab es una de las muchas sofisticadas herramientas de computación disponibles en el comercio para resolver problemas de matemáticas. Sus aplicaciones comprenden la mayoría de las áreas de ciencia e ingeniería [3]. Matlab es una abreviatura de Matrix Laboratory, laboratorio matricial. En muchas clases de ingeniería, la realización de cálculos con un programa de computación matemático como Matlab sustituye la programación de computadoras más tradicional. Matlab se escribió originalmente en Fortran y después se reescribió en C. Matlab es un instrumento muy útil al trabajar con matrices y gráficos. Brinda una eficiente base de cálculo para un “laboratorio de sotware” donde se exploran los conceptos y se prueban los diseños de sistemas [4]. Para realizar un programa en Matlab los pasos son los siguientes: 1. Plantear el problema. Se tiene que tener una idea clara de que es lo que se quiere. 2. Describir las entradas y salidas. Se debe saber cuáles son los datos de los que queremos partir y su relación con las salidas y también las constantes que requiera el cálculo. Además es importante manejar bien las unidades que se van a utilizar. 3. Desarrollar algoritmo. Tener un algoritmo ayuda a aclarar y ordenar las ecuaciones que se utilizaran y cada uno de los pasos que se llevarán a cabo, luego reflejarlo en Matlab. 4. Resolver el problema. Este paso implica encontrar la solución al problema. 5. Probar la solución. Comparar los resultados obtenidos con los que se esperaban. El lenguaje que Matlab utiliza es de alto nivel. Cuenta con comandos de visualización en 2D y 3D así como numerosas instrucciones, funciones y librerías. Matlab crea archivos para manipulación con extensión .m, archivos para interfaz gráfica del usuario .gui, archivos gráficos .fig, además el usuario puede crear sus variables y funciones. El Simulink es una parte de Matlab que nos sirve para simular Sistemas Dinámicos No Lineales. Este simulador tiene Blocksets, que sirven para poder trabajar con procesamiento de señales y comunicaciones. El conjunto de herramientas para procesamiento de señales de Matlab tiene una gran variedad de funciones para generar señales, la mayor parte de las cuales requieren representación vectorial del tiempo t o n. Objetivo general: Desarrollar e implementar materiales de apoyo didáctico en Matlab para las clases de comunicaciones. Metodología Objetivos específicos: 1 Investigar bibliográfica sobre los temas de la clase de comunicaciones digitales 2 Practicar programación en Matlab 3 Realizar análisis de los programas que se van a implementar 4 Desarrollar algoritmos para los programas 5 Realizar los programas para cada una de las clases 6 Probar los programas en clase 7 Documentar el proyecto Metas: 1.1 Investigar un mínimo de 8 fuentes bibliográficas de y 8 fuentes electrónicas de información acerca de los temas de comunicaciones para el 20 de agosto. 2.1 Investigar por lo menos 3 manuales de Matlab en fuentes bibliográficas y electrónicas para el 20 de agosto. 3.1 Plantear los problemas basados en los temas de comunicaciones para los cuales se va a programar para el 27 de agosto. 4.1 Desarrollar algoritmos de todos los programas de comunicaciones para el 10 de septiembre. 5.1 Realizar los diagramas de flujo basados en los algoritmos para el 17 de septiembre. 7.1 Programar, verificar y depurar los problemas para el 5 de noviembre. 7.1 Documentar el proyecto para el 19 de noviembre. Acciones: Meta 1.1 1.1.1 Investigar en Internet, revistas y libros 1.1.2 Investigar en biblioteca UACJ/ UTEP Meta 2.1 2.1.1 Investigar en Internet, libros y manuales 2.1.2 Investigar en biblioteca UACJ/UTEP Meta 3.1 3.1.1 Definir cuáles van a ser los temas a programar 3.1.2 Definir datos de entrada y salida Meta 4.1 4.1.1 Investigar en internet y libros 4.1.2 Investigar en biblioteca UACJ/UTEP 4.1.3 Diseñar el algoritmo para cada uno de los programas Meta 5.1 5.1.1 Diseñar los diagramas de flujo basados en los algoritmos Meta 6.1 7.1.1 Escribir el código de los programas 7.1.2 Depurar los programas 7.1.3 Correr los programas y verificar resultados Meta 7.1 7.1.1. Acudir con el asesor para la revisión de los programas 7.1.2. Documentar la información y resultados obtenidos del proyecto Requerimientos: Meta 1.1 • Computadora con Internet • Acceso a UACJ/UTEP • Apuntes de clases de comunicaciones • Computadora con Internet • Acceso a UACJ/UTEP • Anotaciones (libreta y lápiz) • Computadora Meta 2.1 Meta 3.1 Meta 4.1 • Computadora con Internet • Acceso a UACJ/UTEP • Anotaciones (libreta y lápiz) • Computadora • Anotaciones (libreta y lápiz) • Computadora • Anotaciones (libreta y lápiz) • Software Matlab 7.0 • Computadora con Internet • Impresora Meta 5.1 Meta 6.1 Meta 7.1 Plan de trabajo: A continuación se muestra un cronograma con las actividades a realizar antes mencionadas: Cronograma de acciones Acciones Numero Acción 1.1.1 Acción 1.1.2 Acción 2.1.1 Acción 2.1.2 Acción 3.1.1 Acción 3.1.2 Acción 4.1.1 Acción 4.1.2 Acción 4.1.3 1 Agosto Septiembre Octubre Noviembre Diciembre Semana Semana Semana Semana Semana 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 Acción 5.1.1 Acción 6.1.1 Acción 6.1.2 Acción 6.1.3 Acción 7.1.1 Acción 7.1.2 Referencias: [1] Ashok Ambardar. Procesamiento de Senales analógicas y digitales. Thomson. 2002. [2] Amos Gilat. Matlab una introducción con ejemplos prácticos. Reverté. 2005 [3] http://mat21.etsii.upm.es/ayudainf/aprendainf/Matlab70/matlab70primero.pdf, 26 febrero. [4] Simon Haykin, BarryVan Veen. Señales y Sistemas. Limusa wiley. 2004. AYUDAS DIDÁCTICAS DE LAS CLASES DE COMUNICACIONES EN MATLAB Por Sandra Ivonne Lara Sotelo Presentado a la Academia de Sistemas Digitales y Comunicaciones Del Instituto de Ingeniería y Tecnología de La Universidad Autónoma de Ciudad Juárez Para obtener el título de INGENIERO EN SISTEMAS DIGITALES Y COMUNICACIONES UNIVERSIDAD AUTÓNOMA DE CIUDAD JUÁREZ Noviembre del 2010 UNIVERSIDAD AUTÓNOMA DE CIUDAD JUÁREZ Instituto de Ingeniería y Tecnología EVALUACiÓN DE EXAMEN Fecha: 26 de Noviembre del 2010 Horario: 09:00 - 11 :00 HRS. PROFESIONAL INTRACURRICULAR NIVEL: LICENCIATURA I TEMA: "Apoyos didácticos para clase de comunicaciones con MATLAB " l La evaluación del examen profesional intracurricular consta de 4 partes: (Desarrollado en 1 hora) 1°._ 2°_ 3°.4°._ Exposición por parte de los alumnos (máximo 20 minutos). Réplica por parte del jurado. Comentarios ylo recomendaciones. Entrega de resultados. Nombre del alumno: Sandra Ivonne Lara Sotelo _-"Z",,--1-__ Calificación Maestro de la materia (30%) 3<1 Calificación Director de Trabajo (40%) Calificación del Jurado (30%) __0(5 TOTAL Se recomienda que el documento se deposite para consulta en la BIBLIOTECA SiD NoD Jurado Director de Trabajo Coordinador de la Materia "Proyecto de Titulación" r. Viclor Manuel Hinoslrozo Zubia Dr. Viciar Manuel Hinoslrozo Zubia / a / /' Oro' Nelly Gordillo Coslíllo FIRMADO EN ORIGINAL • u·e DEP 11 INGENIF y CO, ~ ENTO Dé FLECTRlc JT A\l r\ ii Resumen Matlab es un programa orientado al cálculo con matrices que tiene muchas herramientas muy poderosas para trabajar en muchas ramas de la ingeniería. Matlab se utiliza en este proyecto para hacer ayudas para los alumnos de las clases de comunicaciones, tales como Comunicaciones I, Comunicaciones II y Comunicaciones Digitales. Estas ayudas están implementadas en la Interfaz Gráfica de Usuario (GUI) de Matlab. Los programas se eligieron de acuerdo a los temas que tienen las clases de comunicaciones, y los que más trabajo cuesta entender a los alumnos. Los programas son: Serie de Fourier, Transformada de Fourier, Convolución y Correlación, Decibeles, Muestreo, Muestreo de una Señal PAM, Modulación AM, FM y PM, Modulación PSK y QAM, Codificación de Bloque Lineal, Codificación Hamming, Codificación Cíclica y Codificación Convolucional. Estos programas se implementaron de acuerdo a ejercicios que se realizan en las clases y a análisis previos de los temas de comunicaciones. Primero se investigaron y analizaron los temas a implementar, luego se investigaron las posibles funciones de Matlab que pudieran simplificar los cálculos. Al tener el análisis de parámetros de los programas, se implementaron en un editor de textos para crear un archivo .m de Matlab y proceder a realizar la depuración. Al final, dichos programas se implementaron en la GUI de Matlab y se hicieron pruebas con ejemplos que se aplican en las distintas clases de comunicaciones. iii Declaratoria de Originalidad Yo Sandra Ivonne Lara Sotelo, declaro que el material contenido en este documento es original y no ha sido copiado de ninguna otra fuente, ni ha sido usado para obtener otro título o reconocimiento en ésta u otra institución de educación superior. __________________________ Sandra Ivonne Lara Sotelo iv Agradecimientos A mis padres, por su apoyo. A mi padre por su coraje y palabras fuertes, porque sin esas palabras yo nunca hubiera tenido el coraje de seguir adelante. A mi madre por su comprensión, ayuda, cariño, paciencia, porque siempre creyó en mí, por todo. A mis hermanos, Fabiola y Miguel, por que sin ellos no tendría a las dos personas más importantes a quienes dar el ejemplo. A mi familia por apoyarme incondicionalmente. A mi padrino y mi madrina, porque siempre estuvieron ahí para felicitarme en mis logros, y eso me hacía comprometerme a seguir adelante y a hacer más para que estuvieran orgullosos de mí. A mi prima Maribel por su ejemplo, apoyo e interés. A toda mi familia materna por empujarme con sus ánimos a ser la primer profesionista en la familia. A mis profesores por su conocimiento y apoyo. A Juan Luna, Jesús Estrada y Valente Barrón por sus palabras de apoyo y sus consejos, porque desde la preparatoria me dijeron que sí podía y me dieron el ejemplo, me orientaron para ser lo que soy ahora. A Víctor Hinostroza por toda su experiencia, sabiduría y consejos. v Lista de Figuras Figura 2.1 Controles de la GUI ................................................................................... 13 Figura 3.1 Función escalón unitario ............................................................................ 17 Figura 3.2 Función Rampa .......................................................................................... 17 Figura 3.3 Función sinc ............................................................................................... 17 Figura 3.4 Función seno .............................................................................................. 18 Figura 3.5 Función coseno .......................................................................................... 18 Figura 3.6 Función triangular...................................................................................... 18 Figura 3.7 Función diente de sierra ............................................................................. 18 Figura 3.8 Función cuadrática ..................................................................................... 19 Figura 3.9 Transformada de Fourier ........................................................................... 21 Figura 3.10 Modulación de una señal ......................................................................... 25 Figura 3.11 Demodulación de una señal ..................................................................... 25 Figura 3.12 Señal PAM ............................................................................................... 31 Figura 4.1 Tipos de modulación digital ...................................................................... 32 Figura 4.2 Diagramas de constelación de PSK. a) BPSK. b) QPSK........................... 34 Figura 4.3 Diagramas de constelación de QAM. a) 4-QAM. b) 8-QAM. c) 16-QAM. d) 32-QAM .................................................................................................................. 36 Figura 6.1a Inicialización (Serie de Fourier) ............................................................. 48 Figura 6.1b Elementos del programa (Serie de Fourier) ............................................ 49 Figura 6.1c Ejemplo (Serie de Fourier) ...................................................................... 50 Figura 6.2a Inicialización (Transformada de Fourier) ............................................... 50 Figura 6.2b Elementos del programa (Transformada de Fourier) .............................. 51 Figura 6.2c Ejemplo (Transformada de Fourier) ....................................................... 52 Figura 6.3a Inicialización (Convolución y Correlación) ............................................ 52 Figura 6.3b Elementos del programa (Convolución y Correlación) .......................... 54 Figura 6.3c Ejemplo (Convolución y Correlación) .................................................... 55 Figura 6.4a Inicialización (Modulación AM, FM y PM) ........................................... 56 Figura 6.4b Elementos del programa (Modulación AM, FM y PM) ......................... 57 Figura 6.4c Ejemplo (Modulación AM) ..................................................................... 58 Figura 6.4d Ejemplo (Modulación FM) ..................................................................... 58 Figura 6.4e Ejemplo (Modulación PM) ..................................................................... 58 Figura 6.5a Inicialización (Decibeles y Watts) .......................................................... 59 Figura 6.5b Elementos del programa (Decibeles y Watts) ......................................... 59 Figura 6.5c Ejemplo (Decibeles y Watts) .................................................................. 60 Figura 6.6a Inicialización (Muestreo de señales) ....................................................... 61 Figura 6.6b Elementos del programa (Muestreo de señales) ..................................... 61 Figura 6.6c Ejemplo (Muestreo de señales) ............................................................... 62 Figura 6.7a Inicialización (Muestreo de señal PAM) ................................................ 62 Figura 6.7b Elementos del programa (Muestreo de señal PAM) ............................... 63 Figura 6.7c Ejemplo (Muestreo de señal PAM) ......................................................... 64 Figura 6.8a Inicialización (Modulación digital) ......................................................... 64 Figura 6.8b Elementos del programa (Modulación digital) ....................................... 66 vi Figura 6.8c Ejemplo (Modulación PSK) .................................................................... 66 Figura 6.8d Ejemplo (Modulación QAM) .................................................................. 67 Figura 6.9a. Inicialización (Codificación de bloque lineal) ....................................... 67 Figura 6.9b. Elementos del programa (Codificación de bloque lineal) ..................... 69 Figura 6.9c. Ejemplo (Codificación de bloque lineal) ............................................... 70 Figura 6.10a. Inicialización (Codificación Hamming) ............................................... 70 Figura 6.10b. Elementos del programa (Codificación Hamming) ............................. 71 Figura 6.10c. Ejemplo (Codificación Hamming) ....................................................... 72 Figura 6.11a. Inicialización (Codificación Cíclica) ................................................... 73 Figura 6.11b. Elementos del programa (Codificación Cíclica) .................................. 74 Figura 6.11c. Ejemplo (Codificación Cíclica) ........................................................... 75 Figura 6.12a. Inicialización (Codificación Convolucional) ....................................... 75 Figura 6.12b. Elementos del programa (Codificación Convolucional) ..................... 76 Figura 6.12c. Ejemplo (Codificación Convolucional) ............................................... 77 vii Índice Declaración de originalidad ........................................................................................ VI Agradecimientos........................................................................................................... V Lista de figuras ............................................................................................................ VI CAPÍTULO 1. Introducción.......................................................................................... 1 CAPÍTULO 2. Matlab................................................................................................... 2 2.1 Introducción a Matlab ................................................................................. 2 2.2 Comandos básicos ....................................................................................... 5 2.2.1 Operadores Relacionales .............................................................. 6 2.2.2 Operadores Lógicos...................................................................... 6 2.3 Matrices ....................................................................................................... 7 2.4 Definición de funciones .............................................................................. 8 2.5 Interfaz Gráfica de Usuario (GUI) ............................................................ 10 CAPÍTULO 3. Conceptos básicos de comunicaciones ............................................... 15 3.1 Señales y sistemas ..................................................................................... 16 3.2 Serie de Fourier ......................................................................................... 19 3.3 Transformada de Fourier ........................................................................... 20 3.4 Correlación ................................................................................................ 22 3.5 Convolución .............................................................................................. 23 3.6 Modulación y demodulación ..................................................................... 24 3.6.1 Modulación AM ......................................................................... 26 3.6.2 Modulación FM.......................................................................... 27 3.6.3 Modulación PM.......................................................................... 27 3.7 Decibeles ................................................................................................... 28 CAPÍTULO 4. Modulación Digital............................................................................. 30 4.1 Muestreo .................................................................................................... 30 4.2 Modulación por Amplitud de Pulsos (PAM) ............................................ 30 4.3 Tipos de Modulación Digital..................................................................... 32 4.3.1 Modulación PSK ........................................................................ 33 4.3.2 Modulación QAM ...................................................................... 35 CAPÍTULO 5. Codificación para control de errores .................................................. 37 5.1 Fundamentos y definiciones...................................................................... 37 5.2 Códigos de bloque ..................................................................................... 39 5.2.1 Códigos de bloque lineales......................................................... 39 5.2.2 Código Hamming ....................................................................... 42 5.3 Códigos cíclicos ........................................................................................ 45 5.4 Códigos convolucionales........................................................................... 46 CAPÍTULO 6. Resultados........................................................................................... 48 6.1 Serie de Fourier ......................................................................................... 48 6.1.1 Elementos del programa ............................................................. 49 6.1.2 Ejemplo ...................................................................................... 49 6.2 Transformada de Fourier ........................................................................... 50 6.2.1 Funcion fft (x,N) ........................................................................ 51 6.2.2 Elementos del programa ............................................................. 51 viii 6.2.3 Ejemplo ...................................................................................... 52 6.3 Convolución y Correlación de señales ...................................................... 52 6.3.1 Función conv (x, h) .................................................................... 54 6.3.2 Función xcorr (x, h).................................................................... 54 6.3.3 Elementos del programa ............................................................. 54 6.3.4 Ejemplo ...................................................................................... 55 6.4 Modulación AM, FM y PM....................................................................... 56 6.4.1 Función amod (x,fc,fs, 'method')................................................ 56 6.4.2 Elementos del programa ............................................................. 56 6.4.3 Ejemplo de modulación AM ...................................................... 57 6.4.4 Ejemplo de modulación FM ....................................................... 58 6.4.5 Ejemplo de modulación PM ....................................................... 58 6.5 Conversión dB a Watts y Watts a dB ........................................................ 59 6.5.1 Elementos del programa ............................................................. 59 6.5.2 Ejemplo ...................................................................................... 60 6.6 Muestreo de señales .................................................................................. 60 6.6.1 Elementos del programa ............................................................. 61 6.6.2 Ejemplo ...................................................................................... 62 6.7 Muestreo de señal PAM ............................................................................ 62 6.7.1 Elementos del programa ............................................................. 63 6.7.2 Ejemplo ...................................................................................... 64 6.8 Modulación PSK y QAM .......................................................................... 64 6.8.1 Función dmod (x, Fc, Fd, Fs, 'method')...................................... 65 6.8.2 Elementos del programa ............................................................. 65 6.8.3 Ejemplo de modulación PSK ..................................................... 66 6.8.4 Ejemplo de modulación QAM ................................................... 67 6.9 Codificación de Bloque Lineal.................................................................. 67 6.9.1 Función encode (msg, n, k, 'method', genmat) ........................... 68 6.9.2 Elementos del programa ............................................................. 69 6.9.3 Ejemplo ...................................................................................... 69 6.10 Codificación Haming .............................................................................. 70 6.10.1 Elementos del programa ........................................................... 71 6.10.2 Ejemplo .................................................................................... 72 6.11 Codificación Cíclica ................................................................................ 72 6.11.1 Función cyclpoly (n, k, 'opt').................................................... 73 6.11.2 Elementos del programa ........................................................... 74 6.11.3 Ejemplo .................................................................................... 74 6.12 Codificación Convolucional.................................................................... 75 6.12.1 Elementos del programa ........................................................... 76 6.12.2 Ejemplo .................................................................................... 76 CAPÍTULO 7. Conclusiones....................................................................................... 78 Referencias .................................................................................................................. 79 APÉNDICE A. Archivo .m: Serie de Fourier ............................................................. 80 APÉNDICE B. Archivo .m: Transformada de Fourier ............................................... 83 APÉNDICE C. Archivo .m: Convolución y Correlación de señales .......................... 84 ix APÉNDICE D. Archivo .m: Modulación AM, FM y PM .......................................... 87 APÉNDICE E. Archivo .m: Conversión dB a Watts y Watts a dB ............................ 89 APÉNDICE F. Archivo .m: Muestreo de señal .......................................................... 90 APÉNDICE G. Archivo .m: Muestreo de señal PAM ................................................ 91 APÉNDICE H. Archivo .m: Modulación PSK y QAM .............................................. 92 APÉNDICE I. Archivo .m: Codificación de Bloque Lineal ....................................... 94 APÉNDICE J. Archivo .m: Codificación Hamming................................................... 97 APÉNDICE K. Archivo .m: Codificación Cíclica .................................................... 101 APÉNDICE L. Archivo .m: Codificación Convolucional ........................................ 103 x CAPÍTULO 1. Introducción Existen muchas funciones o programas que nos ayudan en el conocimiento de las comunicaciones. Matlab es un programa orientado a Matrices. En Matlab los comandos para realizar operaciones son muy sencillos, solo hay que poner el nombre del comando con sus respectivas entradas para que arroje un resultado. Existen muchas funciones para el procesamiento de señales, tales como la de Convolución, Correlación, Transformada de Fourier, Transformada de Laplace, etc. Este documento se divide por capítulos según las unidades o módulos impartidos en las clases de comunicaciones. Primero, se hace un breve análisis sobre el programa Matlab y sus comandos básicos, así como la Interfaz Gráfica de Usuario, que es una parte de Matlab en la que se trabajó en este proyecto. Luego se analiza la teoría y conceptos básicos de modulación análoga. Se revisan los conceptos de señales eléctricas y sistemas lineales, además de los conceptos de Correlación y Convolución. Se explican los conceptos de Modulación AM, FM y PM y sus diversas variantes. La siguiente parte se refiere a una introducción a la modulación digital, empezando con conceptos básicos de modulación digital tales como Muestreo y Señales PAM. Enseguida se revisan los conceptos básicos de Modulación Digital, con sus tres variantes: PSK, FSK y QAM. Después se ven conceptos básicos referentes a la Codificación para Control de Errores (codificación de canal), en donde se revisan los diversos códigos más utilizados y sus características, además se exploran los códigos cíclicos, los códigos de bloque y los códigos convolucionales. Al final del documento se muestran y explican los resultados producidos del código en Matlab. 1 CAPÍTULO 2. Matlab Hasta hace poco, la mayoría de los usuarios de Matlab eran personas que tenían conocimientos previos sobre lenguajes de programación como Fortran o C, y que decidieron cambiarse a Matlab una vez que este software se hizo suficientemente popular [1]. En los últimos años, sin embargo, Matlab se enseña como el primer lenguaje, sobre todo si se trata de clases en donde se manejan conceptos de comunicaciones. 2.1 Introducción a Matlab MATLAB es un programa interactivo basado en matrices para cálculos c ientíficos y de ingeniería. Es una abreviatura de Matrix Laboratory, laboratorio matricial. En muchas clases de ingeniería, la realización de cálculos con un programa de computación matemático como Matlab sustituye la programación de computadoras más tradicional. Matlab se escribió originalmente en Fortran y después se rescribió en C. Originalmente, Matlab fue escrito para simplificar los cálculos con matrices y álgebra linear. Este software es un instrumento muy útil al trabajar con matrices y gráficos. Brinda una eficiente base de cálculo para un “laboratorio de software” donde se exploran los conceptos y se prueban los diseños de sistemas [2]. El lenguaje que Matlab utiliza es de alto nivel. Entre otras cosas integra computación, visualización y programación en un entorno de fácil utilización donde tanto los problemas como las soluciones se expresan en una notación matemática familiar [3]. La interacción en Matlab se realiza mediante instrucciones (comandos), funciones y programas (scripts). Las herramientas y utilidades de Matlab permiten diversas funcionalidades y están agrupadas en "paquetes" o cajas de herramientas (toolboxes). Las cajas de herramientas de Matlab son librerías de funciones que personalizan este software para resolver clases específicas de problemas. Están escritas en código de Matlab para poder visualizar los algoritmos fuente y agregar nuevos. La extensa selección de 2 toolboxes de Matlab nos permite comparar técnicas y escoger la apropiada para una particular aplicación. A Matlab se le pueden añadir paquetes especializados para algunas tareas. El sistema de graficación de Matlab incluye una serie de comandos de muy alto nivel para visualización de imágenes 2D y 3D, animaciones y presentaciones. También posee comandos de más bajo nivel que permiten personalizar la presentación una figura. Además permite que el usuario pueda construir una Interfaz Gráfica de Usuario (GUI). Otra de las herramientas que proporciona, es la de Simulink, que es una aplicación que permite simular en base a modelos y bloques de sistemas. Cuando Matlab realiza un cálculo, lo hace usando los valores que conoce al momento en que el comando que lo solicita es evaluado. Una función de Matlab tiene nombre, valor de retorno y argumentos. Una función se llama utilizando su nombre en una expresión o utilizándolo como un comando más. Las funciones se definen en ficheros de texto *.m. Una característica de Matlab es que las funciones que no tienen argumentos no llevan paréntesis, por lo que a simple vista no siempre son fáciles de distinguir de las simples variables. Los nombres de las funciones de Matlab no son palabras reservadas del lenguaje. Matlab se compone de cuatro ventanas principales: Ventana de comandos (Comand Window). Es la ventana sobre la que se introducen todos los comandos. Espacio de trabajo (Workspace). Ventana donde aparece información sobre los elementos que se han creado. Contiene el conjunto de variables y funciones de usuario que en un determinado momento están definidas en la memoria del programa. Historial de comandos (Comand History). En esta ventana se pueden ver todos los comandos introducidos. 3 Directorio Actual (Current Directory). Es el directorio donde están todos los ficheros *.m de los programas que se ejecutan. Como cualquier otro lenguaje de computación, Matlab tiene reglas para el nombre de las variables. La simplicidad de Matlab implica pocas reglas sobre las variables, las cuales son: Matlab hace distinción entre mayúsculas y minúsculas. Las variables pueden contener hasta 31 caracteres. Las variables deben empezar con un caracter que sea una letra. Los caracteres de puntuación no son permitidos. Tipos de archivos Archivos m: Son archivos de texto ASCII, con la extensión .m que contienen conjuntos de comandos o definición de funciones, los cuales constituyen el centro de la programación en Matlab. Estos ficheros se crean y modifican con cualquier editor de textos. Existen dos tipos de ficheros .m, los ficheros de comandos (scripts) y las funciones. Los primeros contienen un conjunto de comandos que se ejecutan sucesivamente cuando se teclea el nombre del fichero en la línea de comandos de Matlab. Y las funciones permiten definir funciones totalmente análogas a las de Matlab, con su nombre, sus argumentos y sus valores de retorno. Archivos MAT: Son archivos que contienen datos binarios que se guardan con extensión .mat. Archivos MEX: Son archivos Matlab ejecutables compilados a partir de Fortran o C. Se guardan con la extensión .mex. 4 Archivos MDL: Archivos con extensión .mdl. Corresponden a modelos hechos con Simulink. Archivos fig: Son archivos .fig que corresponden a la parte grafica de un programa hecho en la Interfaz Gráfica de Usuario (GUI) de Matlab. 2.2 Comandos básicos Matlab cuenta con muchos comandos de acuerdo a cada necesidad de usuario, algunos de los más básicos son: clear - borra la variables que se hayan usado. help - muestra la ayuda de las funciones y comandos de Matlab. who, whos - muestra las variables introducidas con sus valores. plot - grafica los puntos especificados. cos - función coseno. sin - función seno. square - función cuadrada. sawtooth - función diente de sierra. abs - calcula la magnitud de números complejos o el valor absoluto de números reales. exp - exponencial: ex . log - logaritmo natural. log10 - logaritmo. rem - residuo de una división. 5 fix - redondea hacia cero. floor - redondea hacia -∞. round - redondea hacia el entero más cercano. num2str(x,n) - convierte un número real x en su expresión por medio de una cadena de caracteres, con cuatro cifras decimales por defecto (pueden especificarse más cifras, con un argumento opcional n). str2double - convierte una cadena de caracteres representando un número real en el número real correspondiente en formato de punto decimal con doble precisión. length - calcula la longitud de un vector o matriz. Todo lo que esta seguido del comando % es interpretado por Matlab como comentario. 2.2.1 Operadores relacionales El lenguaje de programación de Matlab dispone de los siguientes operadores relacionales: < menor que > mayor que <= menor o igual que >= mayor o igual que == igual que ~= distinto que 2.2.1 Operadores lógicos 6 Los operadores lógicos de Matlab son los siguientes: && and || or ~ negación lógica 2.3 Matrices Matlab está diseñado fundamentalmente para cálculo matricial. En Matlab se trabaja básicamente con solo un tipo de objeto, una matriz numérica rectangular con posibles entradas complejas; todas las variables son representadas con matrices. En algunos casos, matrices de una fila y una columna interpretadas como escalares, o matrices de una sola fila o una sola columna interpretadas como vectores. Como la mayoría de las calculadoras científicas, Matlab ofrece muchas importantes funciones para matemáticas, ingeniería y las ciencias. Además de funciones comunes, Matlab ofrece cientos de funciones especializadas y algoritmos que son útiles para resolver problemas específicos. Como en casi todos los lenguajes de programación, en Matlab las matrices y vectores son variables que tienen nombres. Para definir una matriz no hace falta establecer de antemano su tamaño. Matlab determina el número de filas y de columnas en función del número de elementos que se proporcionan (o se utilizan). Las matrices se definen por filas; los elementos de una misma fila están separados por blancos o comas, mientras que las filas están separadas por intro (Enter) o por caracteres punto y coma (;). Un ejemplo es el siguiente: A=[1 2 3; 4 5 6; 7 8 9] A= 1 2 3 4 5 6 7 7 8 9 Matlab dispone de varias formas de definir matrices. El introd ucirlas por teclado sólo es práctico en casos de pequeño tamaño y cuando no hay que repetir esa operación muchas veces. Matlab accede a los elementos de una matriz por medio de los índices de fila y de columna encerrados entre paréntesis y separados por una coma. Matlab cuenta con varias funciones y operaciones orientadas a definir con gran facilidad matrices de tipos particulares. 2.4 Definición de funciones Las funciones en Matlab son programas que toman las variables que se les pasan (variables de entrada), luego realiza cálculos y manipulaciones con ellas y devuelve los resultados (variables de salida). Estas funciones definidas se caracterizan porque la primera línea comienza por la palabra function, el formato es el siguiente: function [variables de salida] = nombredefunción(variables de entrada) Puede haber funciones sin valor de retorno y también sin argumentos. Los argumentos son los datos de la función y los valores de retorno son sus resultados. Si no hay valores de retorno se omiten los corchetes y el signo igual (=); si sólo hay un valor de retorno no hace falta poner corchetes. Tampoco hace falta poner paréntesis si no hay argumentos. En Matlab no se modifican los argumentos que recibe en la función, esta es una diferencia que presenta con C, C++ y Java. Los valores de retorno son los que mandan los resultados de una función. Estos valores pueden ser múltiples y matriciales. El número de argumentos y el de valores de retorno puedes ser fijos o no, esto depende de cómo el usuario llama a la función. Las variables definidas dentro de una función son variables locales, esto significa que son inaccesibles desde otras partes del programa y no interfieren con variables del 8 mismo nombre definidas en otras funciones o partes del programa. Estas variables pertenecen al propio espacio de trabajo de la función y no son vistas desde otros espacios de trabajo. Para que la función tenga acceso a variables que no han sido pasadas como argumentos es necesario declarar dichas variables como variables globales, tanto en el programa principal como en las distintas funciones que deben acceder a su valor. Los argumentos que recibe una función de Matlab se copian a variables locales si no son modificados por dicha función. Esto tiene importantes consecuencias en términos de eficiencia y ahorro de tiempo de cálculo. Sin embargo, si dentro de la función se realizan modificaciones sobre los argumentos recibidos, antes se sacan copias de dichos argumentos a variables locales y se modifican las copias. Los valores de retorno se calculan dentro de la función, pero en Matlab no hace falta calcular siempre todos los posibles valores de retorno de la función, sino sólo los que el usuario espera obtener en la sentencia de llamada a la función. En cualquier función existen dos variables definidas de modo automático, llamadas nargin y nargout, que representan respectivamente el número de argumentos y el número de valores de retorno con los que la función ha sido llamada. La ejecución de una función termina cuando se llega a su última sentencia ejecutable. La sentencia return se utiliza para forzar a que una función termine de ejecutarse y devuelva inmediatamente el control al entorno de llamada. Matlab dispone de otra forma de pasar a una función un número variable de argumentos por medio de la variable varargin, que es un vector de celdas (cell array). Un vector de celdas es un vector cuyos elementos son cada uno de ellos una variable de cualquier tipo. Esta variable recoge todos los argumentos a partir de una determinada posición. De igual forma, una función puede tener un número indeterminado de valores de retorno utilizando varargout, que es también un vector de celdas que agrupa los 9 últimos valores de retorno de la función. 2.5 Inte rfaz Gráfica de Usuario (GUI) Matlab Guide es un entorno de programación visual que ofrece Matlab para poder realizar y ejecutar programas de simulación, tiene las características básicas de todos los programas visuales como Visual Basic o Visual C++. El lenguaje más habitual para crear GUI’s es Java, ya que tiene la enorme ventaja de funcionar en cualquier máquina, sin embargo Java resulta muy lento para hacer cálculos eficientemente. En comparación con Java, Matlab es más poderoso al realizar cálculos grandes. La GUI consta de dos archivos: uno .m que contiene el código del programa, y otro .fig que es la parte gráfica. Las dos partes están unidas a través de las subrutinas de llamada (callback). La cadena de invocación es una cadena que consiste en un comando, un conjunto de órdenes o una llamada de función. En esta cadena se especifican todas las tareas de cómputo que deben ejecutarse al elegirse la opción. No siempre es necesario definir la propiedad callback, ya que algunos objetos no ejecutan ningún comando de Matlab. El archivo .m que se crea tiene una estructura predeterminada. Consta de un encabezado y el código correspondiente a las subrutinas. Este archivo es construido automáticamente por Matlab y las líneas de código que aparecen son las que crean la interfaz que aparece en el archivo .fig. El archivo de inicialización define los parámetros básicos de la interfaz y crea un conjunto de identificadores (handles) para cada uno de los objetos que vayan apareciendo sobre la interfaz. Cada uno de los objetos de Matlab tiene un identificador único. Algunos gráficos tienen muchos objetos, por lo tanto tienen múltiples handles. El objeto raíz (pantalla) es siempre único y su identificador es el cero. El identificador de las ventanas es un entero, que aparece en la barra de nombre de dicha ventana. Los identificadores de 10 otros elementos gráficos son números flotantes (float), que pueden ser obtenidos como valor de retorno y almacenados en variables de Matlab. El objeto más general de una GUI es la pantalla (screen). Este objeto es la raíz de todos los demás objetos y sólo puede haber un objeto pantalla. Una pantalla puede contener una o más ventanas (figures). A su vez cada una de las ventanas puede tener uno o más ejes de coordenadas (axes). Una ventana puede tener también controles (uicontrol) tales como botones, barras de desplazamiento, botones de selección o de opción, etc.) y menús (uimenu). Finalmente, los ejes pueden contener los seis tipos de elementos gráficos que permite Matlab: líneas (line), rectángulos (rectangle), polígonos (patches), superficies (surface), imágenes bitmap (image) y texto (text). Todos los valores de las propiedades de los elementos de Matlab (ej. color, etiqueta, valor, posición, texto, etc.) y los valores de las variables del programa se guardan en una estructura, los cuales son accedidos mediante un único y mismo puntero. Una estructura (struct) es una agrupación de datos de tipo diferente bajo un mismo nombre. Estos datos se llaman miembros (members) o campos (fields). En una GUI, el flujo de datos está controlado por las acciones en la interfaz. Los comandos para crear una interfaz con el usuario se escriben en un guión, la interfaz invoca el guión que se ejecute, mientras la interfa z del usuario permanece en la pantalla aunque no se haya completado la ejecución del guión. Cuando se interactúa con un control, el programa registra el valor de esa opción y ejecuta los comandos prescritos en la cadena de invocación. Al completarse la ejecución de las instrucciones de la cadena de invocación, el control vuelve a la interfaz para que pueda elegirse otra opción del menú. Este ciclo se repite hasta que se cierra la GUI. El control guarda un string que describe la acción a realizar cuando se invoca, puede consistir en un solo comando de Matlab o una secuencia de comandos, o en una llamada a una función [4]. 11 Las Componentes principales de GUIDE son: Barra de Menús: Es donde se encuentran las funcione s elementales de edición de GUI’s. Paleta de Componentes: Contiene los controles (uicontrols) que se muestran en la GUI. Barra de Herramientas: Es donde se encuentran los siguientes botones: o Alineación de Componentes (Alignment tool): esta opción permite alinear los componentes que se encuentra en el área de trabajo (Layout Area) de manera personalizada. o Propiedades del Inspector (Property Inspector): Contiene todas las propiedades de cada objeto en forma personalizada. o Navegador de Objetos (Object Browser): Muestra todos los objetos que se encuentran en la figura (en forma de árbol). o Editor de Menús (Menu Editor): El redactor de Menú crea menús de ventana y menús de contexto. o Editor de orden (Tab Order Editor): Es para editar el orden de los objetos de la GUI. o Editor de archivos M (M-File Editor): Despliega en pantalla el archivo .m. Controles de la GUI Los controles de la interfaz con el usuario en Matlab se especifican con la orden uicontrol, y se localizan en la parte izquierda de la pantalla principal de la GUI, son los siguientes: 12 Figura 1. Controles de la GUI. Menú desplegable (Popup Menu). Provee una lista de opciones. Botones (Push Button). Invoca un evento inmediatamente. Caja de listas (List Box). Muestra una lista deslizable. Casilla de verificación (Check Box). Están diseñadas para realizar operaciones de encendido/apagado. Indican el estado de una opción o atributo. Botón de radio (Radio Button). Indica una opción que puede ser seleccionada. Cuando sólo se usa un botón de radio, no existe ninguna diferencia funcional con respecto a una casilla de verificación. Los botones de radio en grupo son mutuamente exclusivos (es decir, si un botón esta encendido, todos los demás botones se apagan), mientras que las casillas de verificación son independientes entre sí. Texto estático (Static Text). Muestra un string de texto en una caja. Barra deslizadora (Slider). Usado para representar un rango de valores. Texto editable (Text Edit). Permite al usuario teclear una cadena de entrada. 13 Panel de botones (Panel Button). Sirve para agrupar dispositivos. Botón de palanca (Toggle Button). Genera una acción que indica un estado binario. (encendido o apagado). Grupo de botones (Button Group) Permite exclusividad de selección con los radio button. Active x. Permite crear aplicaciones exportables. 14 CAPÍTULO 3. Conceptos básicos de Comunicaciones. Los elementos de un sistema de comunicación son: Fuente de información. La fuente de información puede ser análoga, por ejemplo: voz o video o puede ser digital, por ejemplo: información binaria proveniente de una computadora. Codificación de fuente. La codificación de fuente es un proceso que convierte la información de la fuente a digital, si esta es análoga y además convierte esta información binaria a otro código, que requiere menos cantidad de bits por fracción de información. Codificación de canal. Esta codificación agrega información redundante a la salida de la codificación de fuente, para asegurar su integridad, corregir errores y a veces su seguridad. Modulador digital. La modulación realizada en esta parte se hace para adecuar la información (banda base) al medio que se use para su transmisión. (pasa-banda) Generalmente es una translación de frecuencia o una translación de nivel o ambas. Canal de comunicación. Medio físico sobre el cual se envía la información de transmisor a receptor. Este medio puede ser un cable, fibra óptica, el aire o un enlace satelital. De-modulador digital. Proceso inverso a la modulación, se hace una translación de frecuencia de pasa-banda a banda base. La salida del de-modulador es una aproximación de la información original. Decodificador de canal. Reconstruye la aproximación de la salida del de-modulador a la información original del modulador de canal, haciendo uso de la información redundante agregada en el modulador de canal del transmisor. Decodificador de fuente. Reconstrucción final de la información original de la fuente. 15 La diferencia entre la versión original de la fuente y la salida del decodificador de la fuente es una medida de la distorsión del sistema de comunicación. 3.1 Señales y sistemas Señales. Es una cantidad eléctrica que se define por una función que describe cómo se desarrolla una variable física en el tiempo. Las señales están definidas por tres características principales: amplitud, fase y frecuencia. La amplitud es el valor escalar instantáneo que se indica en unidades, normalmente Volts de la señal. La frecuencia es un valor que nos indica, asumiendo que una señal es periódica, el número de veces que el periodo se repite en un intervalo de tiempo, las unidades de frecuencia son Hertz. La fase es un valor que indica el valor instantáneo de la amplitud dentro del periodo de la señal. Clasificación de señales. Una señal puede ser aleatoria o determinística, puede ser periódica o no periódica, puede ser continua o puede ser discreta. Las señales aleatorias son en las que hay cierto grado de incertidumbre por su valor de amplitud en cualquier tiempo. Las señales determinísticas, son aquellas que no hay incertidumbre con respecto a su valor en cualquier tiempo. Las señales periódicas son aquellas que sus valores se repiten en un cierto periodo de tiempo. Las señales no periódicas no repiten sus valores en el tiempo. Las señales discretas son aquellas que tiene un rango de valores contable y cada uno de estos valores puede ser asignado a un número real. Las señales continuas tienen un rango de valores infinito y presentan cambios de valores que se pueden asignar a un número. Ejemplos de señales: Función Escalón Unitario. Es una función matemática que tiene como característica el tener un valor de 0 para todos los valores negativos de su argumento, y de 1 para todos los valores positivos de su argumento. 16 1 t 0 1 u (t ) t 0 2 0 t 0 Figura 3.1. Función Escalón unitario. Función Rampa. Es una señal que cambia constantemente con el tiempo. t t 0 ramp(t ) u ( )d tu (t ) 0 t 0 Figura 3.2 Función Rampa. Función Sinc. Tiene una singularidad evitable en cero, que generalmente se redefine específicamente como igual a 1. sin c(t ) sen(t ) t Figura 3.3. Función Sinc. Función Seno. Es aquella que asocia a cada ángulo el valor del seno correspondiente. 17 y(t)=Asin(t) Figura 3.4. Función Seno. Función Coseno. Aquella que asocia a cada ángulo el valor del coseno correspondiente. y(t)=cos(t) Figura 3.5. Función Coseno. Función Triangular. Presenta unas velocidades de subida y bajada (Slow Rate) constantes. y(t)= Figura 3.6. Función Triangular. Función Diente de Sierra. Figura 3.7. Función Diente de sierra 18 Función Cuadrática. Figura 3.8. Función Cuadrática. 3.2 Serie de Fourier La Serie de Fourier sirve para representar señales continuas periódicas por medio de una serie de componentes senoidales. Constituyen la herramienta matemática básica del análisis de Fourier empleado para analizar funciones periódicas a través de la descomposición de dicha función en una suma infinitesimal de funciones senoidales mucho más simples (como combinación de senos y cosenos con frecuencias enteras) [5]. El espectro de frecuencia de esta serie muestra las componentes sinusoidales que forman una señal de tiempo continuo dada. En general, el espectro de frecuencia es una función compleja de la variable de frecuencia y es usualmente especificada en términos de un espectro de amplitud y uno de fase. En el caso de señales periódicas, el espectro de frecuencia de la señal se puede generar mediante la representación de la señal como una suma de sinusoides, que se conoce como una Serie de Fourier. Esta denominación se conoce así en honor del físico francés Jean Baptiste Fourier (1768 – 1830). Cabe señalar que también se puede generar una representación del dominio de la frecuencia de una señal no periódica. Esta representación se define en términos de la Transformada de Fourier. En contraste con una señal periódica, los espectros de una señal no periódica consisten en una continuación de frecuencias. Se busca poner cualquier función x(t) como un sumatoria de senos y cosenos, esto es, como un sumatoria de puesto que cualquier función senoidal se puede poner 19 en forma de exponencial compleja. Para una señal periódica definimos el desarrollo en serie de Fourier como: A la vista de la exponencial compleja podemos observar que al variar los valores de k tenemos una función periódica con periodo: Los coeficientes del desarrollo en serie de Fourier son: Por lo tanto, la Serie de Fourier se define: 3.3 Transformada de Fourier Una característica clave de la teoría de las Series de Fourier de las señales periódicas es la definición de los espectros de amplitud y de fase de señales periódicas. Se sabe que el espectro de amplitud de salida es igual al producto del espectro de amplitud de la señal periódica de entrada por la función magnitud | H( ) | del sistema, donde y el espectro de la fase de la salida es igual a la suma del espectro de la fase de la señal periódica de entrada más la función de la fase L H( ) del sistema. La Transformada de Fourier se usa para representar una señal no periódica en tiempo 20 continuo como una superposición de señales senoidales complejas [6]. La Transformada de Fourier muestra una secuencia en la que se aumenta el periodo de una señal periódica. La Transformada rápida de Fourier es simplemente un algoritmo rápido para la evaluación numérica de integrales de Fourier y su importancia radica en la rapidez de cálculo conseguida, importante en otro tipo de aplicaciones: ecualización y filtrado en equipos de audio/vídeo en tiempo real, comunicaciones, etc. La diferencia de velocidad de cálculo entre la tradicional Transformada discreta y la FFT aumenta según aumenta el número de muestras a analizar. Sea x(t) una función continua por partes en el intervalo [-T,T] para todo T > 0 y tal que exista, la Transformada de Fourier se define como: La Transformada F ( ) describe la señal x(t) como una función de la frecuencia senoidal y se llama la representación de x(t), en el dominio de la frecuencia. Esta ecuación convierte la señal en el dominio del tiempo, en su representación en el dominio de la frecuencia. Amplitud (Potencia) Medición en el dominio del tiempo Medición en el dominio de la frecuencia Figura 3.9. Transformada de Fourier 21 Propiedades de la Transformada de Fourier Tabla 1. Propiedades de la Transformada de Fourier. Linealidad a(x) + b(y) aX(jω) + bY(jω) Translación en el tiempo x(t-t0) Translación en la frecuencia e jt xt Conjugación x*(t) X*(-j ω) Inversión en el tiempo x(-t) X(-j ω) Cambio de escala en tiempo y x(at) frecuencia Convolución x(t)*y(t) e jt0 X j x(j(ω-ω0)) 1 j X a a X(j ω)Y(j ω) 3.4 Correlación Una herramienta útil en análisis de señales y sistemas es la Correlación. La Correlación obtiene la información sobre las señales en base a promedios temporales y su transformada de Fourier permite obtener funciones de densidad espectral de energía o potencia, dependiendo de las características de las señales y sistemas bajo estudio. Las herramientas basadas en Correlación de señales y su Transformada de Fourier, son usadas en el análisis de procesos. La Correlación nos da una medida de la similitud entre dos señales. Es comparar las características de una señal conocida con las de una señal desconocida. 22 Autocorrelación. Es la correlación de una señal consigo misma. Representa la similitud entre una señal y ella misma desplazada. El máximo de una autocorrelación se obtiene cuando no hay desplazamiento (t = 0). La Autocorrelación se usa considerablemente en el análisis de señales. Es especialmente útil en la detección o reconocimiento de señales enmascaradas por ruido agregado. La Autocorrelación suele emplearse para encontrar periodos. La fórmula para realizar la autocorrelación de una señal x(t) es: La Correlación cruzada implica el cambiar de puesto de una señal y multiplicarse por otra señal. La Correlación cruzada expresa que tanta similitud tienen dos señales de tiempo diferentes a(t) y b(t) para diferentes desplazamientos de tiempo. 3.5 Convolución La Convolución nos ayuda a determinar la respuesta que un sistema ejerce en una señal de entrada. Cualquier señal puede expresarse como una superposición de impulsos unitarios de diferentes amplitudes. Un sistema invariante en el tiempo no cambia su comportamiento con el tiempo, entonces la respuesta al impulso h(t) a una serie de impulsos desplazados d (t - t) se puede expresar como h(t - t). Cuando esos impulsos desplazados los afectamos por la amplitud de una señal f (t) podemos expresar una salida en términos de este impulso desplazado y la respuesta al impulso del sistema f1(t) [h(t) d (t- t )]= f1(t)h(t- t) =y1(t). Luego, podemos expresar la salida y (t) en términos de su respuesta al impuso y de su entrada si integramos todos los puntos de la función, así quedaría definida la “Integral de la Convolución para sistemas invariantes en el tiempo”. 23 Interpretación gráfica de la convolución. La interpretación gráfica de la convolución permite visualizar los resultados de las más abstractas operaciones matemáticas. Supóngase que se quiere hallar la convolución de dos funciones dadas f 1 (t) y f2 (t). Las operaciones que se efectúan se basan en la integral de la convolución: Primero se enumeran, paso a paso, las operaciones necesarias: 1. Reemplazar t por en f 1 (t), quedando f ( ). 2. Reemplazar t por (- ) en f 2 (t). Esto hace girar a la función f 2 ( ) alrededor del eje vertical pasando por el origen del eje. 3. Trasladar todo el sistema de referencia de f (- ) en una cantidad t. Entonces, la traslación t es la diferencia entre el sistema de referencia móvil y el fijo. El origen del sistema móvil esta en = t; el origen fijo, en = 0. La función en el sistema móvil representa f 2 ( t - ); la función en el sistema fijo, f 1 ( ). 4. En cualquier desplazamiento relativo entre los ejes de referencia, por ejemplo, t 0 , debe hallarse el área bajo el producto de las dos funciones. 5. Este procedimiento debe repetirse para diferentes valores t = t 0 desplazando progresivamente el sistema móvil y hallando los valores de la integral de convolución en esos valores de t. Para funciones continuas esto puede hacerse por integración directa. Para funciones continuas por tanto, el producto será continuo por tramos y deberá integrarse sobre cada sección continua. 6. Si el desplazamiento del sistema móvil es a lo largo del eje negativo izquierda), t es negativo. Si es sobre el eje positivo (a la (a la derecha), t es positivo. 3.6 Modulación y Demodulación Modulación es el proceso de preparar la señal para envió por un medio de transmisión, 24 este proceso se puede llevar a cabo en banda base, es decir la banda de frecuencias original de la señal o por medio de una translación de frecuencia se puede hacer en lo que se llama modulación pasa banda, en este caso existe una translación de frecuencia de una banda de frecuencias baja a una banda de frecuencias alta. La figura 3.10 muestra la operación de modulación y su contraparte, la de- modulación en la figura 3.11. En la modulación se pasa la señal de una banda base (baja frecuencia) a una pasa banda (alta frecuencia). En la demodulación se pasa la señal de una pasa banda (alta frecuencia) a una banda base (baja frecuencia). Típicamente la modulación se lleva a cabo modificando alguna de las características de las señales; amplitud, frecuencia o fase. Debido a este proceso, la señal de alta frecuencia denominada portadora, sufrirá la modificación de alguno de sus parámetros, siendo dicha modificación proporcional a la amplitud de la señal de baja frecuencia denominada moduladora. A la señal resultante de este proceso se la denomina señal modulada y la misma es la señal que se transmite. Figura 3.10. Modulación de una señal La demodulación es el proceso inverso a la modulación. Figura 3.11. Demodulación de una señal 25 3.6.1 Modulación en amplitud Modulación en amplitud es el proceso de cambiar la amplitud de una portadora de frecuencia relativamente alta de acuerdo a la amplitud de la señal modulante (información). Con la modulación en amplitud la información se imprime sobre la portadora en forma de cambios de amplitud. La onda modulante modula a la onda portadora tanto en sus partes positivas como negativas, es decir, produce una señal con dos bandas laterales. La señal modulada tendrá una amplitud que será igual al valor pico de la señal portadora más el valor instantáneo de la señal modulada. La señal modulada en amplitud es: Tipos de modulación AM. Al modular en amplitud, el ancho de banda resultante es el doble del ancho de banda de la información original, debido a la generación de dos bandas laterales que desafortunadamente contienen la misma información cada una de ellas. Por lo tanto, se han desarrollado técnicas para reducir el ancho de banda necesario y de ahí han resultado varios tipos de modulación en amplitud, los cuales son los siguientes: Modulación en amplitud con doble banda lateral. (AM-DSB) Este es el tipo de modulación en la cual al hacer la multiplicación de las dos señales se generan las dos bandas laterales de igual tamaño. Modulación en amplitud con banda lateral suprimida. (AM-SSB) 26 Para evitar que se tenga que usar el doble de ancho de banda requerido se usa la modulación AM-SSB, en este tipo de modulación, por medio de un filtro se elimina una de las bandas laterales, después de la modulación y se usa una sola banda lateral, reduciendo por lo tanto el ancho de banda requerido. Modulación con banda lateral residual. (AM-VSSB) En este tipo de modulación se elimina solo parte de una de las bandas laterales, y se usa esa parte para modular información adicional. 3.6.2 Modulación en frecuencia La modulación en frecuencia se obtiene variando la frecuencia instantánea de la portadora en función de la información. En este caso la señal modulada mantendrá fija su amplitud y el parámetro de la señal portadora que variará es la frecuencia, y lo hace de acuerdo a cómo varíe la amplitud de la señal moduladora. La expresión matemática de la señal modulada es: Vp (t) = Vp sen[2π (f p + Δf sen(2 π fm t) ) t] Δf se denomina desviación de frecuencia y es el máximo cambio de frecuencia que puede experimentar la frecuencia de la señal portadora. A la variación total de frecuencia desde la más baja hasta la más alta, se le conoce como oscilación de portadora. 3.6.3 Modulación en fase En este tipo de modulación la amplitud de la portadora es constante y la característica que contiene la información es el ángulo de la fase instantánea de la señal portadora. La señal modulada es: V (t) = Vp cos[ 2π fp t + Β sen(2π fm t) ] 27 La diferencia que hay con la señal modulada en frecuencia es que en la modulación en fase, Β es independiente de la frecuencia. 3.7 Decibeles Es la décima parte del Bel, que es utilizado en sistemas de comunicación para medir la relación de dos magnitudes (eléctricas y acústicas). Es una unidad de medida adimensional y logarítmica. En sistemas de comunicación muy a menudo es necesario confrontar las relaciones entre las mediciones de varios niveles de señal y medir niveles exactos de señal a través de todo el sistema. Es deseable que los cálculos para determinar esas relaciones o cálculos exactos sean lo más simple posible para evitar la posibilidad de error. Para llevar a cabo esto se ha seleccionado un sistema de cálculo basado en el decibel (dB). El decibel es una cantidad que indica una relación en lugar de una cantidad en sí, por ejemplo, nos indica que una cantidad es 5 veces mayor que otra o que una cantidad es 10 veces mayor que otra. El dB es una relación entre dos cantidades que se miden con un mismo parámetro. Ej. Potencia o Voltaje. Cuando se consideran las condiciones normales en un sistema, se encuentra que una cantidad q1 es mayor que una cantidad q2 nos referimos a una ganancia de señal y cuando una cantidad q1 es menor a una cantidad q2 nos referimos a una pérdida de señal y como usamos valores logarítmicos (dB), un signo positivo indicará una ganancia y un signo negativo indicará una pérdida. El dB es usado en un sistema para representar solamente pérdida o ganancia. Dado que los niveles de señal en los sistemas de comunicación son muy pequeños y están representados por relaciones en lugar de cantidades fijas, se hace necesario encontrar una forma de representar estos valores. La representación en Decibeles es una manera sencilla y que abarca una amplia gama de valores en una cierta escala. Debido a esto se usan los valores en una escala logarítmica. Aunque esto parezca 28 complicado, es una manera sencilla de representar valores muy dispares y con una exactitud aceptable. Así un valor en Decibeles es una representación logarítmica de una relación de dos valores. Para expresar ganancia de potencia directamente se usa esta ecuación: Ganancia de potencia en dB =10 log10 En donde P1 es la potencia de la señal en la entrada del sistema, y P 2 la potencia a la salida del mismo. Para expresar ganancia de potencia en términos de voltaje y corriente se usan estas ecuaciones: Ganancia de voltaje en dB =20 log10 Ganancia de corriente en dB =20 log10 En donde V1 es el voltaje de la señal en la entrada del sistema, V2 el voltaje a la salida del mismo, I1 es la corriente de la señal en la entrada del sistema, y I2 la corriente a la salida del mismo. Otro estándar que se usa muy comúnmente es el de dBm. Esta señal de referencia para mediciones de señal representa una relación de una señal de un valor fijo de 1 miliWatt o 1 x 10-3 Watts y otra señal desconocida. dB =10 log10 29 CAPÍTULO 4. Modulación Digital La Modulación es la alteración sistemática de una onda portadora de acuerdo con el mensaje (señal modulada). En donde la señal de entrada es una señal digital binaria. 4.1 Muestreo Es el proceso de extraer una señal discreta de una señal en tiempo continuo. Sea x(t) una señal continua en el tiempo y sea el periodo de muestreo Ts > 0 un número fijo. A partir de x(t), la señal discreta: x(n)=x(nTs) Sí la señal es muestreada a una velocidad Fs (muestras/s) se obtiene que: Teoría de muestreo. Si m(t) es una señal que tiene una banda de frecuencias limitada, tal que la frecuencia máxima de esta señal es f M. Si hacemos que los valores de m (t) sean validos solo a intervalos regulares separados por los tiempos Ts ≤ 1/2 f M, es decir, la señal es periódicamente muestreada cada Ts segundos. Entonces, las muestras m (nTs), donde n es un entero, determinan completamente la señal y la señal puede ser reconstruida con esas muestras sin ninguna distorsión. El tiempo Ts es llamado el tiempo de muestreo. El teorema muestreo indica que la velocidad de muestreo debe ser lo suficientemente rápida, de manera que al menos dos muestras sean tomadas en el periodo correspondiente al componente espectral de máxima frecuencia encontrada en la señal (velocidad Nyquist). 4.2 Modulación por amplitud de pulsos (PAM) 30 Describe la conversión de señales analógicas en señales de pulsos donde la amplitud del impulso indica la información analógica. Esta señal PAM (pulse-amplitude modulation) se puede convertir en una señal digital PCM (Pulse-code modulation) de banda base, la que a su vez se modula sobre una portadora de sistemas de comunicación digital pasa banda. Por consiguiente, el proceso de conversión analógica a PAM es el primer paso en la conversión de una forma de onda analógica en una señal PCM digital. El teorema de muestreo, permite reproducir una forma de onda analógica con valores de muestreo de dicha forma de onda y funciones ortogonales (senx/x). El objetivo de la señalización PAM es proporcionar otra forma de onda con apariencia de pulsos, y que aun así contenga la información que estaba presente en la forma de onda analógica. Figura 3.12. Señal PAM Como se usan pulsos, se puede esperar que el ancho de banda de la forma de onda PAM sea más ancha que el de la forma de onda analógica. No obstante, los pulsos son más prácticos de utilizar en sistemas digitales. La velocidad de los pulsos f s, en el caso de PAM es la misma que la requerida por el teorema de muestreo, es decir, f s> 2B, donde B es la frecuencia más alta en la forma de onda analógica y 2B se llama tasa (relación) de Nyquist. Existen dos clases de señales PAM: PAM que utiliza muestreo natural (compuerta) y la PAM que utiliza muestreo instantáneo para producir un pulso de cresta plana. Las de cresta plana son más útiles para la conversión en PCM; sin embargo, las de muestreo son más fáciles de generar y usar en otras aplicaciones. 31 En la modulación de amplitud de pulsos, la amplitud de un tren de pulsos de ancho constante varía en proporción a los valores muestreados de la señal moduladora. Usualmente, los pulsos se toman a intervalos de tiempo equidistantes. 4.3 Tipos de Modulación Digital Modulación por amplitud (Amplitude Shift Keying ASK). Tipo de modulación en la cual una señal digital binaria, es representada con variaciones de amplitud, es decir un nivel v 1 (t) si la señal es cero y una señal v 2 (t) si la señal es uno. Modulación por frecuencia (Frequency Shift Keying FSK). Tipo de modulación en la cual una señal digital binaria, es representada con variaciones de frecue ncia, es decir una frecuencia f1 si la señal es cero y una frecuencia f2 si la señal es uno. Modulación por fase (Phase Shift Keying PSK). Tipo de modulación en la cual una señal digital binaria, es representada con variaciones de fase, es decir una fase θ 1 si la señal es cero y una fase θ 2 si la señal es uno. Modulación de amplitud en cuadratura (Quadrature Amplitude Modulation QAM). Se trata de un caso especial de PAM (Pulse Amplitude Modulation), es la superposición de dos portadoras en cuadratura moduladas en amplitud con la misma frecuencia pero desfasadas 900 . ASK FSK PSK QAM Figura 4.1. Tipos de Modulación Digital. 32 Diagrama de constelación Es un método de representar los estados de símbolo en un modem de paso de banda modulado de portadora en términos de su amplitud y fase. Típicamente, el eje horizontal se toma como referencia para los símbolos que están en fase con la portadora cos cuadratura, sen ct ), y el eje vertical representa la componente de frecuencia en ct). Se utiliza para representar diferentes tipos de señales digitales. La fase de la señal es representada por el ángulo alrededor del círculo y la amplitud por la distancia del origen al centro del círculo. 4.1 Modulación PSK PSK con múltiples valores (M-ary PSK) En BPSK se transmite cada bit individualmente, en QPSK se transmite un símbolo que representa 2 bits. Si continuamos con esta tendencia, se puede ampliar la cantidad de bits representados por un símbolo, es decir representar N bits con un símbolo, extendidos sobre el tiempo NTb y con 2N =M símbolos. Representando los símbolos con formas de onda de duración NT b = Ts y con diferencia de fase igual a 2π/M. PSK binaria (BPSK). En este tipo de modulación, la señal transmitida es una onda senoidal de amplitud fija A. Tiene una fase fija cuando la señal es un 1 y una fase 180° diferente cuando la señal es 0. PSK en cuadratura (QPSK). Esta forma de modulación genera una secuencia de símbolos, en lugar de una secuencia de bits, es decir, además de la fase se usan las señales de cuadratura sen(t) y cos(t), para la modulación. El cambio de fase y las señales de cuadratura nos dan la posibilidad de tener cuatro combinaciones de salida: la salida sen(t) con cambios de fase de ±180° y la salida cos(t) con cambios de fase de ±180°. Así como BPSK cambia la fase en 180°, QPSK lo hace en 90°. El desplazamiento de fase en cuadratura (QPSK) es una extensión del método de PSK simple. En QPSK la 33 señal puede tomar uno de los cuatro ángulos de fase posibles, mutuamente en cuadratura, cada uno corresponde a una condición de entrada de datos particular. Con el formato de datos NRZ (No Return to Zero), en el cual cada palabra es dividida en pares de bits en lugar de bits individuales, hay cuatro modos posibles de paridad binaria 1 y 0. Estos son: 00, 01, 10, 11. Cualquier palabra de información con un número par de bits puede ser representado por una combinación de estos pares de bits. Uno de los cuatro ángulos de fase es asignado a cada uno de estos pares de bits. La modulación QPSK utiliza cuatro señales senoidales, para codificar dígitos binarios. En el transmisor los dígitos binarios son tomados de a dos a la vez, instruyendo al modulador, cuál de las cuatro señales enviar (dependiendo de la forma de la constelación elegida). QPSK comparado con el BPSK ofrece el doble de bits de información por portadora de cambio de fase, encuentra amplia aplicación en sistemas de transmisión de datos de portadora- modulada de alta-velocidad. 8-PSK. Es casi idéntico a QPSK con la excepción que la fase de la forma de onda de la salida varía entre ocho posiciones. 16-PSK. Es una técnica de codificación M-ario, en donde M = 16; hay 16 diferentes fases de salida posibles. Un modulador de 16-PSK actúa en los datos que están entrando en grupos de 4 bits (24 = 16), llamados quadbits (bits en cuadratura). La fase de salida no cambia, hasta que 4 bits han sido introducidos al modulador. a) b) Figura 4.2. Diagramas de constelación de PSK. a) BPSK. b) QPSK 34 4.2 Modulación QAM En QAM, los tonos son representados como la sumatoria de dos señales que están en fase o fuera de fase con respecto a un reloj. Estas señales son llamadas I (en fase) y Q (por cuadratura). 4-QAM. La modulación 4-QAM contiene 4 valores binarios: 00, 01, 10, 11. Los cuales corresponden a una determinada fase, el cambio de fase entre uno y otro es de 90°. 8-QAM. Los datos se dividen en grupos de 3 bits: 000 hasta 111. Los flujos de bits I, Q y C cada uno con una tasa de bits igual a un tercio de la tasa de datos que están entrando. Los bits I y Q determinan la polaridad de la señal PAM y el canal C determina la magnitud. Así como con el 8-PSK, los datos que están entrando se dividen en grupos de tres bits (tribits): los flujos de bits I, Q y C, cada uno con una tasa de bits igual a un tercio de la tasa de datos que están entrando. 16-QAM. Así como el 16-PSK, el 16-QAM es un sistema M-ario, en donde M= 16. Actúa sobre los datos de entrada en grupos de cuatro (24 = 16). a) b) 35 c) d) Figura 4.3. Diagramas de constelación de QAM. a) 4QAM. b) 8-QAM. c) 16-QAM. d) 32-QAM. 36 CAPÍTULO 5. Codificación para control de errores. 5.1 Fundamentos y definiciones La codificación de canal o codificación para control de errores: consiste en 'mapear' (añadir redundancia) a la secuencia de datos entrante en una secuencia de entrada al canal y realizar el 'mapeo' inverso a la salida del canal en una secuencia de datos tal que los efectos del ruido estén minimizados. La introducción de redundancia en la codificación del canal tiene como finalidad mejorar la fiabilidad de la transmisión. Proporción de error en bits (BER): se define como la relación entre el número de bits erróneos recibidos respecto al número total de bits transmitidos. Proporción residual de error: se define como la relación entre el número de bits erróneos no detectados sobre el total de bits emitidos. Mide la capacidad de detectar errores. Peso de Hamming: está representado por W(c) donde c es una palabra de código, y se define como el número de bits de esa palabra diferentes de cero. Distancia de Hamming: es la distancia entre dos palabras de código de igual longitud y se define como el número de bits (posición a posición) en los que se diferencian las dos palabras. Tipos de códigos: Códigos sistemáticos: aquellos códigos en los que la palabra de información aparece de forma explícita en la palabra codificada. Códigos no sistemáticos: aquellos códigos en los que la palabra de información no aparece de forma explícita en la palabra codificada. Códigos de bloque: (tienen el mismo significado que en el caso de la codificación de la fuente) aquellos códigos en los que todas las palabras tienen la misma longitud y la 37 codificación se hace de forma estática. Códigos lineales: aquellos en los que cualquier combinación lineal de palabras de código válida (por ejemplo la suma módulo 2) produce otra palabra válida. Códigos cíclicos: aquellos en los que cualquier desplazamiento cíclico de una palabra de código da lugar a otra palabra de código. Códigos de paridad: su funcionamiento se basa en añadir un bit a la secuencia a enviar de forma que el número de "1's" sea par o impar, dependiendo del tipo de paridad: - si la paridad es par, el número final de "1's" debe ser par. - si la paridad es impar, el número final de "1's" debe ser impar. Códigos: Denominemos S={S , S , S ... S } al conjunto de símbolos de un alfabeto dado. Se define un código como la correspondencia de todas las secuencias posibles de símbolos de S a secuencias de símbolos de algún otro alfabeto X={x , x , x ,...x }. S recibe el nombre de alfabeto fuente y X el de alfabeto código. Como esto es demasiado general para resultar de utilidad, será necesario acotar más esta definición. Y la primera propiedad de un código es que sea un código de bloque. Un código bloque es aquel que asigna cada uno de los símbolos del alfabeto fuente S a una secuencia fija de símbolos del alfabeto código X. Esas secuencias fijas reciben el nombre de palabras código. Un código bloque se denomina no singular si todas sus palabras son distintas. Códigos unívocamente decodificables: la extensión de orden n de un código bloque es la que hace corresponder los símbolos S con las palabras de código X, es el código bloque que hace corresponder las secuencias de símbolos de la fue nte (S ,S ....S ) con las secuencias de las palabras de código ( X , X ...X ). Es decir, la extensión de orden n de un código bloque es también un código bloque. Además, un código bloque es unívocamente decodificable si, y solamente sí, su extensión de orden n es no singular 38 para cualquier n finito. Con un código unívocamente decodificable nos aseguramos que dos secuencias cualesquiera de símbolos de la fuente de igual longitud dan lugar a secuencias de símbolos código distintas. Un código unívocamente decodificable se denomina instantáneo cuando es posible decodificar las palabras de una secuencia sin precisar el conocimiento de los símbolos siguientes. Distancia mínima de un código: se establece como la distancia de Hamming más pequeña entre dos combinaciones cualesquiera del código. Códigos detectores de error: Los códigos detectores están basados en no aprovechar todas las combinaciones posibles de ceros y unos para formar palabras pertenecientes al código. Así, si se produce algún error en la transmisión, la palabra resultante podría no pertenecer al código y de esta forma sabríamos que se ha producido un error. Para detectar el error en un dígito binario es condición necesaria que el código posea una distancia mínima estrictamente mayor que uno. Y la condición necesaria y suficiente para detectar un error en k dígitos binarios, es que la distancia mínima sea de k+1. Estos códigos se forman a partir de uno de distancia mínima uno o superior, al cual se le añade el denominado dígito de paridad (normalmente como dígito binario más significativo). Este dígito deberá tomar el valor apropiado (0 o 1) para que el número de unos de la combinación resultante sea par o impar dependiendo de si queremos construir un código de paridad par o un código de paridad impar. Códigos correctores de error: La condición necesaria y suficiente para que un código sea corrector de error en k dígitos binarios, es que su distancia mínima sea de 2k+1. 5.2 Códigos de bloque 5.2.1 Códigos de bloque lineales sistemáticos 39 Un código de bloque lineal sistemático será capaz de detectar X-1 bits erróneos, donde X viene dado por la distancia de Hamming mínima entre 2 palabras cualesquiera del código, y será capaz de corregir ( X-1)/2 bits erróneos. Estos códigos cumplen la siguiente propiedad: La suma módulo-2 de dos palabras del código da lugar a otra palabra de código. En la especificación de estos códigos se utiliza la siguiente notación ( n,k ): n es el tamaño de la palabra codificada k es el tamaño del mensaje original. Estos k bits se envían sin alteración. Los n-k bits restantes son los bits de paridad. Es la redundancia mediante la cual se detectan y corrigen los errores. La forma de una palabra de código de un código de bloque lineal sistemático es la siguiente: m0 m1 . . . m k-1 b0 b1 b2 . . . bn-k-1 Donde m0 .......................m k-1 son los bits del mensaje original y b0 .......................bnk-1 son los bits de paridad que se añaden como redundancia. De esta forma, podemos expresar una palabra de código como: c0 c1 . . . cnk-1 cn-k . . . cn-1 El cálculo de los bits de paridad se realiza de la siguiente forma: bi = P0i m0 + P1i m1 + . . . + Pk-1i m k-1 Donde los Pij deben ser tales que la matriz generadora del código tenga filas independientes y las ecuaciones de paridad sean iguales. 40 Para realizar la codificación se utiliza una notación matricial. Consideraremos la palabra original, la palabra formada por los bits de paridad y la palabra de código como vectores: m = (m0 m1 . . . m k-1 ) b = (b0 b1 . . . bn-k-1 ) c = (c0 c1 . . . cn-1 ) También se utiliza la matriz de coeficientes: P= Para realizar la codificación se utiliza la matriz generadora: G = [ Ik,k | P ] Siendo Ik,k la matriz identidad de tamaño k * k. De esta forma podemos obtener cada palabra de código a partir de cada palabra de mensaje original realizando la siguiente multiplicación: c = m· G Para realizar la decodificación, en destino se recibe un vector (c) de tamaño n y lo que se puede hacer es repetir la operación realizada en la codificación: se toman los primeros k bits y se calcula la redundancia usando la matriz generadora y se comprueba si la redundancia obtenida es igual a la redundancia recibida. Otra opción más eficiente es la basada en el concepto de síndro me. En este proceso se utiliza la matriz de chequeo de paridad, que se define de la siguiente forma: H = [Pt | I] 41 H tiene la propiedad de que sólo las palabras de código verifican que al multiplicarlas por Ht el resultado es el vector nulo. Esta propiedad será utilizada para la detección y corrección de errores. A cada palabra que el receptor recibe a través del canal la denominaremos palabra recibida r. Una palabra recibida la podemos expresar como: r=c+e Donde c es la palabra de código enviada por el emisor y e es una palabra de error. Cada componente ei de la palabra de error vale 1 si hay un error en esa posición y 0 si no lo hay. El receptor para realizar la codificación utiliza la matriz H para calcular el vector de síndrome de error a partir de la palabra recibida. El vector de síndrome de error se obtiene de la siguiente forma: s = r · Ht El vector de síndrome tiene tantos elementos como bits de paridad se estén usando, y sólo depende de la secuencia de error y no de la palabra de código transmitida. Si en la transmisión no se ha producido un error, el síndrome es el vector nulo: s = r · Ht = 0 Si se ha producido un error la multiplicación de la palabra recibida por Ht nos da un vector que es igual a una de las filas de Ht . La posición que ocupa esa fila es la posición donde hay un error. Todas estas operaciones se hacen en módulo-2 (sin acarreo). 5.2.2 Código Hamming Un código de Hamming es un código de bloque lineal. Al igual que en los códigos de 42 bloque lineales sistemáticos, podemos denotar un código de Hamming mediante un par (n ,k). Sin embargo los valores de n y k deberán verificar una serie de condiciones: - n es la longitud de la palabra de código. - k es el número de bits de datos de la palabra original sin codificar. - el número de bits de paridad será m = n - k, pero deberá cumplirse la siguiente relación entre la longitud de la palabra de código y el número de bits de paridad: n = 2m - 1 con m >= 3 Según esto también se cumplirá la siguiente relación entre el número de bits de datos y el número de bits de paridad: k = 2m - m - 1 Por lo tanto, a cada palabra original se le añadirán unos bits de paridad para obtener la palabra de código, de forma que estos bits de paridad sirvan posteriormente para encontrar y corregir errores que se produzcan en la transmisión. Cada uno de los bits de paridad que añadimos a una palabra original va a afectar a unas determinadas posiciones de la nueva palabra de código, de forma que tomarán un valor adecuado para que se cumpla el criterio de paridad (par o impar) preestablecido en las sub-combinaciones afectadas por cada uno de estos bits de paridad. El siguiente paso consistirá en determinar a qué posiciones de los bits de las palabras de código afecta cada bit de paridad. Para ello, se construyen todas las combinaciones posibles con m bits de paridad y se interpreta cada una en binario natural. Cada bit de paridad va a afectar a aquellas posiciones en las que ese bit vale 1. Bit de paridad Posiciones b1 ................. 1,3,5,7,.......... 43 b2 ................. 2,3,6,7,.......... ... bm ................. 2m, 2m+1 ,2m+2 .... Por último se determina qué posiciones de cada palabra de código ocupará cada bit de paridad. Los bits de paridad se colocan en aquellas posiciones en las que no se vean afectados por otros bits de paridad. Estas posiciones serán: Bit de paridad Posición b1 ................... 20 b2 ................... 21 b3 ................... 22 ..... De esta forma queda completado el proceso de construcción de un código de Hamming. En el proceso de decodificación, el receptor recibe una palabra de un código de Hamming, y deberá comprobar si es correcta o no, y en el caso de que no fuera correcta deberá comprobar en que bit se produjo el error y corregir ese error. Para comprobar si la palabra recibida es correcta, el receptor debe utilizar los bits de paridad de la palabra y hacer con ellos un control de paridad. Para realizar el control de paridad, se crea una palabra que tendrá un bit por cada uno de los bits de paridad utilizados. Cada uno de los bits de esta palabra toma el valor 0 o 1 dependiendo de si el número de unos de las posiciones de la palabra de código afectadas por su correspondiente bit de paridad cumplen o no el criterio de paridad establecido. Interpretando la combinación resultante en binario natural se tendrán dos 44 posibilidades: - que sea un 0, lo cual quiere decir que no se han producido errores en la transmisión. - que se corresponda a un número distinto de 0, lo cual quiere decir que durante la transmisión ha variado el bit situado en la posición indicada por ese número. Una vez obtenida la palabra de código correcta, basta con quitar los bits de paridad para obtener la palabra original enviada por el emisor. 5.3 Códigos Cíclicos Los códigos cíclicos son una subclase de los códigos de bloque lineales. Son fáciles de codificar y cumplen la propiedad de linealidad y la de propiedad de que cualquier desplazamiento cíclico de una palabra del código también pertenece al código. Al igual que en los códigos de bloque lineales sistemáticos y en los códigos de Hamming, se denota un código cíclico mediante un par (n,k), donde n es la longitud de las palabras de código y k es la longitud de una palabra original. Para el manejo de estos códigos se utiliza una notación polinomial, de forma que una palabra de código C = (c0 ......,cn-1 ) se interpreta como un polinomio, y cada uno de los bits de la palabra de código será uno de los coeficientes de este polinomio: C(x) = c0 + c1x + . . . + cn-1xn-1 A su vez, una palabra original m = (m0 ,......, mk-1 ) se interpreta como el polinomio: m(x) = m0 + m1x + . . . + mk-1xk-1 Para generar C(x) a partir de m(x) se usa el polinomio generador g(x) que es un factor de ( x + 1)n . Su grado es n-k. La obtención de la palabra codificada se hace de la siguiente forma: C(x) = m(x) · g(x) 45 Así se tiene que un código cíclico queda perfectamente determinado por su polinomio generador. Para realizar el control de errores se utiliza el polinomio de chequeo de paridad, que es un polinomio de grado k tal que: g(x) · H(x) = (x + 1)n Los pasos para hacer una codificación CRC son: 1) Expresar el mensaje en forma de cadena binaria 2) Escoger un polinomio divisor (polinomio generador) 3) Agregar al mensaje tantos ceros, como bits tenga el polinomio generador 4) Efectuar la división del mensaje entre el polinomio generador 5) Agregar el residuo de la división (checksum), al mensaje original 6) Tras la recepción, se divide la cadena recibida entre el polinomio generador, si la transmisión fue correcta el residuo de la división deberá ser cero. De no ser nulo el residuo, significa que hubo errores durante la transmisión. 5.4 Códigos convolucionales Se diferencian de los códigos de bloque en su forma estructural y las propiedades para corregir errores. Los códigos de bloque suelen tener limitada la capacidad de corrección de errores alrededor de 1 o 2 símbolos erróneos por palabra de código. Estos códigos son buenos para utilizar en canales con baja probabilidad de error. Los códigos convolucionales son adecuados para usar sobre canales con mucho ruido (alta probabilidad de error). Estos códigos son lineales, donde la suma de dos palabras de código cualesquiera también es una palabra de código. Y al contrario que con los códigos lineales, se prefieren los códigos no sistemáticos. 46 El sistema tiene memoria: la codificación actual depende de los datos que se envían ahora y que se enviaron en el pasado. Un código convolucional queda especificado por tres parámetros (n,k,m) : n es el número de bits de la palabra codificada. k es el número de bits de la palabra de datos. m es la memoria del código o longitud restringida. El código convolucional es generado introduciendo un bit de datos y dando una revolución completa al conmutador. Inicialmente se supone que los registros intermedios contienen ceros. 47 CAPÍTULO 6. Resultados 6.1 Serie de Fourier Es un programa que grafica una señal elegida por el usuario y la Serie de Fourier de una dicha señal con n armónicas, que son también introducidas por el usuario. Figura 6.1a. Inicialización (Serie de Fourier). Este programa se implementó con una serie de comandos básicos de Matlab y operaciones para realizar la suma (de acuerdo a la fórmula) dentro de un ciclo for. El programa se implementa con un ciclo if para elegir la señal a calcular: si señal == 1 graficar parábola si señal == 2 graficar recta si señal == 3 graficar cuadrada si señal == 4 graficar triangular si señal == 5 graficar diente de sierra fin De acuerdo a la señal que se eligió, se hace el cá lculo de la suma de n armónicas mediante un ciclo for: 48 = valor calculado desde m=1 hasta n = valor calculado = valor calculado suma = suma+( (m)*cos(m*t))+( fin (m)*sen(m*t)) El valor de suma será el valor de la serie de Fourier. Este valor se grafica con respecto al tiempo. 6.1.1 Ele mentos del programa Figura 6.1b. Elementos del programa (Serie de Fourier). 1. n: armónicas de la Serie de Fourier. 2. Señal: es la señal a la cual se le grafica la Serie de Fourier. Las señales a elegir son: parábola, recta, cuadrada, triangular y diente de sierra. 3. Coeficientes de la Serie de Fourier: es donde se muestran los coeficientes de la Serie de Fourier calculados de acuerdo a la señal elegida. 4. Grafica de la Serie de Fourier: es donde se grafica la señal que representa la Serie de Fourier de acuerdo a n y la señal elegida. 6.1.2 Ejemplo Con la función y=t 2 , los valores de los coeficientes de Fourier son: 49 = = bn = = π2 /3 = (-1)n =0 Figura 6.1c. Ejemplo (Serie de Fourier). 6.2 Transformada de Fourier Es un programa que grafica una señal elegida por el usuario y su Transformada de Fourier. Figura 6.2a. Inicialización (Transformada de Fourier). El programa se implementa con ciclos if para elegir la señal a calcular: si señal == 1 graficar coseno si señal == 2 50 graficar diente de sierra si señal == 3 graficar sinc si señal == 4 graficar cuadrada si señal == 5 graficar exponencial si señal == 6 graficar impulso si señal == 7 graficar seno fin Después de elegir la señal a graficar, se calcula la Transformada de Fourier con la función fft: Transformada de Fourier= abs (fft (señal, puntos a graficar)) 6.2.1 Función fft (x, N) Es una función de Matlab que regresa la Transformada Discreta de Fourier (DFT) del vector x, realizada con el algoritmo de la transformada rápida de Fourier (FFT). “x” es un vector de números complejos ordenados desde k=0...N-1. La longitud del vector x debe ser una potencia de 2. “N” es el número de puntos con el que se hace la FFT. 6.2.2 Ele mentos del programa Figura 6.2b. Elementos del programa (Transformada de Fourier). 51 1. Señal. Es donde se elige la señal a graficar. 2. Grafica de señal. Es donde se grafica la señal elegida. 3. Transformada de Fourier. Es donde se grafica la Transformada de Fourier de la señal elegida. 6.2.3 Ejemplo Figura 6.2c. Ejemplo del programa (Transformada de Fourier). 6.3 Convolución y Correlación de señales Es un programa que grafica dos señales y la Convolución o Correlación de éstas. Figura 6.3a. Inicialización (Convolución y Correlación). 52 En el programa se desarrollaron varias opciones para elegir el tipo, la operación y las señales a las que se grafica la Convolución o Correlación. Con ciclos if se selecciona el tipo de señal a elegir y la operación a realizar: si señal == señal CT mostrar en menú desplegable señales continuas en el tiempo si no mostrar en menú desplegable señales discretas en el tiempo fin si operación == Convolución gráfica == conv (x(t), h(t)) si no gráfica == xcorr (x(t), h(t)) fin Las opciones de señales que muestran los menús desplegables son: x(t) para señales continuas: x=t 0 <t < 3 x=1 0<t<3 x=sen(t) -3 < t < 3 x=1 -1 < t < 1 h(t) para señales continuas: h=1 -1 < t < 1 h=1 0<t<3 h=-t 0<t<3 h=sen(t) -3 < t < 3 x(t) para señales continuas: 1. 2. 3. 4. 53 5. h(t) para señales discretas: 1. 2. 3. 4. 5. 6.3.1 Función conv (x,h) Hace la convolución de los vectores x y h. El vector resultante tiene un tamaño igual a la longitud de x + la longitud de h-1. 6.3.2 Función xcorr (x,h) Hace la correlación de los vectores de M elementos x y h. Devuelve un vector de 2M1 elementos. 6.3.3 Ele mentos del programa Figura 6.3b. Elementos del programa (Convolución y Correlación). 54 1. Tipo de señal. Es donde se elige el tipo de señal. Señal CT: señal continúa en el tiempo. Señal DT: señal discreta en el tiempo. 2. Operación. Es donde se elige el tipo de operación: Convolución o Correlación. 3. Señal x(t) o x(n). Es donde se elige la señal x(t) si la señal es continua, o x(n) si la señal es discreta. 4. Señal h(t) o h(n). Es donde se elige la señal h(t) si la señal es continua, o h(n) si la señal es discreta. 5. Graficar Convolución o Correlación. Es el botón que grafica la Convolución o Correlación según los parámetros especificados. 6. Gráfica de señal x. Es donde se grafica la señal x(t) o x(n). 7. Gráfica de señal h. Es donde se grafica la señal h(t) o h(n). 8. Gráfica de señal y(t). Es donde se grafica la señal resultante. 6.3.4 Ejemplo Figura 6.3c. Ejemplo (Convolución y Correlación). 55 6.4 Modulación AM, FM y PM Es un programa que grafica una señal análoga moduladora a elegir y su respectiva señal modulada en Amplitud (AM), en Frecuencia (FM) o en Fase (PM). Figura 6.4a. Inicialización (Modulación AM, FM y PM). El programa esta implementado con ciclos if para elegir la operación a realizar: si Modulación == AM modulada= amod(moduladora, frecuencia de la portadora,1000, 'am') si Modulación == FM modulada= amod(moduladora, frecuencia de la portadora,1000, 'fm') si Modulación == PM modulada= amod(moduladora, frecuencia de la portadora,1000, 'pm') 6.4.1 Función amod(x,fc,fs, 'method') Usa la señal x para modular una señal portadora con frecuencia Fc (Hz) usando la modulación especificada en “method”: am para modulación en amplitud, fm para modulación en frecuencia y pm para modulación en fase. La señal portadora y x tienen una frecuencia de muestreo Fs (Hz). 6.4.2 Ele mentos del programa 56 Figura 6.4b. Elementos del programa (Modulación AM, FM y PM). 1. Am. Amplitud de la señal moduladora. 2. fc. Frecuencia de la señal portadora. 3. fm. Frecuencia de la señal moduladora. 4. Modulación. Tipo de modulación a graficar: AM, FM o PM. 5. Moduladora. Tipo de señal a modular: Diente de sierra, Cuadrada, Seno o Coseno. 6. Gráfica de señal moduladora. Es donde se grafica la señal moduladora. 7. Gráfica de señal modulada. Es donde se grafica la señal modulada. 6.4.3 Ejemplo de modulación AM 57 Figura 6.4c. Ejemplo (Modulación AM). 6.4.4 Ejemplo de modulación FM Figura 6.4d. Ejemplo (Modulación FM). 6.4.5 Ejemplo de modulación PM Figura 6.4e. Ejemplo (Modulación PM). 58 6.5 Conve rsión dB a Watts y Watts a dB Es un programa que realiza la conversión de dB a Watts, de Watts a dB, de dBm a Watts y de Watts a dBm. Figura 6.5a. Inicialización (Decibeles y Watts). El código consiste en ciclos if que se emplean para elegir la operación a realizar: si Convertir == dB a Watts Watts= 10 ^ (dB/10) si Convertir == Watts a dB dB= 10log10 (potencia de salida / potencia de entrada) si Convertir == dBm a Watts Watts=10 ^ (dB/10) si Convertir == Watts a dBm dB=10*log10 (potencia de salida / .001) fin 6.5.1 Ele mentos del programa Figura 6.5b. Elementos del programa (Decibeles y Watts). 59 1. Menú de conversiones. Es donde se elige la operación a realizar. 2. Convertir. Es el botón que, al ser presionado, hace la conversión elegida. 3. Decibeles. Es donde se introducen los decibeles para hacer las conversiones: dB a Watts o dBm a Watts. 4. Potencia de entrada. Es donde se introducen los Watts de la potencia de entrada para la conversión de Watts a dB 5. Potencia de salida. Es donde se introducen los Watts de la potencia de salida para las conversiones: Watts a dB o Watts a dBm. 6.5.2 Ejemplo dB= 10log10 (potencia de salida / potencia de entrada) dB=10log10 (5/3) dB=2.218 Figura 6.5c. Ejemplo (Decibeles y Watts). 6.6 Muestreo de señales Es un programa que grafica una señal muestreada con frecuencia, muestras y frecuencia de muestreo como parámetros de entrada. 60 Figura 6.6a. Inicialización (Muestreo de señales). El código del programa consiste en ciclos if para cambiar de señal, de 5 a elegir en un menú: Si señal == seno señal =seno(2*pi*Frecuencia de la señal*(muestras / Frecuencia de muestreo)) Si señal == coseno señal =coseno(2*pi*Frecuencia de la señal*(muestras / Frecuencia de muestreo)) Si señal == cuadrada señal =cuadrada(2*pi*Frecuencia de la señal*(muestras / Frecuencia de muestreo)) Si señal == diente de sierra señal =diente de sierra(2*pi*Frecuencia de la señal*(muestras / Frecuencia de muestreo)) Si señal == rectangular señal =rectangular(2*pi*Frecuencia de la señal*(muestras / Frecuencia de muestreo)) 6.6.1 Ele mentos del programa Figura 6.6b. Elementos del programa (Muestreo de señales). 61 1. n. Es el número de muestras que se van a graficar. 2. Frecuencia. Es la Frecuencia a la que se quiere graficar la señal. 3. Menú de señales. Es donde se elige la señal a muestrear. 4. Frecuencia de Muestreo. Es donde se varía la Frecuencia de muestreo. 6.6.2 Ejemplo Figura 6.6c. Ejemplo (Muestreo de señales). 6.7 Muestreo de señal PAM Es un programa que grafica una señal PAM muestreada con una frecuencia de muestreo introducida por el usuario. Figura 6.7a. Inicialización (Muestreo señal PAM). 62 El código de este programa consiste en ciclos if para elegir la señal a muestrear: si señal == seno seno(2*pi*10t) si señal== coseno coso(2*pi*10t) si señal == diente de sierra diente de sierra(2*pi*10t) si señal == triangular triangular(2*pi*10t) si señal == sinc sinc(2*pi*10t) si señal == exponencial exponencial(2*pi*10t) fin Para graficar la señal muestreada se implemento un ciclo for: desde i =1 hasta t si (mod(i, frecuencia de muestreo) ==1) z =x (i) fin n(i)=z fin señal muestreada = t , n 6.7.1 Ele mentos del programa Figura 6.7b. Elementos del programa (Muestreo de señal PAM). 63 1. Frecuencia de muestreo. Es donde se introduce la Frecuencia de muestreo de la señal. 2. Menú de señales. Es donde se elige la señal a muestrear. 3. Gráfica de la señal muestreada. Es donde se grafica la señal original y la señal muestreada. 6.7.2 Ejemplo Figura 6.7c. Ejemplo (Muestreo de señal PAM). 6.8 Modulación PSK y QAM Es un programa que grafica una señal binaria aleatoria y su modulación PSK o QAM. Figura 6.8a. Inicialización (Modulación digital). 64 Este programa consiste en generar una señal binaria aleatoriamente. Para esto, y con el propósito de separar la señal con símbolos (M), se generó una señal decimal. Luego se usó un ciclo for para convertir la señal decimal a binaria: n= cantidad de símbolos a enviar k=log2 (M); señal = round(rand(1,n)*(M-1)) señal binaria=[] desde r=1 hasta length(señal) conversión=fliplr(dec2binvec(señal(r),k)) señal binaria=[señal binaria conversion] fin Luego se utilizó un ciclo if para hacer la modulación: Si tipo de modulación == psk [y,t]=dmod(senial,1,1,100,'psk',M) Si no [y,t]=dmod(senial,1,1,100,'qask',M) fin 6.8.1 Función dmod(x, Fc, Fd, Fs, 'method') Modula la señal x con Frecuencia de la señal portadora Fc (Hz) y Frecuencia de símbolos de la fuente Fd (Hz). La Frecuencia de muestreo es Fs (Hz), donde Fs > Fc y Fs/Fd es un número positivo entero. La modulación es según se especifique en “method”: ask para modulación en amplitud, psk para modulación en pase, fsk para modulación en frecuencia, qask para modulación en amplitud y fase. 6.8.2 Ele mentos del programa 65 Figura 6.8b. Elementos del programa (Modulación digital). 1. Tipo de modulación. Es donde se elige el tipo de modulación: psk o qam. 2. M. Es donde se elige los símbolos a modular: 2, 4, 8, 16, 32, 64. 3. No. de símbolos a enviar. Es donde se especifica el número de símbolos a enviar. 4. Señal. Es donde se muestra la señal que se va a modular. 5. Generar señal. Es el botón que al ser presionado genera y grafica una señal digital para ser modulada, esta señal se genera aleatoriamente cada vez que se presione este botón. 6. Modular. Es el botón que grafica la señal modulada. 7. Gráfica de señal digital. Es donde se grafica la señal digital generada. 8. Gráfica de señal modulada. Es donde se grafica la señal modulada. 6.8.3 Ejemplo de modulación PSK Figura 6.8c. Ejemplo (Modulación PSK). 66 6.8.4 Ejemplo de modulación QAM Figura 6.8d. Elementos del programa (Modulación QAM). 6.9 Codificación de Bloque Lineal Es un programa que realiza la Codificación de Bloque Lineal de una palabra introducida por el usuario. Además simula la detección de un error en la palabra fuente y muestra la posición de este error mediante la matriz H y el síndrome. Figura 6.9a. Inicialización (Codificación de bloque lineal). La primer parte del código de este programa consiste en ciclos if para definir los valores de los parámetros n, k y la matriz paridad P según la opción elegida en el menú (n, k): si menú == 1 n=4, k=2, P= [1 1; 1 0] si menú == 2 67 n=5, k=2, P= [0 1 1; 1 0 1] si menú == 3 n=6, k=3, P= [1 1 1; 0 1 1; 1 1 0] si menú == 4 n=7, k=4, P= [1 1 0; 0 1 1; 1 0 1; 1 1 1] si menú == 5 n=7, k=5, P= [1 0; 0 1; 1 1; 1 0; 1 1] si menú == 6 n=9, k=6, P= [0 1 0; 1 0 0; 0 1 1; 1 1 0; 0 0 1; 1 0 1] si menú == 7 n=11, k=7, P= [0 1 0 1; 1 1 0 1; 1 0 1 0; 1 0 1 1; 1 1 1 0; 0 1 1 1; 0 0 0 1] si menú == 8 n=11, k=8, P= [0 1 0; 1 1 0; 1 0 1; 1 0 0; 1 1 1; 0 1 0; 0 1 1; 1 0 0] Luego de establecer los parámetros, se define la matriz generadora y se codifica el mensaje: G = [eye (k) P] Palabra código = encode (m,n,k,'linear',G) Al final se usa un ciclo if para revisar si se quiere simular un error, el cual se crea aleatoriamente: H = [P' eye (n-k)] si error == 1 vector error = [randerr (1,k) zeros (1,n-k)] palabra recibida = bitxor (palabra código, vector error) sindrome = rem (r*H', 2) H transpuesta = H' Dentro del ciclo if se crea un ciclo for para encontrar la posición del error: desde j=1 hasta n fila = H transpuesta (j,:) si fila == síndrome contador = contador + 1 si contador == 1 posición de error=j; fin fin fin 68 6.9.1 Función encode (msg, n, k, 'method', genmat) Es una función de Matlab que codifica el mensaje “msg” usando el método de codificación especificado en “method”: linear, cyclic y hamming. La longitud de la palabra código es n y la longitud del mensaje es k. 6.9.2 Ele mentos del programa Figura 6.9b. Elementos del programa (Codificación de bloque lineal). 1. Palabra. Es donde se introduce la palabra a codificar. 2. Agregar un error. Es donde se elige si se quiere agregar un error aleatoriamente. 3. Codificar. Es el botón que al ser presionado codifica la palabra. 4. n, k. Es donde se eligen los valores de n y k de 8 opciones: 4,2; 5,2; 6,3; 7,4; 7,5; 9,6; 11,7; y 11,8. 5. Palabra código. Es donde se muestra la palabra codificada. 6. Síndrome, H’ y posición de error. Es donde se muestra el síndrome, la matriz transpuesta H y la posición de error si se seleccionó “Agregar un error”. 6.9.3 Ejemplo 69 Figura 6.9c. Ejemplo (Codificación de bloque lineal). 6.10 Codificación Hamming Es un programa que realiza la Codificación Hamming de una palabra introducida por el usuario. Este programa simula la detección de un error mediante los controles de paridad. Figura 6.10a. Inicialización (Codificación Hamming). El código de la primer parte consiste en sumar la cantidad de unos que tiene la palabra: suma de b8 = sum(b8) suma de b4 = sum(b4) suma de b2 = sum(b2) 70 suma de b4 = sum(b1) Luego se establecen los valores de los controles de paridad mediante un ciclo if y la función mod: si mod (suma de bx, 2) == 0 cx = 0 si no cx = 1 fin c=[b15 b14 b13 b12 b11 b10 b9 c4 b7 b6 b5 c3 b3 c2 c1] Para agregar un error al codificar se implemento un ciclo if de la siguiente manera: Si error == 1 vector de error = randerr (1, n) palabra recibida = bitxor (c, vector de error) A esta palabra recibida se le suman la cantidad de unos que tiene y se establecen los nuevos controles de paridad. Luego para saber la posición del error se convierten estos controles de paridad a decimales: controles de paridad = [ce4 ce3 ce2 ce1] posición de error = binvec2dec (fliplr (controles de paridad)) 6.10.1 Ele mentos del programa Figura 6.10b. Elementos del programa (Codificación Hamming). 71 1. Palabra. Es donde se introduce la palabra a codificar. 2. Agregar un error. Es donde se elige si se quiere agregar un error aleatoriamente. 3. Codificar. Es el botón que al ser presionado codifica la palabra. 4. m. Es donde se elige el valor de m: 3 o 4. 5. Dígitos binarios de control. Es donde se muestran los dígitos de control, según se haya elegido en el menú m. 6. Palabra código. Es donde se muestra la palabra codificada. 7. Posición de error y Controles de paridad. Es donde se muestra la posición de error y los controles de paridad si se seleccionó “Agregar un error”. 6.10.2 Ejemplo Figura 6.10c. Ejemplo (Codificación Hamming). 6.11 Codificación Cíclica Es un programa que realiza la Codificación Cíclica de una palabra introducida por el usuario. También simula la detección de un error mediante el síndrome. 72 Figura 6.11a. Inicialización (Codificación Cíclica). Primero se usó un ciclo if para definir los valores de los parámetros n y k según la opción elegida en el menú (n, k): si menú == 1 n= 4, k=3 si menú == 2 n= 7, k=4 si menú == 3 n= 18, k=6 si menú == 4 n= 24, k=8 Para crear el polinomio generador se utilizó la función cyclpoly y la codificación se hizo multiplicando este polinomio con el mensaje: Polinomio generador = cyclpoly (n, k, 'min') c = mod (conv (polinomio generador, mensaje), 2) Para generar un error aleatoriamente en la palabra recibida se implementó de la misma manera que en las anteriores codificaciones: si error == 1 vector de error = [randerr (1,k) zeros (1,n-k)] palabra recibida = bitxor (c, vector de error) posición de error = find (e) fin 6.11.1 Función cyclpoly (n, k, 'opt') 73 Es una función que regresa el vector fila que representa el polinomio generador de un código cíclico teniendo una palabra fuente de longitud k y para una palabra código de longitud n. La salida de esta función depende del argumento “opt”: min (polinomio generador con menor peso), max (polinomio generador con mayor peso) y all (todos los polinomios generadores). 6.11.2 Ele mentos del programa Figura 6.11b. Elementos del programa (Codificación Cíclica). 1. Menú n, k. Es donde se eligen los valores de n y k: 4, 3; 7, 4; 18, 6 y 24, 8. 2. Palabra. Es donde se introduce la palabra a codificar. 3. Agregar un error. Es donde se elige si se quiere agregar un error aleatoriamente. 4. Codificar. Es el botón que al ser presionado hace la codificación de la palabra. 5. Polinomio código. Es donde se muestra el polinomio código. 6. Polinomio generador. Es donde se muestra el polinomio generador de la palabra. 7. Síndrome. Es donde se muestra el síndrome. 6.11.3 Ejemplo 74 Figura 6.11c. Ejemplo (Codificación Cíclica). 6.12 Codificación Convolucional Es un programa que realiza la Codificación Convolucional de una palabra introducida por el usuario. Figura 6.12a. Inicialización (Codificación Convolucional). Este programa esta implementado con un ciclo for para ir recorriendo la posición en la palabra, y dentro de este ciclo se usó un ciclo if para hacer las operaciones según la memoria elegida m: desde i= longitud del mensaje hasta 1 s = [mensaje(i), y] y = s (1: m-1) si m == 2 o1=s(1) 75 o2=bitxor (s(1), s(2)) o3=[] si m==3 o1=bitxor (s(1), s(3)) o2=bitxor (s(1), s(2)) o3=[] si m==4 o1=bitxor (s(1), s(2)) o2=s (4) o3=bitxor (s(1), s(3)) fin c=[o1 o2 o3 c] fin 6.12.1 Elementos del programa Figura 6.12b. Elementos del programa (Codificación Convolucional). 1. m. Es donde se elige la memoria que va a tener la codificación: 2, 3 o 4. 2. Palabra. Es donde se introduce la palabra a codificar. 3. Codificar. Es el botón que ejecuta la codificación. 4. Dibujo del codificador. Es donde se muestra el dibujo del codificador. 5. Palabra código. Es donde se muestra la palabra codificada. 6.12.2 Eje mplo 76 Figura 6.12c. Ejemplo (Codificación Convolucional). 77 CAPÍTULO 7. Conclusiones Matlab es un programa muy poderoso, por lo cual en este proyecto se quiso aprovechar al máximo esta herramienta de programación para aplicaciones en los conceptos de las clases de comunicaciones. Realizar ejemplos de muchos de los temas de comunicaciones a veces se vuelve un proceso complejo y tedioso, además de que hay riesgo de que se cometan errores en los procedimientos o en las respuestas. Si se desarrollan estos ejemplos en Matlab, se puede estar seguro que la respuesta es correcta. Matlab que ayuda a desarrollar muchos problemas complejos de comunicaciones y ofrece una forma sencilla de visualizar conceptos que de otra forma sería muy difícil observar en la realidad. Otra de las ventajas que ofrece Matlab es el ahorro de tiempo y esfuerzo considerable. El propósito de crear los programas en una GUI fue el facilitar el proceso práctico de utilización, ya que a través de ésta, el usuario puede llevar a cabo distintas funciones sin necesidad de trabajar dentro de Matlab. Los programas están diseñados con el propósito de facilitar el análisis y entendimiento de muchos de los temas de comunicaciones. Los programas presentados además de demostrar una gran rapidez, resultan simples en su comprensión. La importancia de este proyecto se basa en facilitar los procesos para resolución de problemas de comunicaciones que requieren que se resuelvan a papel y lápiz, pero con solo entender lo que se necesita realizar, podemos lograr estos cálculos utilizando de manera esencial la herramienta Matlab. Matlab es una excelente opción para el análisis y simulación de sistemas de comunicaciones por la facilidad con la que se pueden visualizar los resultados, por la sencillez de las instrucciones y por su variedad en las aplicaciones. 78 Referencias [1] Amos Gilat. Matlab una introducción con ejemplos prácticos. Reverté. Barcelona. 2005. [2] Haykin, Simon. Señales y Sistemas. Limusa Wiley. México, D.F. 2004. Pag. 21. [3] http://carreras.frba.utn.edu.ar/matematica/matapp/cursos/Primer_Curso_Final_2004.p df, 26 de Septiembre. [4] http://amasd.upb.edu.co/es/pregrado/programacion/Matlab6_GUI.pdf, Septiembre. 27 de [6] www.astormastering.com.ar/Clase_1_Introducción_al_analisis_espectral.pdf, 3 de Octubre. [7] Lathi B. P. Sistemas de Comunicación. McGrawHill. Edo de México. 1986. Haykin Simon. Communication systems. Limusa Wiley. México, D.F. 2001. Wayne Tomasi. Sistemas de Comunicaciones Electrónicas. Prentice-Hall. México. 2003. Proakis J. K. Digital communications. Mcgraw-Hill. New York. 2001. http://www.mathworks.com, 10 de Agosto. 79 APÉNDICE A. Archivo .m: Serie de Fourier function varargout = Serie_Fourier(varargin) % SERIE_FOURIER Grafica la serie de fourier de distintas señales con % distinto número de armónicas. % x = señal % t = tiempo % n = número de armónicas % a, b, serie = coeficientes de la Serie de Fourier % % % Código de inicialización gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @Serie_Fourier_OpeningFcn, ... 'gui_OutputFcn', @Serie_Fourier_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end function Serie_Fourier_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; [x,map]=imread('none.jpg','jpg'); axes(handles.axes2) image(x),colormap(map),axis off guidata(hObject, handles); function varargout = Serie_Fourier_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; % --- Cálculo y graficación de la Serie de Fourier function popupmenu1_Callback(hObject, eventdata, handles) grafica=get(hObject,'Value'); t=-pi:pi/1000:pi; n=str2num(get(handles.n,'String')); a=zeros(1,n); b=zeros(1,n); if grafica==1 [x,map]=imread('none.jpg','jpg'); axes(handles.axes2) image(x),colormap(map),axis off 80 t=0; x=0; serie=0; elseif grafica==2 serie=(pi^2)/3; for m=1:n a(m)=(4/(m^2))*((-1)^m); b(m)=0; serie=serie+(a(m)*cos(m*t))+(b(m)*sin(m*t)); end [x,map]=imread('parabola.jpg','jpg'); axes(handles.axes2) image(x),colormap(map),axis off x=t.^2; elseif grafica==3 serie=0; for m=1:n a(m)=0; b(m)=(2/m)*(-1)^(m+1); serie=serie+(a(m)*cos(m*t))+(b(m)*sin(m*t)); end [x,map]=imread('recta.jpg','jpg'); axes(handles.axes2) image(x),colormap(map),axis off x=t; elseif grafica==4 serie=0; for m=1:n a(m)=0; b(m)=-2/(m*pi); serie=serie+(a(m)*cos(m*t))+(b(m)*sin(m*t)); end [x,map]=imread('diente.jpg','jpg'); axes(handles.axes2) image(x),colormap(map),axis off x=sawtooth(t); elseif grafica==5 serie=0; for m=1:n a(m)=0; b(m)=(2/(m*pi))*(1-(-1)^m); serie=serie+(a(m)*cos(m*t))+(b(m)*sin(m*t)); end [x,map]=imread('cuadrada.jpg','jpg'); axes(handles.axes2) image(x),colormap(map),axis off x=square(t); elseif grafica==6 serie=0; for m=1:n a(m)=(4/((m^2)*(pi^2)))*((-1)^m-1); b(m)=0; serie=serie+(a(m)*cos(m*t))+(b(m)*sin(m*t)); end 81 [x,map]=imread('triangular.jpg','jpg'); axes(handles.axes2) image(x),colormap(map),axis off x=sawtooth(t,.5); end axes(handles.axes1) plot(t,x,'b','LineWidth',2); hold on plot(t,serie,'r','LineWidth',2); xlabel('t', 'Fontsize', 12) ylabel('f(t)', 'Fontsize', 12) title('Serie de Fourier con n armonicas','Fontsize', 12) grid on hold off guidata(hObject,handles) % ------------------------------------------------------------------function popupmenu1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------function n_Callback(hObject, eventdata, handles) %-------------------------------------------------------------------function n_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------function n_KeyPressFcn(hObject, eventdata, handles) set(handles.popupmenu1,'Value',1); NOTA: Todos los archivos .m de los programas que se realizaron cuentan con el mismo código de inicialización y funciones CreateFcn que el mostrado en el programa Serie de Fourier; por lo tanto, en los casos donde no se muestren estas funciones será debido a que son similares a este programa y sólo se mostrará la parte más importante del código de cada uno de los programas. 82 APÉNDICE B. Archivo .m: Transformada de Fourier function popupmenu1_Callback(hObject, eventdata, handles) grafica=get(hObject,'Value'); p=256; t=0:59; f=(0:p-1)/p; if grafica==1 x=0; elseif grafica==2 x=cos(2*pi*t/10); elseif grafica==3 x=sawtooth(2*pi*t/10); elseif grafica==4 x=sinc(2*pi*t/10); elseif grafica==5 x=square(2*pi*t/10); elseif grafica==6 x=(t<0).*0+(t>=0).*exp(2*pi*t/10); elseif grafica==7 x=(t<-1).*0+(t>1).*0+(t>=-1).*1+(t<=1).*1; elseif grafica==8 x=sin(2*pi*t/10); end tf=abs(fft(x,p)); axes(handles.axes1) plot(t,x) title('Señal original') xlabel('t') ylabel('x(t)') grid on axes(handles.axes2) plot(f,tf) title('Transformada de Fourier') xlabel('w'); ylabel('|F(w)|') grid on guidata(hObject, handles); 83 APÉNDICE C. Archivo .m: Convolución y Correlación de señales function popupmenu1_Callback(hObject, eventdata, handles) grafica=get(hObject,'Value'); t=handles.t; % graficas if grafica==1 handles.x=(t<0&t>3).*0+(t>=0&t<=3).*t; elseif grafica==2 handles.x=ustep(t); elseif grafica==3 handles.x=(t<-1&t>1).*0+(t>=-1&t<=1).*1; elseif grafica==4 handles.x=sin(t); end % graficar x(t) axes(handles.axes1) plot(t,handles.x,'LineWidth',2) xlabel('t') ylabel('x(t)') grid on guidata(hObject,handles) function popupmenu2_Callback(hObject, eventdata, handles) grafica2=get(hObject,'Value'); t=handles.t; % graficas if grafica2==1 handles.h=(t<-1&t>1).*0+(t>=-1&t<=1).*1; elseif grafica2==2 handles.h=ustep(t); elseif grafica2==3 handles.h=(t<0&t>3).*0+(t>=0&t<=3).*-t; elseif grafica2==4 handles.h=sin(t); end % graficar h(t) axes(handles.axes2) plot(t,handles.h,'LineWidth',2) xlabel('t') ylabel('h(t)') grid on guidata(hObject,handles) function popupmenu3_Callback(hObject, eventdata, handles) grafica3=get(hObject,'Value'); %graficas if grafica3==1 handles.x=[1 1 1 1 1]; handles.tiempox=0:1:4; elseif grafica3==2 handles.x=[2 1 1 1]; handles.tiempox=0:1:3; elseif grafica3==3 84 handles.x=[1 2]; handles.tiempox=0:1:1; elseif grafica3==4 handles.x=[1 1 1]; handles.tiempox=-1:1:1; elseif grafica3==5 handles.x=2; handles.tiempox=0; end % graficar x(t) axes(handles.axes1) stem(handles.tiempox,handles.x,'LineWidth',2) xlabel('n') ylabel('x(n)') grid on guidata(hObject,handles) function popupmenu4_Callback(hObject, eventdata, handles) grafica4=get(hObject,'Value'); % graficas if grafica4==1 handles.h=[2 1 1 1]; handles.tiempoh=0:1:3; elseif grafica4==2 handles.h=[1 1 1 1 1]; handles.tiempoh=0:1:4; elseif grafica4==3 handles.h=[1 2 3]; handles.tiempoh=1:1:3; elseif grafica4==4 handles.h=[1 1 1]; handles.tiempoh=-1:1:1; elseif grafica4==5 handles.h=2; handles.tiempoh=0; end % graficar h(t) axes(handles.axes2) stem(handles.tiempoh,handles.h,'LineWidth',2) xlabel('n') ylabel('h(n)') grid on guidata(hObject,handles) function graficar_Callback(hObject, eventdata, handles) x=handles.x; h=handles.h; op=get(handles.convolucion,'Value'); tipo_s=get(handles.ct,'Value'); if op==1 y = conv(x,h); else y = xcorr(x,h); end 85 if tipo_s==1 lx=length(x)-1; lh=length(h)-1; n=-lh:lx; axes(handles.axes3) plot(n./1000,y./1000,'LineWidth',2) % graficar señal CT xlabel('t') ylabel('y(t)') else axes(handles.axes3) stem(y,'LineWidth',2) % graficar señal DT xlabel('n') ylabel('y(n)') end grid on guidata(hObject,handles) 86 APÉNDICE D. Archivo .m: Modulación AM, FM y PM function popupmenu1_Callback(hObject, eventdata, handles) grafica1=get(hObject,'Value'); t=handles.t; Am=str2double(get(handles.edit_Am,'String')); fm=str2double(get(handles.edit_fm,'String')); fc=str2double(get(handles.edit_fc,'String')); if grafica1==2 moduladora=Am*sawtooth(2*pi*fm*t); elseif grafica1==3 moduladora=Am*square(2*pi*fm*t); elseif grafica1==4 moduladora=Am*sin(2*pi*fm*t); elseif grafica1==5 moduladora=Am*cos(2*pi*fm*t); else moduladora=0; end tipo_mod=get(handles.popupmenu3,'Value'); if tipo_mod==1 axes(handles.axes1) plot(t,moduladora,'Color','r','LineWidth',2) title('Señal moduladora'); ylabel('A'); xlabel('Tiempo'); grid on; axes(handles.axes2) senial = amod(moduladora,fc,1000,'am'); plot(t,senial) hold on; plot(t,(moduladora)+Am,'--','Color','r'); hold off; title('Señal AM '); ylabel('Amplitud'); xlabel('Tiempo'); grid on elseif tipo_mod==2 axes(handles.axes1) plot(t,moduladora,'Color','r','LineWidth',2) title('Señal moduladora'); ylabel('A'); xlabel('Tiempo'); grid on; axes(handles.axes2) senial = amod(moduladora,fc,1000,'fm'); plot(t,senial) hold on; plot(t,moduladora,'--','Color','r'); hold off; title('Señal FM '); ylabel('Frecuencia'); xlabel('Tiempo'); grid on 87 elseif tipo_mod==3 axes(handles.axes1) plot(t,moduladora,'Color','r','LineWidth',2) title('Señal moduladora'); ylabel('A'); xlabel('Tiempo'); grid on; axes(handles.axes2) senial = amod(moduladora,fc,1000,'pm'); plot(t,senial) hold on; plot(t,moduladora,'--','Color','r'); hold off; title('Señal PM '); ylabel('Fase'); xlabel('Tiempo'); grid on end guidata(hObject, handles); 88 APÉNDICE E. Archivo .m: Conversión dB a Watts y Watts a dB function convertir_Callback(hObject, eventdata, handles) w_db=get(handles.w_db,'Value'); db_w=get(handles.db_w,'Value'); w_dbm=get(handles.w_dbm,'Value'); dbm_w=get(handles.dbm_w,'Value'); if db_w==1 db=str2double(get(handles.db,'String')); ans_w=10^(db/10); set(handles.resultado2,'String',ans_w); elseif w_db==1 p1=str2double(get(handles.p1,'String')); p2=str2double(get(handles.p2,'String')); ans_db=10*log10(p2/p1); set(handles.resultado1,'String',ans_db); elseif dbm_w==1 db=str2double(get(handles.db,'String')); ans_w=10^(db/10); set(handles.resultado2,'String',ans_w); elseif w_dbm==1 p1=.001; p2=str2double(get(handles.p2,'String')); ans_db=10*log10(p2/p1); set(handles.resultado1,'String',ans_db); end guidata(hObject, handles); 89 APÉNDICE F. Archivo .m: Muestreo de señal function slider1_Callback(hObject, eventdata, handles) F_muestreo=round(100*get(hObject,'Value')); set(handles.text_fm,'string',num2str(F_muestreo)); muestras=str2double(get(handles.edit_n,'string')); F=str2double(get(handles.edit_f,'string')); n=0:muestras-1; if (get(handles.radiobutton1,'Value')==1) x=sin(2*pi*F*(n./F_muestreo)); elseif(get(handles.radiobutton2,'Value')==1) x=cos(2*pi*F*(n./F_muestreo)); elseif(get(handles.radiobutton3,'Value')==1) x=square(2*pi*F*(n./F_muestreo)); elseif(get(handles.radiobutton4,'Value')==1) x=sawtooth(2*pi*F*(n./F_muestreo)); elseif(get(handles.radiobutton5,'Value')==1) x=sawtooth((2*pi*F*(n./F_muestreo)),.5); end axes(handles.axes1) stem(n,x,'Linewidth',1.5) title('Señal muestreada ') xlabel('n') ylabel('x(n)') grid on guidata(hObject, handles); 90 APÉNDICE G. Archivo .m: Muestreo de señal PAM function uipanel1_SelectionChangeFcn(hObject, eventdata, handles) Ts = 1/10000; t=0:Ts:.2; if hObject==handles.b1 x= sin(2*pi*10*t); elseif hObject==handles.b2 x= cos(2*pi*10*t); elseif hObject==handles.b3 x= sawtooth(2*pi*10*t); elseif hObject==handles.b4 x= sawtooth(2*pi*10*t,.5); elseif hObject==handles.b5 x= sinc(2*pi*10*t); elseif hObject==handles.b6 x= exp(2*pi*10*t); end f=str2double(get(handles.frec,'String')); n = zeros(1,length(t)); for i =1:length(t) if(mod(i,f)==1) % ciclo para que x cambie cada f veces z =x(i); end n(i)=z; end plot(t,x,'--') hold on plot(t,n,'black','Linewidth',1.5); xlabel('t'); ylabel('y(n)'); hold off guidata(hObject, handles); 91 APÉNDICE H. Archivo .m: Modulación PSK y QAM function Mn_Callback(hObject, eventdata, handles) axes(handles.axes2) cla reset set(handles.text_senial,'String',''); set(handles.modular,'Enable','off'); m1=get(hObject,'Value'); if m1==2 handles.M=2; elseif m1==3 handles.M=4; elseif m1==4 handles.M=8; elseif m1==5 handles.M=16; elseif m1==6 handles.M=32; elseif m1==7 handles.M=64; end guidata(hObject, handles); function generar_Callback(hObject, eventdata, handles) set(handles.modular,'Enable','on'); n=str2double(get(handles.n,'String')); u=[]; M=handles.M; k=log2(M); handles.senial = round(rand(1,n)*(M-1)); binaria=[]; for r=1:length(handles.senial) conver=fliplr(dec2binvec(handles.senial(r),k)); binaria=[binaria conver]; end binaria2=reshape(dec2bin(handles.senial,k).',1,k*n); set(handles.text_senial,'String',binaria2); for i=1:(k*n) if binaria(i)==1 u=[u ones(1,100)]; elseif binaria(i)==0 u=[u zeros(1,100)]; end end axes(handles.axes2) cla reset axes(handles.axes1) plot(u,'Linewidth',1.5) guidata(hObject, handles); function modular_Callback(hObject, eventdata, handles) tipo=get(handles.tipo_mod,'Value'); senial=handles.senial; M=handles.M; 92 if tipo==1 [y,t]=dmod(senial,1,1,100,'psk',M); else [y,t]=dmod(senial,1,1,100,'qask',M); end axes(handles.axes2) plot(t,y,'Linewidth',1.5); guidata(hObject, handles); 93 APÉNDICE I. Archivo .m: Codificación de Bloque Lineal function codificar_Callback(hObject, eventdata, handles) error=get(handles.check_error,'Value'); ka=get(handles.popupmenu_k,'Value'); count=0; if ka==1 k=2; n=4; P=[1 1; 1 0]; m_0= str2double(get(handles.edit1,'String')); m_1= str2double(get(handles.edit2,'String')); m=[m_0 m_1]; if ((m_0~=0) && (m_0~=1)) || ((m_1~=0) && (m_1~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); end elseif ka==2 k=2; n=5; P=[0 1 1; 1 0 1]; m_0= str2double(get(handles.edit1,'String')); m_1= str2double(get(handles.edit2,'String')); m=[m_0 m_1]; if ((m_0~=0) && (m_0~=1)) || ((m_1~=0) && (m_1~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); end elseif ka==3 k=3; n=6; P=[1 1 1; 0 1 1; 1 1 0]; m_0= str2double(get(handles.edit1,'String')); m_1= str2double(get(handles.edit2,'String')); m_2= str2double(get(handles.edit3,'String')); m=[m_0 m_1 m_2]; if ((m_0~=0) && (m_0~=1)) || ((m_1~=0) && (m_1~=1)) || ... ((m_2~=0) && (m_2~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); end elseif ka==4 k=4; n=7; P=[1 1 0; 0 1 1; 1 0 1; 1 1 1]; m_0= str2double(get(handles.edit1,'String')); m_1= str2double(get(handles.edit2,'String')); m_2= str2double(get(handles.edit3,'String')); m_3= str2double(get(handles.edit4,'String')); m=[m_0 m_1 m_2 m_3]; if ((m_0~=0) && (m_0~=1)) || ((m_1~=0) && (m_1~=1)) || ... ((m_2~=0) && (m_2~=1)) || ((m_3~=0) && (m_3~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); end elseif ka==5 k=5; 94 n=7; P=[1 0; 0 1; 1 1; 1 0; 1 1]; m_0= str2double(get(handles.edit1,'String')); m_1= str2double(get(handles.edit2,'String')); m_2= str2double(get(handles.edit3,'String')); m_3= str2double(get(handles.edit4,'String')); m_4= str2double(get(handles.edit5,'String')); m=[m_0 m_1 m_2 m_3 m_4]; if ((m_0~=0) && (m_0~=1)) || ((m_1~=0) && (m_1~=1)) ||... ((m_2~=0) && (m_2~=1)) || ((m_3~=0) && (m_3~=1)) || ((m_4~=0).. && (m_4~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); end elseif ka==6 k=6; n=9; P=[0 1 0; 1 0 0; 0 1 1; 1 1 0; 0 0 1; 1 0 1]; m_0= str2double(get(handles.edit1,'String')); m_1= str2double(get(handles.edit2,'String')); m_2= str2double(get(handles.edit3,'String')); m_3= str2double(get(handles.edit4,'String')); m_4= str2double(get(handles.edit5,'String')); m_5= str2double(get(handles.edit6,'String')); m=[m_0 m_1 m_2 m_3 m_4 m_5]; if ((m_0~=0) && (m_0~=1)) || ((m_1~=0) && (m_1~=1)) || ... ((m_2~=0) && (m_2~=1)) || ((m_3~=0) && (m_3~=1)) || ((m_4~=0)... && (m_4~=1)) || ((m_5~=0) && (m_5~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); end elseif ka==7 k=7; n=11; P=[0 1 0 1; 1 1 0 1; 1 0 1 0; 1 0 1 1; 1 1 1 0; 0 1 1 1; 0 0 0 1]; m_0= str2double(get(handles.edit1,'String')); m_1= str2double(get(handles.edit2,'String')); m_2= str2double(get(handles.edit3,'String')); m_3= str2double(get(handles.edit4,'String')); m_4= str2double(get(handles.edit5,'String')); m_5= str2double(get(handles.edit6,'String')); m_6= str2double(get(handles.edit7,'String')); m=[m_0 m_1 m_2 m_3 m_4 m_5 m_6]; if ((m_0~=0) && (m_0~=1)) || ((m_1~=0) && (m_1~=1)) || ... ((m_2~=0) && (m_2~=1)) || ((m_3~=0) && (m_3~=1)) || ((m_4~=0).. && (m_4~=1)) || ((m_5~=0) && (m_5~=1)) || ((m_6~=0) && (m_6~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); end elseif ka==8 k=8; n=11; P=[0 1 0; 1 1 0; 1 0 1; 1 0 0; 1 1 1; 0 1 0; 0 1 1; 1 0 0]; m_0= str2double(get(handles.edit1,'String')); m_1= str2double(get(handles.edit2,'String')); m_2= str2double(get(handles.edit3,'String')); 95 m_3= str2double(get(handles.edit4,'String')); m_4= str2double(get(handles.edit5,'String')); m_5= str2double(get(handles.edit6,'String')); m_6= str2double(get(handles.edit7,'String')); m_7= str2double(get(handles.edit8,'String')); m=[m_0 m_1 m_2 m_3 m_4 m_5 m_6 m_7]; if ((m_0~=0) && (m_0~=1)) || ((m_1~=0) && (m_1~=1)) || ... ((m_2~=0) && (m_2~=1)) || ((m_3~=0) && (m_3~=1)) || ((m_4~=0)... && (m_4~=1)) || ((m_5~=0) && (m_5~=1)) || ((m_6~=0) && ... (m_6~=1)) || ((m_7~=0) && (m_7~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); end end G = [eye(k) P]; c = encode(m,n,k,'linear',G); H=[P' eye(n-k)]; if error==1 e=[randerr(1,k) zeros(1,n-k)]; r=bitxor(c,e); s=rem(r*H',2); Htran=H'; for j=1:1:n fila=Htran(j,:); if fila==s count=count+1; if count==1 pos_error=j; end end end set(handles.text_pos,'String',num2str(pos_error)); set(handles.text7,'Visible','on'); set(handles.text9,'Visible','on'); set(handles.text_H,'String',num2str(H')); else r=c; s=rem(r*H',2); end set(handles.text10,'Visible','on'); set(handles.text_sin,'String',num2str(s)); set(handles.text_c,'String',num2str(r)); guidata(hObject, handles); 96 APÉNDICE J. Archivo .m: Codificación Hamming function codificar_Callback(hObject, eventdata, handles) menu_m=get(handles.popupmenu1,'Value'); error=get(handles.check_error,'Value'); if menu_m==1 m=3; m1=str2num(get(handles.edit1,'String')); m2=str2num(get(handles.edit2,'String')); m3=str2num(get(handles.edit3,'String')); m4=str2num(get(handles.edit4,'String')); elseif menu_m==2 m=4; m1=str2num(get(handles.edit1,'String')); m2=str2num(get(handles.edit2,'String')); m3=str2num(get(handles.edit3,'String')); m4=str2num(get(handles.edit4,'String')); m5=str2num(get(handles.edit5,'String')); m6=str2num(get(handles.edit6,'String')); m7=str2num(get(handles.edit7,'String')); m8=str2num(get(handles.edit8,'String')); m9=str2num(get(handles.edit9,'String')); m10=str2num(get(handles.edit10,'String')); m11=str2num(get(handles.edit11,'String')); end n=2^m-1; %operaciones codigo hamming if menu_m==1 if ((m1~=0) && (m1~=1)) || ((m2~=0) && (m2~=1)) || ((m3~=0) && (m3~=1)) || ((m4~=0) && (m4~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); else b7=m1; b6=m2; b5=m3; b3=m4; b4=[b7 b6 b5]; b2=[b7 b6 b3]; b1=[b7 b5 b3]; unosb4=sum(b4); unosb2=sum(b2); unosb1=sum(b1); if mod(unosb4,2)==0 c3=0; else c3=1; end if mod(unosb2,2)==0 c2=0; else c2=1; end if mod(unosb1,2)==0 c1=0; 97 else c1=1; end c=[b7 b6 b5 c3 b3 c2 c1]; if error==1 e=randerr(1,n); r=bitxor(c,e); unos_ce1=sum([r(1,7) r(1,5) r(1,3) r(1,1)]); unos_ce2=sum([r(1,7) r(1,6) r(1,3) r(1,2)]); unos_ce3=sum([r(1,7) r(1,6) r(1,5) r(1,4)]); if mod(unos_ce1,2)==0 ce1=0; else ce1=1; end if mod(unos_ce2,2)==0 ce2=0; else ce2=1; end if mod(unos_ce3,2)==0 ce3=0; else ce3=1; end con_par=[ce3 ce2 ce1]; pos=binvec2dec(fliplr(con_par)); cs1=[r(1,7) r(1,6) r(1,5)]; ccs3=r(1,4); cs2=r(1,3); ccs2=r(1,2); ccs1=r(1,1); else cs1=[b7 b6 b5]; ccs3=c3; cs2=b3; ccs2=c2; ccs1=c1; end end elseif menu_m==2 if ((m1~=0) && (m1~=1)) || ((m2~=0) && (m2~=1)) || ((m3~=0) && (m3~=1)) || ((m4~=0) && (m4~=1)) || ((m5~=0) && (m5~=1)) || ((m6~=0) && (m6~=1)) || ((m7~=0) && (m7~=1)) || ((m8~=0) && (m8~=1)) || ((m9~=0) && (m9~=1))|| ((m10~=0) && (m10~=1)) || ((m11~=0) && (m11~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); else b15=m1; b14=m2; b13=m3; b12=m4; b11=m5; b10=m6; 98 b9=m7; b7=m8; b6=m9; b5=m10; b3=m11; b8=[b9 b10 b11 b12 b13 b14 b15]; b4=[b5 b6 b7 b12 b13 b14 b15]; b2=[b3 b6 b7 b10 b11 b14 b15]; b1=[b3 b5 b7 b9 b11 b13 b15]; unosb8=sum(b8); unosb4=sum(b4); unosb2=sum(b2); unosb1=sum(b1); if mod(unosb8,2)==0 c4=0; else c4=1; end if mod(unosb4,2)==0 c3=0; else c3=1; end if mod(unosb2,2)==0 c2=0; else c2=1; end if mod(unosb1,2)==0 c1=0; else c1=1; end c=[b15 b14 b13 b12 b11 b10 b9 c4 b7 b6 b5 if error==1 e=randerr(1,n); r=bitxor(c,e); unos_ce1=sum([r(1,15) r(1,13) r(1,11) r(1,5) r(1,3) r(1,1)]); unos_ce2=sum([r(1,15) r(1,14) r(1,11) r(1,6) r(1,3) r(1,2)]); unos_ce3=sum([r(1,15) r(1,14) r(1,13) r(1,6) r(1,5) r(1,4)]); unos_ce4=sum([r(1,15) r(1,14) r(1,13) r(1,10) r(1,9) r(1,8)]); if mod(unos_ce1,2)==0 ce1=0; else ce1=1; end if mod(unos_ce2,2)==0 ce2=0; else ce2=1; c3 b3 c2 c1]; r(1,9) r(1,7)... r(1,10) r(1,7)... r(1,12) r(1,7)... r(1,12) r(1,11).. 99 end if mod(unos_ce3,2)==0 ce3=0; else ce3=1; end if mod(unos_ce4,2)==0 ce4=0; else ce4=1; end con_par=[ce4 ce3 ce2 ce1]; pos=binvec2dec(fliplr(con_par)); cs1=[r(1,15) r(1,14) r(1,13) r(1,12) r(1,11) r(1,10)... r(1,9)]; cs2=[r(1,7) r(1,6) r(1,5)]; cs3=r(1,3); ccs4=r(1,4); ccs3=r(1,3); ccs2=r(1,2); ccs1=r(1,1); else cs1=[b15 b14 b13 b12 b11 b10 b9]; cs2=[b7 b6 b5]; cs3=b3; ccs4=c4; ccs3=c3; ccs2=c2; ccs1=c1; end end end guidata(hObject, handles); 100 APÉNDICE K. Archivo .m: Codificación Cíclica function codificar_Callback(hObject, eventdata, handles) ka=get(handles.popupmenu1,'Value'); error=get(handles.check_error,'Value'); if ka==1 n=4; k=3; m1=str2num(get(handles.edit1,'String')); m2=str2num(get(handles.edit2,'String')); m3=str2num(get(handles.edit3,'String')); mens=[m1 m2 m3]; if ((m1~=0) && (m1~=1)) || ((m2~=0) && (m2~=1)) || ((m3~=0)... && (m3~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); end elseif ka==2 n=7; k=4; m1=str2num(get(handles.edit1,'String')); m2=str2num(get(handles.edit2,'String')); m3=str2num(get(handles.edit3,'String')); m4=str2num(get(handles.edit4,'String')); mens=[m1 m2 m3 m4]; if ((m1~=0) && (m1~=1)) || ((m2~=0) && (m2~=1)) || ((m3~=0)... && (m3~=1)) || ((m4~=0) && (m4~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); end elseif ka==3 n=18; k=6; m1=str2num(get(handles.edit1,'String')); m2=str2num(get(handles.edit2,'String')); m3=str2num(get(handles.edit3,'String')); m4=str2num(get(handles.edit4,'String')); m5=str2num(get(handles.edit5,'String')); m6=str2num(get(handles.edit6,'String')); mens=[m1 m2 m3 m4 m5 m6]; if ((m1~=0) && (m1~=1)) || ((m2~=0) && (m2~=1)) || ((m3~=0)... && (m3~=1)) || ((m4~=0) && (m4~=1)) || ((m5~=0) && (m5~=1))... || ((m6~=0) && (m6~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); end elseif ka==4 n=24; k=8; m1=str2num(get(handles.edit1,'String')); m2=str2num(get(handles.edit2,'String')); m3=str2num(get(handles.edit3,'String')); m4=str2num(get(handles.edit4,'String')); m5=str2num(get(handles.edit5,'String')); m6=str2num(get(handles.edit6,'String')); m7=str2num(get(handles.edit7,'String')); m8=str2num(get(handles.edit8,'String')); 101 mens=[m1 m2 m3 m4 m5 m6 m7 m8]; if ((m1~=0) && (m1~=1)) || ((m2~=0) && (m2~=1)) || ((m3~=0)... && (m3~=1)) || ((m4~=0) && (m4~=1)) || ((m5~=0) && (m5~=1))... || ((m6~=0) && (m6~=1)) || ((m7~=0) && (m7~=1)) || ((m8~=0)... && (m8~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); end end pol_gen = cyclpoly(n,k,'min'); c = mod(conv(pol_gen,mens),2); if error==1 e=[randerr(1,k) zeros(1,n-k)]; r=bitxor(c,e); pos=find(e); set(handles.text9,'Visible','on'); set(handles.text_e,'String',num2str(pos)); else r=c; set(handles.text9,'Visible','off'); set(handles.text_e,'String',''); end [q res]=deconv(r,pol_gen); s=mod(abs(res),2); set(handles.text_g,'String',num2str(pol_gen)); set(handles.text_c,'String',num2str(r)); set(handles.text_s,'String',num2str(s)); guidata(hObject, handles); 102 APÉNDICE L. Archivo .m: Codificación Convolucional function codificar_Callback(hObject, eventdata, handles) c=[]; m=handles.m; u1=str2num(get(handles.edit1,'String')); u2=str2num(get(handles.edit2,'String')); u3=str2num(get(handles.edit3,'String')); u4=str2num(get(handles.edit4,'String')); mje=[u1 u2 u3 u4]; lmje=length(mje); y=zeros(1,m-1); if ((u1~=0) && (u1~=1)) || ((u2~=0) && (u2~=1)) || ((u3~=0)... && (u3~=1)) || ((u4~=0) && (u4~=1)) errordlg('Introduzca números binarios',' Palabra Fuente '); else for i=lmje:-1:1 s=[mje(i),y]; y=s(1:m-1); if m==2 o1=s(1); o2=bitxor(s(1),s(2)); o3=[]; elseif m==3 o1=bitxor(s(1),s(3)); o2=bitxor(s(1),s(2)); o3=[]; elseif m==4 o1=bitxor(s(1),s(2)); o2=s(4); o3=bitxor(s(1),s(3)); end c=[o1 o2 o3 c]; end end set(handles.text_c,'String',num2str(c)); guidata(hObject, handles); 103