Está en la página 1de 22

DPTO. INGENIERA AUDIOVISUAL Y COMUNICACIONES LAB.

DE TEORA DE LA COMUNICACIN

PRCTICA 1

INTRODUCCIN AL MATLAB

NDICE

1. INTRODUCCIN ................................................................................................................. 3 2. )QU ES MATLAB? ............................................................................................................ 4 2.1 Primeros pasos con MATLAB ................................................................................ 6 2.1.1. Matrices.................................................................................................. 6 2.1.2. Operadores aritmticos y lgicos............................................................ 8 2.1.3. Bucles..................................................................................................... 8 2.1.4. Caminos condicionados........................................................................ 10 2.1.5. Formatos de presentacin de resultados de MATLAB......................... 11 2.1.6. Variables reservadas de MATLAB ...................................................... 11 2.1.7. Otros comandos de MATLAB ............................................................. 12 2.2. Algunos ejemplos sencillos con MATLAB.......................................................... 13 3. SINUSOIDE CON AWGN.................................................................................................. 16 4. APNDICE: FUNCIONES DE USUARIO......................................................................... 19

PRACTICA 1

-3-

1. INTRODUCCIN La simulacin de seales y sistemas de comunicacin es una herramienta muy poderosa que permite el estudio de situaciones que analizadas por la va terica seran difciles de evaluar. A ello se le suma el ahorro econmico y de tiempo que conlleva el no tener que disear, construir y medir el sistema elctrico correspondiente. Un paquete software de simulacin muy popular, y de uso muy comn en todas las universidades del mundo, es el que se conoce por el nombre de MATLAB. Su empleo est a la orden del da y todo alumno debiera estar familiarizado con l. Esta primera prctica consiste en una toma de contacto con MATLAB. Bsicamente, MATLAB despliega, por medio del ordenador, un poderoso entorno de clculo cientfico y tcnico destinado al clculo numrico y a la visin de los resultados obtenidos. MATLAB integra facilidades de anlisis matemtico, clculo matricial, procesado de seal y grficos con una sintaxis similar a la empleada en lenguaje matemtico tradicional. Paralelamente al aprendizaje del uso de MATLAB, el alumno repasar algunos conceptos claves estudiados en la parte terica de la asignatura (como son los conceptos de valor medio, valor cuadrtico medio, valor eficaz, etc.), el punto de vista que ofrece la densidad espectral de potencia o de energa y las propiedades del ruido blanco, gaussiano y aditivo. Para abordar con xito la realizacin de la prctica es muy aconsejable que el alumno haya cursado (o est cursando) las asignaturas Programacin y Sistemas Lineales y la parte terica de Teora de la Comunicacin. La versin MATLAB del laboratorio se ejecuta bajo Windows

-4-

LABORATORIO DE TEORA DE LA COMUNICACIN

2. )QU ES MATLAB? MATLAB (acrnimo de las palabras anglosajonas MATrix LABoratory) es un sistema interactivo, que incluye capacidades grficas, macros programables, aritmtica IEEE, un intrprete rpido y muchos ms programas de aplicacin. La empresa propietaria de MATLAB es MathWorks. Uno de los puntos fuertes de MATLAB consiste en que las unidades bsicas de clculo son matrices que no necesitan ser previamente dimensionadas. Este hecho permite resolver problemas numricos ms fcilmente que utilizando directamente lenguajes de programacin convencionales, como son FORTRAN, BASIC, PASCAL o C. Adems, la sintaxis de MATLAB es muy similar a la notacin matemtica usual. MATLAB se utiliza especialmente en clculos numricos, algoritmos y problemas con formulacin matricial, tal y como aparecen en control automtico, estadstica, teora de la comunicacin o procesado digital de la seal. Su capacidad va desde efectuar una sencilla suma hasta realizar la inversin de matrices o su descomposicin en autovectores. Posiblemente, la caracterstica ms importante de MATLAB es la facilidad con la que se puede ampliar, permitiendo a cualquiera crear aplicaciones y funciones, integrables en MATLAB y utilizables por el resto de personas. MATLAB interpreta los comandos que le son introducidos por teclado, procesndolos inmediatamente y mostrando el resultado. Tambin permite ejecutar secuencias de comandos almacenados en ficheros con extensin *.m, llamados ficheros m-files. Los ficheros m son ficheros ASCII convencionales que pueden crearse o modificarse con cualquier editor de texto convencional. Los ficheros m pueden referenciar a otros ficheros m, o incluso referenciarse a si mismos recursivamente. Existen dos tipos de ficheros m: script-files y funciones. Los script-files son ficheros externos de MATLAB que contienen una lista de instrucciones, cuyo objetivo es automatizar largas secuencias de comandos. Los ficheros de funcin permiten definir nuevas funciones para MATLAB. Deben incluir en la primera lnea la palabra reservada function. Por ejemplo: function [mean,stdev] = stat(x,y,z) Donde stat es el nombre de la funcin, x, y y z son las variables de entrada y mean y stdev son las variables que devuelve la funcin. Al crear un fichero de funcin se debe salvar con el nombre de la funcin (en nuestro ejemplo, stat.m).

PRACTICA 1

-5-

