TRANSMISIÓN DIGITAL PRÁCTICA 1 Curso 2007-8 Transmisión Digital Práctica 1 Introducción Esta primera práctica trata de familiarizar al alumno con el lenguaje de programación Matlab, permitiéndole afrontar materias propias de la asignatura Transmisión Digital en las próximas prácticas. Se tratará de generar las siguientes señales: •Señal aleatoria •Señal sinusoidal •Señal suma de dos senos •Señal cuadrada periódica •Señal triangular periódica. A este conjunto de señales se le deben hacer una serie de medidas además de calcular su D.E.P y su función de autocorrelación. Las medidas a realizar son: •Valor medio •Valor de pico •Energía en el intervalo •Potencia en el intervalo •Factor de cresta No todas las funciones necesarias para realizar esta práctica están desarrolladas en este documento. El objetivo que se persigue es que el alumno realice algunos ejercicios que le permitan iniciarse en el uso de Matlab ( “a programar se aprende programando”).1 A continuación se describen cada una de las funciones de forma detallada. Función seno(seno.m) La función seno no tiene parámetros de entrada ni salida ya que todas las operaciones se realizan dentro de ella. Consta de un menú por el que se le introducen los parámetros de entrada que son: inicio y fin del intervalo, frecuencia de muestreo, frecuencia, fase y amplitud de la señal. Ahora se muestra un ejemplo de la construcción de una señal seno con frecuencia 1 Hz y frecuencia de muestreo 100 Hz, intervalo de observación 1-4 segundos, amplitud unidad y fase inicial nula. 1 Señal en el dominio del tiempo. 0.8 0.6 0.4 1 En el código de las funciones en MATLAB que se ofrecen se han introducido errores. Curso 2007/8 2 Transmisión Digital Práctica 1 El listado de la función seno.m es: function []=seno() % Entrada de parámetros A=input('Inicio del intervalo de observación(sg)? '); b=input('Fin del intervalo de observación(sg)? '); f=input('Frecuencia de la señal (Hz)? '); fs=input('Frecuencia de muestreo (Hz)?: '); fase=input('Fase de la señal (rad)? '); a=input('Amplitud de la señal (voltios)? '); % Generación de la señal t=A:1/fs:b; % vector instantes de muestreo x=a*sin(2*pi*f*t+fase); % vector con señal seno % Visualización de la señal plot(t,x); title('Señal en el dominio del tiempo.'); xlabel('Tiempo'); ylabel('Amplitud'); zoom;pause;close; Función suma de dos senos(sen_two.m) Esta función tiene una estructura igual que la anterior pero trabaja con 2 senos. Por tanto, sus parámetros de entrada son: amplitudes, frecuencias y fases para cada señal seno, frecuencia de muestreo e intervalo de visualización. La siguiente figura representa una señal suma de dos senos cuyos datos son: 1000 Hz de frecuencia de muestreo, 1 Hz para el primer seno y 2 Hz para el segundo, 0 radianes para el primero y pi radianes para el segundo, 1 y 2 voltios para el primer y el segundo seno respectivamente y el intervalo de visualización desde 1 hasta 3 segundos. 3 Señal en el dominio del tiempo. 2 Amplitud 1 0 -1 -2 El listado de esta función es: function []=sen_two() % Entrada de parámetros A=input('Inicio del intervalo de observación(sg)? '); b=input('Fin del intervalo de observación(sg)? '); fs=input('Frecuencia de muestreo (Hz)?: '); Curso 2007/8 3 Transmisión Digital Práctica 1 f1=input('Frecuencia de la 1ª sinusoide (Hz)? '); fase1=input('Fase de la 1ª sinusoide (rad)? '); a1=input('Amplitud de la 1ª sinusoide (voltios)? '); f2=input('Frecuencia de la 2ª sinusoide (Hz)? '); fase2=input('Fase de la 2ª sinusoide (rad)? '); a2=input('Amplitud de la 2ª sinusoide (voltios)? '); % Generación de la señal t=a:1/fs:b; x=a1*cos(2*pi*f1*t+fase1)+a2*sin(2*pi*f2*t+fase2); % Visualización de la señal plot(t,x); title('Señal en el dominio del tiempo.'); xlabel('Tiempo'); ylabel('Amplitud'); zoom;pause;close; Función cuadrada periódica(cuadro.m) Esta función tampoco tiene parámetros de entrada ni de salida ya que los datos se le introducen dentro de la función. Los datos de entrada son: frecuencia de muestreo, inicio y fin del intervalo de observación, amplitud del pulso, periodo y ciclo de trabajo. La forma de construir una señal cuadrada es la siguiente: se parte de una señal base que es un periodo donde se definen el ancho del pulso y la parte todo cero. A continuación se repite este periodo tantas veces como sea necesario para cubrir el intervalo de visualización redondeando por lo alto. Posteriormente se recorta lo que sobra. Un ejemplo de esta señal es: 1 SEÑAL EN EL DOMINIO DEL TIEMPO 0.9 0.8 Voltage 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 En este caso, el intervalo de observación va desde 1 hasta 4 segundos, el periodo es 0.6 y el ciclo de trabajo es 0.2. El listado de esta función es: function[]=cuadro() fs=input('Frecuencia de muestreo (Hz)? '); a=input('Inicio del intervalo de observación (sg)? '); b=input('Final del intervalo de observación (sg)? '); T=input('Periodo (sg)? '); B=input('Ciclo de trabajo (%)? '); Curso 2007/8 4 Transmisión Digital Práctica 1 while (B>1), B=input('Introduce un ciclo de trabajo menor.'); end; A=input('Amplitud (voltios)? '); % Creación de la función base n_unos=B*T*fs; n_ceros=B(1-B)*T*fs; base=[A*ones(1,n_unos) zeros(1,n_ceros)]; % Creación de la señal final t=a:1/fs/b; % Vector de instantes de muestreo LT=length(t); n_per=fix(LT/length(base)); % periodos completos de la base x=base; for i=1:n_per, x=[x base]; end x=x(1:LT); % Se afina longitud del vector % Visualización de la señal resultante plot(t,x); xlabel('Segundos'); ylabel('Voltage'); title('SEÑAL EN EL DOMINIO DEL TIEMPO');axis('auto'); zoom;pause;close; Función triangular periódica(triangu.m) Esta función tiene prácticamente la misma estructura que la anterior. Se crea una señal triangular base, se repite tantos periodos como sean necesarios, recortando si es necesario. Los datos de entrada son: amplitud, periodo, frecuencia de muestreo e inicio y fin del intervalo. Como ejemplo de esta señal, se tiene: 2 1.8 1.6 1.4 1.2 1 0.8 0.6 0.4 0.2 0 0 0.5 1 1.5 2 2.5 3 3.5 4 Para este caso, la amplitud es 2 voltios, el periodo de observación dura 4 segundos, fs=100 Hz y el periodo de la señal triangular es 1 segundo. El listado de esta función es: function[]=triangu() fs=input('Frecuencia de muestreo (Hz)? '); a=input('Inicio del intervalo (sg)? :'); Curso 2007/8 5 Transmisión Digital Práctica 1 b=input('Final del intervalo (sg)? '); To=input('Periodo de la señal (sg)? '); A=input('Amplitud de la señal (voltios)? '); % Creación de la función base base=[0:2*A/fs:A A-2*A/fs:-2*A/fs:0]; LX=length(base); % Creación de la señal final t=a:1/fs/b; % Vector de instantes de muestreo LT=length(t); n_per=fix(LT/length(base)); % periodos completos de la base x=base; for i=1:n_per, x=[x base]; end x=x(1:LT); % Se afina longitud del vector % Visualización de la señal final plot(t,y); xlabel('segundos'); ylabel('Amplitud'); zoom;pause;close; Función Aleatoria uniforme(alea_uni.m) y normal(alea_norm.m) Estas funciones poseen la misma estructura que las anteriores. Sus datos de entrada son: frecuencia de muestreo y valores de inicio y fin de intervalo. Para la generación de estas señales se aprovechan dos funciones de Matlab que generan matrices cuyos elementos responden a una función densidad de probabilidad uniforme (rand) o a una función densidad de probabilidad normal (randn). Cada una de ellas presenta las siguientes características: • f.d.p. uniforme(rand): los valores que devuelve responden a una distribución uniforme en el intervalo (0,1). Por tanto, para generar una señal con la media y varianza deseada habrá que sumar y/o multiplicar por los valores adecuados. • f.d.p. normal(randn): responde a una distribución normal de media 0 y varianza 1. Para obtener la varianza y media deseada habrá que operar con los valores correspondientes como para el caso anterior. El listado del fichero alea_uni.m donde se encuentra la función alea_uni es: function[x]=alea_uni() % PARAMETROS DE LA SEÑAL ALEATORIA fs=input('Frecuencia de muestreo (Hz): '); valorini=input('Valor inicial de observación: '); valorfin=input('Valor final de observación: '); while valorfin<=valorini, valorfin=input('Introduzca valor final mayor: '); end % CALCULO DE LA SEÑAL t=valorini:1/fs:valorfin; % vector de instantes de muestreo x=rand(1,length(t)); % PLOTEADO DE LA SEÑAL plot(t,x); title('SEÑAL ALEATORIA UNIFORME'); Curso 2007/8 6 Transmisión Digital Práctica 1 xlabel('Tiempo (segundos)'); ylabel('Amplitud (Voltios)'); zoom;pause;close; El listado de la función alea_nor es equivalente pero sustituyendo la llamada a la función de Matlab “rand” por “randn”. Ejercicio 1.- Modifique las funciones alea_uni y alea_nor para que admitan como nuevos parámetros la media y la varianza de la señal aleatoria que se desea generar. A continuación se muestra un ejemplo de señal con f.d.p. uniforme con media 5 y varianza la unidad, fs=100Hz e intervalo de observación desde 1 hasta 4 segundos: 7 6.5 6 5.5 5 4.5 4 3.5 3 1 1.5 2 2.5 3 3.5 4 Un ejemplo de señal con f.d.p. normal, media 2, varianza 1 y fs=100 Hz sería: 6 5 4 3 2 1 0 -1 Curso 2007/8 1 1.5 2 2.5 3 3.5 4 7 Transmisión Digital Práctica 1 Función valores(valores.m) Esta función se encarga de realizar todas las medidas definidas al principio a través de un menú. Como único parámetro de entrada tiene el vector correspondiente a la señal de la que se quiere obtener los siguientes parámetros: Æ Valor medio: Se calcula dividiendo la suma de los valores de cada muestra entre el número de muestras que hay. Es decir: v medio = N 1 N ∑ x(i) , i =1 siendo N la longitud del vector de señal x. ÆValor de pico: Es el valor máximo de la señal. Se calcula comparando todas las muestras del vector de señal y ver cual es la mayor. ÆEnergía de la señal en el intervalo: Es la suma de todas las componentes del vector de señal al cuadrado. Es decir: N Energía = ∑ x 2 (i ) i =1 ÆPotencia de la señal en el intervalo: indica la tasa con la que es liberada la energía. Es decir: Potencia = 1 N N ∑x 2 (i ) i =1 El listado del fichero es: function []=valores(x) while k1<6, k1=menu('PARÁMETROS DE LA SEÑAL','Valor medio','Valor de pico','Energia','Potencia','volver'); if k1==1 %VALOR MEDIO suma=0; for contador=1:length(t), suma=suma+x(contador); end valor_medio=suma/length(t) pause end if k1==2 %VALOR DE PICO valor_pico=max(abs(x)) pause end if k1==3 %ENERGIA DE LA SEÑAL energia=x*x’ pause end if k1==4 %POTENCIA MEDIA Px=energia/length(t) Curso 2007/8 8 Transmisión Digital Práctica 1 pause end end %Fin del while Ejercicio 2.- Obtenga una función que halle la Densidad Espectral de Potencia (D.E.P.) de una señal. Para construirla use la transformada rápida de Fourier (función “fft” de Matlab). Sus parámetros de entrada serán la señal y la frecuencia de muestreo usada para obtener la señal. Debe representar el resultado obtenido, apareciendo en el eje de abcisas la frecuencia en Hz y en de ordenadas la potencia en watios. Compruebe para las funciones vistas en los apartados anteriores que los resultados obtenidos coinciden con los teóricos. Por ejemplo, para una señal seno su D.E.P. serán dos deltas colocadas en la frecuencia de la señal con valor Ac2/4 donde Ac es la amplitud de la señal. Función de Autocorrelación(autocor.m) Esta función, como su nombre indica, se encarga de calcular la función de autocorrelación de una señal. El único parámetros de entrada es el vector que representa la señal a la que se le calcula la autocorrelación. Dentro de la función se pide un segundo parámetro que es el máximo desplazamiento para el que se va a calcular la autocorrelación. No hay parámetros de salida. La autocorrelación se calcula desde cero hasta el máximo desplazamiento introducido por el teclado. La expresión que usa para calcular la función de autocorrelación es: R(τ ) = 1 N −τ N −1−τ ∑ x ( n) x ( n + τ ) n=0 El listado de esta función es: function []=autocor(x) % INTRODUCCIÓN DE PARÁMEROS tau=input('Número máximo de desplazamientos? '); while tau<0, tau=input('El número de desplazamientos debe ser mayor que cero: '); end % CÁLCULO DE LA AUTOCORRELACIÓN if (tau>length(x)) % Limito el valor máximo de tau tau=length(x); end auto=x*x’; LE=length(x); for i=1:tau, aux=x(k+1:LE)*x(1:LE-k); auto=[aux auto aux]; end % PLOTEADO DE LA SEÑAL RESULTANTE eje_tiempos=-tau:tau; plot(eje_tiempos,auto); title('Autocorrelacion de la señal'); ylabel('Potencia (W)'); xlabel('desplazamiento (muestras)'); zoom;pause;close; Curso 2007/8 9