Los ficheros de funcin distinguen tanto variables locales como externas que pueden ser pasadas a la funcin. Otro tipo de ficheros de MATLAB son los tipo mat, que se generan con el comando save de MATLAB. Este comando permite grabar las variables que actualmente se encuentran en memoria, en un fichero de disco de tipo binario. Al fichero que resulta se le llama fichero de tipo mat porque la extensin del fichero es .mat. El comando load es el inverso de save, es decir: load lee el fichero mat del disco y lo carga en la memoria de MATLAB. MATLAB ofrece tambin una serie de funciones diseadas especialmente para aplicaciones especficas. Estas se agrupan en entidades conocidas como toolboxes. Las toolboxes aaden an ms potencia a MATLAB cuando ste se va a utilizar en aplicaciones tales como procesado digital de la seal, diseo de sistemas de control automtico, simulacin no lineal, modelado paramtrico, optimizacin, etc. El programa MATLAB del laboratorio de Seales y Comunicaciones incluye unas toolboxes de seales, de comunicaciones y de control que contienen funciones destinadas, entre otros propsitos, al anlisis espectral en mdulo y fase de seales, la implementacin de filtros tanto analgicos como digitales, el anlisis de modulaciones digitales, la evaluacin del efectos introducidos por un canal de comunicacin, la aplicacin de diversas tcnicas de control clsicas y modernas, etc. La instalacin de MATLAB en el ordenador crea una serie de directorios donde se guardan todos los componentes necesarios para su correcto funcionamiento. Son los siguientes: \bin En l se aglutinan ficheros de proceso por lotes (batch), ficheros ejecutables y drivers grficos de MATLAB. \toolbox\matlab Contiene multitud de funciones aportadas por MATLAB para clculo elemental, anlisis matemtico, clculo matricial, representacin grfica, depurado de programas, demostraciones y ejemplos, etc. \toolbox\signal \extern Contiene ficheros m de la Toolbox de seales y sistemas. Contiene subrutinas para escribir y leer ficheros mat desde programas escritos en FORTRAN, PASCAL y C. Tambin se encuentran las cabeceras y la librera necesarias para poder llamar desde C a las rutinas de MATLAB, o a la inversa.

-6-

LABORATORIO DE TEORA DE LA COMUNICACIN

2.1 Primeros pasos con MATLAB Las variables empleadas en MATLAB deben empezar con una letra. MATLAB hace distincin entre letras maysculas y minsculas. Todas las variables se almacenan en forma de matriz de elementos complejos, aunque pueden introducirse datos reales o enteros. Si la parte imaginaria de todos los elementos de la matriz es cero, entonces MATLAB slo muestra en pantalla la parte real. Para introducir nmeros complejos, primero de todo es necesario asignar la raz cuadrada de 1 a una variable (lo usual es que sea la variable i o la j). A partir de ese momento, podr emplearse dicha variable como identificador de la parte imaginaria de un nmero. En los apartados siguientes se aconseja ir repitiendo desde MATLAB todos los ejemplos que van a ir apareciendo. Esto ayudar a coger confianza e ir descubriendo todas las posibilidades bsicas que nos ofrece este paquete de simulacin.

2.1.1. Matrices. Existen cuatro modos de definir una matriz en MATLAB: Introduciendo explcitamente la lista de elementos de la matriz. Generndola mediante comandos y declaraciones disponibles en MATLAB. Crendola con ficheros m. Cargndola de ficheros mat.

Un ejemplo tpico del primer modo lo tenemos en la siguiente declaracin: A = [1 2 3; 4 5 6; 7 8 9] que representa una matriz 3 por 3, llamada A, con los nmeros naturales del 1 al 9. Los corchetes, [ y ], se emplean como delimitadores de los elementos de la matriz. El punto y coma se emplea aqu para marcar el fin de cada fila, aunque tambin puede hacerse esto ltimo con el retorno de carro. Los elementos individuales de cada fila pueden separarse por espacios o por comas. As [1 2 3] es lo mismo que [1,2,3] pero no es igual que [12,3]. Los elementos de una matriz pueden ser expresiones matemticas. Por ejemplo, la sentencia: B = [1.3 sqrt(3) (1+2+3)*4/5] genera el vector: [-1.3000 1.7321 4.8000].

PRACTICA 1

-7-

Observe que en MATLAB el separador decimal es el punto . y no la coma, pues se sigue la notacin anglosajona. Puede accederse a los elementos de una matriz de la misma forma que se hace en los lenguajes de programacin convencionales, es decir: indicando los subndices entre parntesis, donde el primer subndice es el nmero de fila y el segundo subndice el nmero de columna. Por ejemplo: A(2,3) hace referencia al tercer elemento de la segunda fila de la matriz A. Teclese A(2,3) en la lnea de comandos del MATLAB seguido de un retorno de carro y comprubese que el resultado devuelto es 6. Tambin puede tenerse acceso a una fila o columna completa por medio del smbolo : como subndice libre. Por ejemplo A(2,:) es la segunda fila de A, y B(:,j) es la j-sima columna de B. Pueden manipularse submatrices empleando un vector como subndice. El vector puede ser una matriz definida previamente, o puede construirse con los delimitadores [ y ] tal como se explic anteriormente. Por ejemplo, si hacemos v = [1 3], y cogemos el vector B anterior, tendramos que B(v) es igual a [-1.3000 4.8000] (elementos primero y tercero de B). El smbolo : permite una gran flexibilidad al construir matrices y submatrices, tal y como muestran los ejemplos siguientes: x=j:k x=j:i:k A(2:3,1:2) A(:) es equivalente a [j, j+1, j+2,....., k] (vaco si j>k). es equivalente a [j, j+i, j+2i,....., k]. es una submatrz de A formada por las filas 2 hasta la 3 y las columnas 1 hasta la 2. es un vector columna con TODOS los elementos de A.

A([1,3],:)=A([3,1],:) intercambia las filas 1 y 3 de la matriz A.

En MATLAB las matrices se redimensionan automticamente. Por ejemplo si: B = [-1.3000 1.7321 4.8000] entonces B(5) = abs(B(1)) genera [-1.3000 1.7321 4.8000 0.000 1.3000], pues la nueva matriz B ha de incluir un quinto elemento con el valor absoluto del primer elemento de la matriz B antigua. (Note que al redimensionar, se rellena el cuarto elemento con un 0.) Otra operacin matricial importante es el clculo de la traspuesta de una matriz. La forma de realizarla es empleando el apstrofe. Existen dos versiones: A.', calcula la matriz traspuesta de A, mientras que A' calcula la matriz traspuesta conjugada de A. Una aplicacin interesante de esta operacin es el producto escalar de dos vectores, a y b, mediante: a*b.'. Por ejemplo, dados a = [1 -1 1] y b = [0 2 4], entonces tendramos:

-8-

LABORATORIO DE TEORA DE LA COMUNICACIN

a*b.' = [2] Finalmente, la sentencia A=[], borra la variable A asignndole una matriz de dimensin cero por cero. Es muy til para asegurar que A no almacena basura de ejecuciones anteriores.

2.1.2. Operadores aritmticos y lgicos. Los smbolos aritmticos: +, , *, ^, se emplean respectivamente como operadores para sumar, restar, multiplicar y elevar una cantidad a una potencia. Las matrices que se sumen o resten deben tener la misma dimensin. Mientras que para la multiplicacin (matricial) de, digamos, A*C, el nmero de filas de A debe coincidir con el nmero de columnas de C. Para la potenciacin, la matriz debe ser cuadrada y el exponente debe ser un nmero positivo real o entero. Las barras de divisin a izquierda y derecha, A\C y C/A, corresponden formalmente a las multiplicaciones izquierda y derecha de C por la inversa de A, esto es A-1*C y C*A-1. O dicho de otro modo, el operador divisin se define como la matriz solucin, X, de la ecuacin A*X=C, para la divisin izquierda A\C, y de X*A=C, para la divisin derecha C/A. Es posible efectuar la multiplicacin o la divisin elemento a elemento de dos matrices. Para ello slo hay que utilizar los smbolos .* (multiplicacin), .\ (divisin izquierda), y ./ (divisin derecha). Introduzca en MATLAB por teclado dos matrices A y C y pruebe a efectuar con ellas todas las operaciones aritmticas que se han presentado. Cuatro son los operadores lgicos que tiene MATLAB, el operador AND: &, el operador OR: |, el operador NOT: ~, y el operador OR EXCLUSIVO: xor(a,b). Su utilidad radica en que permiten aunar o modificar operadores relacionales conforme a las reglas del lgebra de Boole. Por ejemplo, 5>4 & 6>4 ser cierto (TRUE), mientras que 1==2 | 2==3 ser falso (FALSE). Al responder a una operacin lgica, MATLAB asigna 1 a los resultados TRUE y 0 a los FALSE. En el siguiente apartado, dedicado a los bucles, se entender mejor su uso en MATLAB.

2.1.3. Bucles. MATLAB permite ejecutar repetidamente una serie de instrucciones, controlando el momento en que se desea terminar esta operacin. Es lo que se conoce por el nombre de bucles. MATLAB tiene dos tipos de bucles: la sentencia FOR y la sentencia WHILE. La forma general de una sentencia for es:

PRACTICA 1

-9-

for variable=expr declaracin; .... declaracin; end En la descripcin anterior expr hace referencia a una expresin aritmtica, usualmente un vector del tipo j:k, mientras que variable es una variable convencional de MATLAB cuyo contenido puede usarse dentro del bucle. En la sentencia for expuesta, variable va tomando a cada paso el contenido de expr, ejecutndose todas las declaraciones que figuran hasta la palabra end. El bucle se lleva a efecto tantas veces como diversos valores pueda tomar expr. El comando for permite, entre otras cosas, generar matrices de modo distinto al visto en el apartado anterior. Concretamente, el siguiente ejemplo muestra cmo generar una matriz de Hilbert de 5 por 5: n=5; for i=1:n for j=1:n A(i,j)=1/(i+j-1); end end generndose: A = 1.0000 0.5000 0.3333 0.2500 0.2000 0.5000 0.3333 0.2500 0.2000 0.1667 0.3333 0.2500 0.2000 0.1667 0.1429 0.2500 0.2000 0.1667 0.1429 0.1250 0.2000 0.1667 0.1429 0.1250 0.1111 % % % % declara el tamao de la matriz para las filas 1 a la n y para las columnas 1 a la n crea el elemento (i,j)

La forma general de una sentencia while es: while expr1 relop expr2 declaracin; .... declaracin; end

-10-

LABORATORIO DE TEORA DE LA COMUNICACIN

En esta sintaxis, se ha llamado expr1 y expr2 a sendas expresiones aritmticas y relop a uno de los siguientes operadores relacionales: == (igual que), < (menor que), > (mayor que), <= (menor o igual que), >= (mayor o igual que) o ~= (distinto a). En un bucle while todas las declaraciones contenidas hasta la palabra end, se ejecutan repetidamente mientras que expr1 y expr2 estn relacionadas de forma verdadera. En el siguiente ejemplo, MATLAB pide que se introduzca un nmero hasta que ste est comprendido entre 1 y 5, ambos inclusive: A=0 % se inicializa A con un valor distinto de 1 while A<1 | A>5 A=input ('Para salir, teclee un numero de 1 a 5:'); end

2.1.4. Caminos condicionados. Una vez que un programa MATLAB comienza su ejecucin, es posible hacer que ejecute cosas distintas conforme a alguna condicin establecida. Es lo que se conoce como sentencia IF-ELSE. La forma general de una sentencia if-else es la siguiente: if expr1 relop expr2 declaracin A; .... declaracin A; else declaracin B; .... declaracin B; end En la sintaxis expuesta, expr1, expr2 y relop, tienen el mismo significado que tenan cuando se explico la sentencia while. Si expr1 est relacionada de forma cierta con expr2, entonces se ejecutan las declaraciones etiquetadas con A; y, en caso contrario, se ejecutan las declaraciones etiquetadas con B. En la sentencia if-else la palabra else puede ser omitida. Una variante de la sentencia if-else es la ifelseif-else que permite anidar bucles condicionales dentro de otros bucles condicionales tantas veces como se desee. El siguiente, es un ejemplo de uso de la sentencia if-elseif-else:

PRACTICA 1

-11-

if I==J A(I,J)=2; elseif abs(I-J)==1 A(I,J)=-1; else A(I,J)=0; end Nota importante: Los bucles y los caminos condicionados son adecuados para controlar el flujo del programa. No deben usarse para realizar operaciones y clculos con datos (matrices o vectores) de muchos elementos. En estos casos siempre es preferible buscar una alternativa mediante operaciones con matrices.

2.1.5. Formatos de presentacin de resultados de MATLAB Para presentar los resultados numricos por pantalla, MATLAB posee diversos formatos. Los ms relevantes para nosotros son: short long short e long e hex + rat Punto fijo con 5 dgitos. Punto fijo con 15 dgitos. Punto flotante con 5 dgitos. Punto flotante con 15 dgitos. Hexadecimal. Imprime el signo de los resultados. Ignora la parte imaginaria. Formato fraccional de presentacin de los resultados. Todos los clculos en MATLAB se realizan con precisin de tipo doble aunque luego la presentacin de los resultados no lo muestre. El comando format permite cambiar el formato de presentacin de un tipo a otro de los mostrados arriba; para ello, hay que ejecutar format seguido de una de las palabras clave que acaban de verse.

2.1.6. Variables reservadas de MATLAB. Aparte de las variables que el usuario de MATLAB pueda declarar para su uso personal, existen una serie de ellas cuya definicin y manejo corren por cuenta de MATLAB. Ello no significa que no puedan modificarse, sino que si se toma la determinacin de alterar su valor, perdern el propsito para el que fueron diseadas. Algunas de estas variables son:

-12-

LABORATORIO DE TEORA DE LA COMUNICACIN

eps

Es una variable de tolerancia usada en varios clculos, por ejemplo, rango y singularidad. Su valor inicial es el nmero real positivo ms pequeo disponible en el ordenador, pero puede ser fijado a otro valor cualquiera.

realmax realmin flops NaN inf pi

Es el nmero ms grande que puede computarse en punto flotante. Cualquier otro mayor produce desbordamiento. Es el nmero ms pequeo que puede computarse en punto flotante. Es un contador que lleva a cuenta del nmero de operaciones en punto flotante realizadas desde el comienzo de la sesin de trabajo. Not a Number. Es la representacin IEEE que el MATLAB da a resultados de operaciones indeterminadas como 0/0. Es una variable permanente en formato IEEE que representa una infinidad positiva, como por ejemplo 1/0. Nmero .

2.1.7. Otros comandos de MATLAB. help Devuelve una lista de temas sobre los que se puede obtener informacin de ayuda. Si help se antepone a un nombre de funcin, devuelve una breve ayuda sobre sta. Este comando es muy importante. El alumno debe usarlo cada vez que tenga dudas sobre otra instruccin, comando o funcin. demo clear Muestra un men con las demostraciones disponibles. Borra todas las variables excepto las reservadas de MATLAB. Clear x borra nicamente la variable x. En general, todo script que realice el alumno debe comenzar con un clear para limpiar valores anteriores no deseados. who whos what dir echo chdir type quit, exit why ; Enlista las variables actualmente utilizadas. Muestra las variables actualmente utilizadas as como su tamao. Es muy til para localizar errores cuando no se obtienen los resultados deseados. Enlista los comandos y funciones actualmente disponibles en el directorio de trabajo del disco. Da una relacin de los ficheros que hay en el directorio actual. Reproduce por consola el texto ntegro de la lnea de comandos que se ejecuta en cada instante. Cambia el directorio actual por el que se indique a continuacin de chdir. Muestra el contenido de cualquier fichero ASCII. Si no se indica extensin, MATLAB toma .M por defecto. Finaliza la sesin de trabajo con MATLAB. Siempre tiene respuesta para cualquier problema... Al final de una declaracin inhibe la salida por pantalla del resultado. Por lo tanto, si una sentencia no acaba en ; normalmente producir una salida por pantalla.

PRACTICA 1 ...

-13Indica que la declaracin contina en la siguiente lnea fsica. As se pueden escribir sentencias muy largas desde el entorno de trabajo. Cuando hay que recurrir a este comando, se recomienda encarecidamente que el alumno escriba sus instrucciones en un fichero script.

Indica que el resto de la lnea es un comentario. Todo script o funcin que genere el alumno debe estar profusamente comentado. De otro modo, nadie entender el cdigo al revisarlo.

Invoca a un comando del sistema operativo. Si se desea conocer con ms profundidad el entorno de simulacin MATLAB, puede acudirse a los

manuales de MATLAB disponibles en biblioteca.

2.2 Algunos ejemplos sencillos con MATLAB Aparte de los ejemplos que se expondrn seguidamente, es muy recomendable ejecutar las demostraciones (demos) de que dispone MATLAB. Se recomienda ver, al menos, las demos propias de MATLAB as como las de las toolboxes de comunicaciones, procesado de seal y filtros. Para ello, lo nico que hay que hacer es escribir demo en la lnea de comandos y pulsar la tecla de retorno de carro. Tras esto, aparecer una ventana con todas las demostraciones disponibles. Para moverse por ellas, basta con seguir las explicaciones que MATLAB va dando. A continuacin damos dos ejemplos ilustrativos de programas escritos para MATLAB. Es aconsejable que el alumno intente razonar cmo funcionan y el efecto que produce cada uno de estos programas antes de pasar a ejecutarlos. Ejemplo 1. El ejemplo siguiente es una funcin que demuestra cmo se pueden calcular medias estadsticas. Si la variable de entrada es un vector, calcula la media y la desviacin tpica de todos sus elementos. Mientras que si la variable de entrada es una matriz, obtiene un vector fila con los valores medios y las desviaciones tpicas de cada columna. Asimismo, este ejemplo sirve para ilustrar cual es el formato tpico de un fichero de funcin tipo m. function [mean,stdev] = stat(x) % esta es la forma habitual de declarar una funcin [m,n] = size(x); if m == 1 m = n; end mean = sum(x) / m; stdev = sqrt(sum(x.^2) / m - mean.^2); % end (no es necesario acabar con end)

-14-

LABORATORIO DE TEORA DE LA COMUNICACIN

Para crear la funcin stat, siga los siguientes pasos: 1. En el men de MATLAB (parte superior de la ventana) navegue en la zona Current Directory: hasta situarse en su propio directorio de trabajo. Asegrese de que ya no est en los directorios de MATLAB. No salve nunca sus propios scripts y funciones en los directorios de MATLAB. 2. Abra un editor sencillo ASCII. Una buena opcin es el que ofrece el propio MATLAB: desde el men (parte izquierda superior de la ventana) seleccione File New M-File. 3. Copie todas las lneas de la funcin stat. Recuerde que una funcin debe comenzar con la palabra reservada function. Obviamente puede (e incluso debe) personalizar los comentarios que hay tras los smbolos %. 4. Salve el fichero con el nombre stat y la extensin .m. Dos puntualizaciones: a) Acostmbrese a crear funciones con nombres en minsculas, tanto en el nombre del fichero, como en la lnea que empieza por function. MATLAB distingue maysculas y minsculas; no es una buena idea que la funcin y el fichero no coincidan en ese detalle. b) Por defecto, el editor de MATLAB ya aade la extensin correcta. 5. Desde el entorno de trabajo, compruebe con el comando what que su nueva funcin est disponible. Para ejecutar la funcin cree un vector x, por ejemplo x = [4.5 6 7 3 10], y teclee en la lnea de comandos de MATLAB: [m,d] = stat(x). El resultado que debe obtenerse es m = 6.1 y d = 2.3749. Ejemplo 2. El presente ejemplo muestra un fascinante problema de teora de nmeros. Consiste en lo siguiente: cojamos cualquier nmero entero positivo (mayor que 1); si es par, se divide por dos; si es impar, se multiplica por 3 y se le suma 1 al resultado. As se va repitiendo el proceso hasta que se consiga un nmero entero igual a uno. Lo atractivo del problema, an no resuelto, es lo siguiente: )existe algn entero para el cual el proceso no termine nunca? El siguiente programa en MATLAB ilustra el empleo de los comandos while y if. Tambin muestra cmo la funcin input permite introducir un nmero desde el teclado y como el comando break permite salir de un bucle: % Problema "3n+1" clsico de teora de nmeros while 1 n = input ('Introduzca n. Negativo (o cero) finaliza. '); if n<=0, break, end while n>1 if rem(n,2) == 0, n = n/2; else n = 3*n+1; end; n % permite ver por pantalla la evolucin de n end; end;

PRACTICA 1

-15-

Para crear el script tres (es el nombre que le vamos a dar) siga los siguientes pasos: 1. Sitese en su propio directorio de trabajo. 2. Abra un nuevo M-File en el editor de MATLAB. 3. Copie todas las lneas del script tres. 4. Salve el fichero con el nombre tres y la extensin .m. Este programa representa un buen ejemplo de un fichero de tipo script. Para ejecutarlo slo hay que teclear su nombre en la lnea de comandos de MATLAB.

-16-

LABORATORIO DE TEORA DE LA COMUNICACIN

3. SINUSOIDE CON AWGN En este apartado se van a aplicar los conocimientos adquiridos anteriormente para desarrollar un caso de enorme importancia, tanto en este laboratorio, como en la asignatura y en la ingeniera de telecomunicacin. A continuacin tiene el cdigo de un script en el que se generan una sinusoide y un ruido blanco. Estudie con detenimiento todas y cada una de las instrucciones hasta entenderlas plenamente.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % LTC: Prctica de SINUSOIDE CON AWGN % % Versin 2.0 % % Julio de 2011 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (1) Reseteo del espacio de trabajo: clf clear,clc % (2) Ctes. y valores iniciales: fs = 1024; A = 0.1; Z = 50; N = 1024; f0 = 50; nef = 0.001; B = 50; fn = 300;

% % % % % % % %

frec. de muestreo (Hz) valor de pico de la sinusoide (V) impedancia (Ohmios) nmero de muestras frecuencia de la sinusoide (Hz) valor eficaz del ruido blanco (V) B en el que mediremos el ruido frec. central de la banda de ruido

% (3) Vector con los instantes de muestreo: T = 1/fs; % tiempo de muestreo: inversa de fs t = 0:T:(N-1)*T; % N elementos, desde 0 en saltos de T % (4) Sinusoide: creacin x = A*sin(2*pi*f0*t); % (5) Sinusoide: potencia px_W = powmeter(x,fs,f0,1,Z) Px_dBm = 10*log10(px_W*1e3)

% muestras de la sinusoide

% sin ";" al final, muestra el valor (W) % en dBm

% (6) Sinusoide: visualizacin en osciloscopio y analizador figure(1) time_dep(x,T,Z,'SINUSOIDE','log'); % el espectro siempre con eje log. % (7) Ruido blanco (gaussiano en tensin): creacin n = nef*randn(size(t)); % vector gaussiano, valor eficaz nef % (8) Ruido blanco: valores tericos disp('Valores tericos:')

PRACTICA 1
pn_W = nef^2/Z Pn_dBm = 10*log10(pn_W*1e3) No_W_Hz = pn_W/(fs/2) No_dBm_Hz = 10*log10(No_W_Hz*1e3) Pn_dBm_B = 10*log10(No_W_Hz*B*1e3) % % % % % potencia potencia densidad densidad potencia (W) (dBm) espectral (W/Hz) espectral (dBm/Hz) (dBm) en B = 50 Hz

-17-

% (9) Ruido blanco: valores simulados disp('Valores simulados:') pn_W = powmeter(n,fs,fn,B,Z) % potencia de ruido (W) en B Pn_dBm = 10*log10(pn_W*1000) % potencia de ruido (dBm) en B % (10) Ruido blanco: visualizacin figure(2), time_dep(n,T,Z,'RUIDO','log'); % (11) Seal con ruido: creacin xn = x + n;

% AWGN es aditivo, se suma al tono

% (12) Seal con ruido: visualizacin figure(3), time_dep(xn,T,Z,'SINUSOIDE CON RUIDO','log'); % (13) Seal con ruido: promediado (para ver el nivel de ruido mejor) NP = input('Nmero de espectros promediados?: '); tic % comienza a medir el tiempo de la operacin unos = ones(NP,1); % una fila por cada espectro (NP filas) matx = unos*x; % matriz con NP filas, cada fila es el tono x matn = nef*randn(NP,N); % cada fila es un ruido diferente matxn = matx+matn; % en cada fila: suma de x con un ruido distinto matXN = fft(matxn.')/N; % espectro (de seal) Smatxn = (matXN.*conj(matXN)).'/Z; % densidad espectral de potencia (DEP) DEPprom = mean(Smatxn); % DEP promedio de cada columna (afecta al ruido) DEPpromuni = [DEPprom(1) 2*DEPprom(2:N/2)]; % se pasa DEP a unilateral ejefrec = (0:fs/2-1); % eje de frec. de la DEP unilateral toc % se termina de medir el tiempo de la operacin DEPpromuni_dBm = 10*log10(DEPpromuni*1e3); % DEP en dBm/Hz figure(4), plot(ejefrec,DEPpromuni_dBm), grid % se dibuja title('SINUSOIDE CON RUIDO. PROMEDIO DE ESPECTROS') xlabel('Hz'), ylabel('dBm') % Fin

Note que: Es un script, no una funcin. Se ha identificado el archivo en su inicio con comentarios (nombre, versin, fecha). Se comienza limpiando (reseteando) el espacio de trabajo (1). Se agrupan constantes y valores fijos al principio (2). El alumno interesado puede sustituir estas lneas por otras que pidan interactivamente los valores. Se crea el vector con los instantes de muestreo, comenzando en t = 0, con saltos de T = 1/fs, hasta completar N elementos (3). Esta sintaxis es muy til. Se crea una sinusoide con la amplitud y la frecuencia deseadas (4). En realidad lo que se obtiene es un vector con los valores de la sinusoide en los instantes de muestreo. La funcin seno se denomina en MATLAB sin pues se usa el nombre en ingls. Se calcula la potencia (en W) de la sinusoide (5), llamando a la funcin powmeter, que se

-18-

LABORATORIO DE TEORA DE LA COMUNICACIN

suministra en el apndice del guin de la prctica. Por lo tanto, el alumno debe crear la funcin powmeter en su directorio de trabajo. Estudie atentamente los comentarios iniciales de la funcin. Compruebe que, desde el entorno de trabajo, con help powmeter se muestra en pantalla la ayuda escrita en los comentarios. Observe que la medida se realiza sobre un ancho de banda: en este caso se ha puesto 1 (1 Hz), que es suficiente para medir una sinusoide. Antes de usar cualquier funcin, asegrese de que sabe perfectamente qu variables recibe y qu valores devuelve. Se visualiza la sinusoide en el tiempo (osciloscopio) y en la frecuencia (analizador) mediante otra funcin del apndice (6). Dicha funcin (time_dep) va a ser muy til para el alumno. No es necesario que se estudien y entiendan todas las lneas de cdigo de las funciones suministradas en los apndices, pertenecen al temario de asignaturas de procesado digital. Se genera un vector con el ruido AWGN (7). Para ello se crea un vector pseudoaleatorio (random) gaussiano (normal), con la misma dimensin de la sinusoide. Su media es 0, y su desviacin tpica el valor eficaz que lo multiplica. En cada ejecucin el vector de ruido ser diferente, aunque estadsticamente tenga sus parmetros fijados. Se calculan potencias y densidades espectrales de potencia del ruido mediante las frmulas tericas (8). Como estos valores slo dependen de los parmetros estadsticos del ruido, en todas las ejecuciones se obtendrn exactamente los mismos resultados. Se calcula la potencia del ruido en B = 50 Hz, usando el vector pseudoaleatorio simulado (9). En cada ejecucin se obtendr un valor ligeramente diferente. Se visualiza el ruido AWGN simulado (10). En tensin ser gaussiano en torno a 0 V. En frecuencia ser aproximadamente plano (blanco). Se suman el tono y el ruido (11), pues un AWGN es aditivo. Se visualiza el tono con ruido (12). En el espectro se ha de observar claramente la delta del tono y el suelo de ruido aproximadamente plano. En el tiempo es necesario realizar varios zooms para apreciar un poco la influencia del ruido. Para ver con ms precisin el nivel del AWGN, es necesario promediar bastantes espectros (ejecuciones). El cdigo de (13) realiza esta tarea. Cuanto mayor sea el nmero de espectros promediados (NP) mas plano quedar el espectro del ruido. Por otro lado, tenga en cuenta que si NP es muy grande, MATLAB puede quedarse sin memoria para las variables (presentar un mensaje de out of memory) y finalizar la ejecucin con error. No es necesario que entienda perfectamente todas las sutilezas de este trozo de cdigo. En todo caso, s es interesante que estudie cmo se ha evitado la utilizacin de un bucle mediante clculos matriciales. Una vez creadas las funciones auxiliares del apndice y el script principal, ejecute el fichero y estudie sus resultados.

PRACTICA 1

-19-

En concreto: 1. Compruebe que la potencia, mostrada por pantalla, de la sinusoide es la correcta (total, unilateral). Como su valor de pico es 0,1 V y la impedancia vale 50 , debe aparecer:

A2 0,12 Px (dBm) = 10 log (mW ) = 10 log 1000 = 10 dBm 2 Z 2 50


2. Compruebe que la sinusoide aparece en el osciloscopio y el analizador de time_dep con los valores adecuados (amplitud, frecuencia, potencia). En el analizador, realice un zoom para apreciar con detalle los 10 dBm. 3. Compruebe el valor de la potencia de ruido en el ancho de banda B = 50 Hz. Siga los siguientes pasos: a) Calcule la potencia de n (en W y dBm). b) Calcule la densidad espectral del ruido. Tenga en cuenta que el ancho de banda equivalente del vector de ruido es B = fs/2 (la frecuencia de muestreo dividida entre 2 para que salga unilateral). c) Calcule la potencia de ruido en B = 50 Hz.

0,0012 = 2 10 8 W 47 dBm Z 50 p ' (W ) b) N 0 (W / Hz ) = n B' ( Hz ) N 0 = Pn '10 log[B' ( Hz )] = 47 10 log[1024 / 2] 74,1 dBm / Hz (unilateral ) a) pn ' = = c) Pn = N 0 + 10 log[B ( Hz )] = 74,1 + 10 log[50] 57,1 dBm p n (W ) = N 0 (W / Hz ) B( Hz )

2 n ef

4. Compruebe que el nivel de la densidad espectral de ruido (unilateral) en el analizador de time_dep coincide (aproximadamente) con el valor calculado (74,1 dBm/Hz). 5. Observe la sinusoide con AWGN: En el osciloscopio apenas notar el ruido porque es pequeo comparado con la seal. En el espectro ver claramente la delta del tono y el nivel del AWGN. 6. Promedie bastantes espectros para conseguir que el AWGN presente una densidad espectral de potencia razonablemente plana. (Como es lgico, el tono no se ve afectado por el promediado.) Por ejemplo, pruebe con NP = 100, 1000, 10000 y 100000. Usando el valor ms alto que no cree problemas de memoria, compruebe ahora con el zoom que el ruido tiene 74,1 dBm/Hz.

-20-

LABORATORIO DE TEORA DE LA COMUNICACIN

Despus de la ltima ejecucin del script tendr un conjunto de variables en el espacio de trabajo. Compruebe cules son tecleando whos. Ahora va a realizar varios clculos elementales con el MATLAB sobre estas variables. Calcule el valor de pico de la sinusoide (cuyas muestras estn en el vector x). Para ello basta con traducir la definicin de valor de pico a MATLAB: v_p = max(abs(x)) Si tiene dudas sobre el funcionamiento de alguna de las funciones que aparecen en el cdigo, teclee help nombre_funcion, y estudie la informacin que se presenta por pantalla. Calcule el valor medio de la sinusoide. En cada una de las siguientes lneas de cdigo se ofrece una forma diferente de conseguirlo. Piense qu ventajas e inconvenientes presenta cada una: suma=0; for i=1:N, suma=suma+x(i); end, media_x=suma/N media_x = sum(x)/length(x) media_x = mean(x) Observar que no sale exactamente 0 (si bien se obtiene un nmero muy pequeo). Por qu? Calcule el valor eficaz de la sinusoide. Es suficiente con: x_ef = std(x) Calcule el valor cuadrtico medio de la sinusoide. Segn la definicin: media_x2 = mean(x.^2) Por otro lado, teniendo en cuenta que el valor cuadrtico medio es la potencia de alterna sobre 1 , queda claro que tambin se puede obtener con: media_x2 = std(x)^2 Es ms, como un valor cuadrtico medio es una varianza desde el punto de vista estadstico, podemos incluso usar: media_x2 = var(x) Calcule el valor medio del ruido (cuyas muestras estn en el vector n). Compruebe que sale un valor similar (pero no igual) a 0. (Ya no se da un cdigo. Escrbalo por su cuenta.) Calcule el valor eficaz del ruido. Compruebe que sale un valor similar (pero no igual) a nef. Calcule el valor cuadrtico medio del ruido. Si divide el resultado por 50, qu parmetro se obtiene?

PRACTICA 1

-21-

APNDICE: FUNCIONES DE USUARIO En este apndice se muestran los listados dos funciones en MATLAB que se entregan para facilitar la realizacin de la prctica. La primera (powmeter) es un sencillo medidor que permite estimar la potencia que tiene una seal dentro de una banda de frecuencias. La segunda (time_dep) nos permite visualizar una seal, tanto en el dominio del tiempo como en el de la frecuencia (densidad espectral de potencia unilateral).

function p=powmeter(x,fs,f0,B,Z) % % function P=powmeter(x,fs,f0,B,Z) % % Funcin que calcula la potencia (W) que hay dentro de una banda % espectral de la seal x. % Datos de entrada: % x = Seal de entrada % fs = Frecuencia de muestreo % f0 = Frecuencia central de la banda % B = Ancho de banda de la medida % Z = Impedancia de trabajo (parte real) % % Fecha: 06/02/2007 % N=length(x); X=fft(x,N)/N; deltaf=fs/N; f1=f0-B/2; f2=f0+B/2; n1=round(f1/deltaf)+1; n2=round(f2/deltaf)+1; if n1<0 disp ('Valores de entrada al Power Meter errneos') elseif n1==0 p=X(1)*conj(X(1))+2*sum(X(2:n2).*conj(X(2:n2))); else p=2*sum(X(n1:n2).*conj(X(n1:n2))); end p=p/Z; % Fin de la funcin powmeter

-22-

LABORATORIO DE TEORA DE LA COMUNICACIN

function time_dep(x,T,Z,s,lin_log) % % function time_dep(x,T,Z,s,lin_log) % % Esta funcin representa en la parte superior la seal en el dominio % del tiempo, y en la parte inferior la d.e.p. % % Parametros de entrada: % ...................... % x: seal a analizar (real) % T: periodo de muestreo % Z: impedancia (ohmios) % s: ttulo que se quiere aparezca % lin_log: representacin lineal ('lin') o logaritmica ('log') % % 06/02/07 % a=length(x); subplot(211),plot((0:a-1)*T,x,'b'),grid xlabel('t (sg)'),ylabel('V (voltios)') title(s) x1=fft(x)/a; y=x1.*conj(x1); y=[y(1) 2*y(2:a/2)]/real(Z); eje=(1/T)*(0:a/2-1)/a; aux=(lin_log(1:3) =='lin'); if sum(aux)==3 subplot(212),plot(eje,y*1e3,'b') ylabel('mw') else subplot(212),plot(eje,10*log10(y*1e3+eps),'b') ylabel('dBm') end grid,xlabel('Hz') pause % Fin de la funcin time_dep

También podría gustarte