PRÁCTICA 1: ESPECTROS DE SEÑALES POP Tecn. Electrónicas y Comun. SISTEMAS DE COMUNICACIONES DIGITALES Práctica 1. Espectros de señales 1.1. Objetivos Aprender a utilizar el MATLAB para determinar el espectro de cualquier tipo de forma de onda. 1.2. La transformada discreta de Fourier (DFT) Teniendo en cuenta las posibilidades ofrecidas por las computadoras personales actuales o la disponibilidad de circuitos integrados para el procesamiento digital de señales, el espectro de una señal puede aproximarse fácilmente mediante la denominada transformada discreta de Fourier (DFT): N −1 X (n) = ∑ x(k )e − j ( 2π / N ) nk (1) k =0 donde n = 0, 1, … , N – 1. De igual forma, se define la transformada discreta de Fourier inversa (IDFT) como: x(k ) = 1 N N −1 ∑ X ( n)e j ( 2π / N ) nk (2) n =0 donde k = 0, 1, … , N – 1. Obsérvese que ni el tiempo ni la frecuencia aparecen explícitamente en las expresiones anteriores y ambas se limitan a una serie de operaciones ejecutables por una computadora. El programa MALTAB tiene implementadas dos funciones que permiten determinar tanto la DFT como la IDFT mediante el uso de algoritmos FFT (transformada rápida de Fourier). Las funciones en MATLAB encargadas de ello, respectivamente, son las siguientes: X = fft(x) y x = ifft(X) En las funciones anteriores x y X son vectores de N elementos cada uno, el primero con las muestras temporales y el segundo con los resultados de la DFT. La DFT puede utilizarse para aproximar el espectro de una forma de onda w(t), teniendo en cuenta que: WT ( f ) f =n / T ≈ ∆tX (n) (3) donde WT(t) es el espectro de la versión aventanada entre 0 y T segundos de w(t). 1/8 PRÁCTICA 1: ESPECTROS DE SEÑALES POP Tecn. Electrónicas y Comun. SISTEMAS DE COMUNICACIONES DIGITALES 1.3. Realización práctica 1.3.1. Espectro de un pulso rectangular El espectro de un pulso rectangular de T0 segundos de duración, w(t) = Π(t/T0), puede determinarse analíticamente de la siguiente manera: sen (ωT0 / 2) e − jωT0 / 2 − e jωT0 / 2 = T0 = T0 sinc(πT0 f ) −T0 / 2 − jω ωT0 / 2 Del resultado anterior se desprende que los cruces por cero de la función sinc(x) se producen para πT0f = ±nπ ⇒ f = ±n/T0. W( f ) = ∫ T0 / 2 e − jωt dt = 1. Utilizar el MATLAB para determinar una aproximación al espectro del pulso rectangular. A continuación mostramos un posible código de ejemplo: % Espectro de un pulso rectangular M=7; % Definimos el tamaño de la FFT N=2^M; % Número de puntos de la FFT n=0:1:N-1; T0=1; % Tiempo en alta T=10; % Tiempo total dt=T/N; t=n*dt; % Crea la forma de onda con pulso hasta tiempo=T0 w=zeros(1,length(t)); for i=1:length(w) if t(i)<T0 w(i)=1; end end % Calcula la DFT W=dt*fft(w); f=n/T; pos=find(f>=4/T0); if ~isempty(pos) & (pos(1) <= N/2) pos=pos(1); % Calcula la posición del 4º nulo else pos=floor(length(f)/2); end subplot(3,1,1) plot(t,w); title('Forma de onda en el tiempo') xlabel('Tiempo (s)') ylabel('w(t)') subplot(3,1,2) plot(f(1:pos),abs(W(1:pos))); title('ESPECTRO DE MAGNITUD HASTA 4o NULO') xlabel('Frecuencia (Hz)') ylabel('|W(f)|') subplot(3,1,3) plot(f(1:pos),(180/pi)*angle(W(1:pos))); grid title('ESPECTRO DE FASE HASTA 4o NULO') xlabel('Frecuencia (Hz)') ylabel('\theta(f) (grados)') 2/8 PRÁCTICA 1: ESPECTROS DE SEÑALES POP Tecn. Electrónicas y Comun. SISTEMAS DE COMUNICACIONES DIGITALES 2. En el código de ejemplo anterior se tomó M = 7, lo que da lugar a una FFT de 128 puntos. Igualmente, se calculó el espectro para un pulso de un segundo de duración, sobre una duración total de 10 segundos tomando muestras. El espectro de magnitud de un pulso rectangular es teóricamente infinito, aunque a partir del 5º nulo se puede considerar que sus valores son prácticamente despreciables. Teniendo en cuenta esto, y dado que el 5º nulo se da para f = 5/T0, habría que muestrear la señal a un ritmo suficientemente rápido de tal forma que fs ≥ 2B, donde B es el ancho de banda de la señal que se desea muestrear. Si tomamos B ≈ 5/T0, la frecuencia de muestreo debería ser fs ≥ 10/T0, es decir, requeriríamos aproximadamente 10 muestras del pulso. Comprobar qué ocurre si tomamos M = 6 o 5. ¿A qué se debe el resultado observado? 3. Asignar nuevamente a M un valor igual a 7. ¿Qué ocurre si ahora hacemos T0 = 2 ó 3, o mayor incluso? ¿Por qué? ¿Qué pasa para T0 = 10? 4. Comprobar qué ocurre si tomamos T0 = 2, y aumentamos M a 9 o 10. ¿A qué se debe esto? ¿Y si modificamos el valor de T a 40 segundos? 1.3.2. Espectro de una senoide Cuando una señal es periódica se tiene que su espectro viene dado por: ∞ ∑ c δ ( f − nf W( f ) = n = −∞ n 0 (4) ) donde cn son los coeficientes de la serie de Fourier compleja dados por: cn = 1 T0 ∫ T0 0 w(t )e − j 2πnf0t dt (5) donde T0 es el período de la señal y f0 = 1/T0. La expresión anterior puede reproducirse aproximadamente por una serie finita donde t = k∆t, dt = ∆t y ∆t = T0/N. En ese caso, se tiene que: cn ≈ 1 T0 N −1 ∑ w(k∆t )e − j ( 2π / N ) nk ∆t = k =0 1 N N −1 ∑ w(k )e k =0 − j ( 2π / N ) nk = 1 W (n) N (6) donde W(n) es la DFT para n = 0, 1, ... , N – 1. Por tanto, hay que modificar la ecuación anterior para que dé valores de cn con n negativo. Para n positivo se utiliza cn = 1 W (n), N 0 ≤ n < N /2 (7) y con n negativo se utiliza 3/8 PRÁCTICA 1: ESPECTROS DE SEÑALES cn = 1 W (n + N ), N POP Tecn. Electrónicas y Comun. SISTEMAS DE COMUNICACIONES DIGITALES −N /2≤n<0 (8) Supongamos, por ejemplo, que deseamos determinar el espectro de la señal senoidal dada por: w(t ) = 3sen (ω 0 t + 20º ) La expresión anterior se puede representar mediante exponenciales complejas: ⎛ − 3 j ( −20 ) ⎞ − jω0t ⎞ ⎛ 3 ⎟⎟e w(t ) = 3sen (ω0t + 20º ) = ⎜⎜ e j 20 ⎟⎟e jω0t + ⎜⎜ e ⎠ ⎝ 2j ⎠ ⎝2j Por tanto, se tiene que sus coeficientes de Fourier vienen dados por: ⎛ 3 ⎞ c1 = ⎜⎜ e j 20 ⎟⎟ = 1,5 ∠ − 70º ⎝2j ⎠ ⎛ − 3 j ( −20 ) ⎞ ⎟⎟ = 1,5 ∠ + 70º c−1 = ⎜⎜ e ⎝ 2j ⎠ Y el resto de cn son iguales a cero. 1. Utilizar el MATLAB para determinar una aproximación al espectro de la senoide anterior. A continuación mostramos un posible código de ejemplo: M=4; N=2^M; fo=10; wo=2*pi*fo; n=0:1:N-1; To=1/fo; dt=To/N; t=n*dt; % Crea la forma de onda de tiempo w=3*sin(wo*t+(20*pi/180)); % Calcula los puntos de datos FFT W=fft(w); % Calcula el espectro de la forma de onda periódica n1=-N/2:1:N/2-1; fn1=n1/To; fs=1/dt; cn=1/N*W; % Convierte muestras 0,1,2,3,...,N-1 en positivos y negativos cn=fftshift(cn); subplot(3,1,1) plot(t,w); title('Forma de onda en el tiempo') xlabel('Tiempo (s)') ylabel('w(t)') subplot(3,1,2) 4/8 PRÁCTICA 1: ESPECTROS DE SEÑALES POP Tecn. Electrónicas y Comun. SISTEMAS DE COMUNICACIONES DIGITALES stem(fn1,abs(cn)); title('ESPECTRO DE MAGNITUD') xlabel('Frecuencia (Hz)') ylabel('|W(f)|') subplot(3,1,3) stem(fn1,180/pi*angle(cn).*(abs(cn)>1e-5)); grid title('ESPECTRO DE FASE') xlabel('Frecuencia (Hz)') ylabel('\theta(f) (grados)') Obsérvese que la fase se ha hecho igual a cero para aquellos valores de |W(f)| iguales a cero, facilitando con ello la visualización de la misma. 2. ¿Qué ocurre si hacemos To = 2/fo? ¿Y si hacemos To = 1/(2fo)? Aumentar To unidad a unidad, comprobando qué ocurre. ¿Qué ocurre para To mayor que 8? 3. ¿Qué ocurre si aumentamos M para To fijo e igual a 1/fo? ¿Y si tomamos M = 7 y To = 5/fo, por ejemplo? 1.3.3. Densidad espectral de potencia de códigos de línea Sea una señal digital (o código de línea) dada por s (t ) = ∞ ∑ a f (t − nT ) n = −∞ n (9) s donde f(t) es la forma de onda del pulso del símbolo, y Ts es la duración del símbolo. La densidad espectral de potencia de una señal digital es F( f ) Ps ( f ) = Ts 2 ∞ ∑ R ( k )e j 2πkfTs (10) k = −∞ donde F(f) es la transformada de Fourier de la forma del pulso, f(t), y R(k) es la autocorrelación de los datos I R (k ) = ∑ (a n a n + k ) i Pi (11) i =1 donde an y an+k son los niveles de voltaje de los pulsos de los datos en las posiciones del símbolo n-ésimo y (n+k)-ésimo, respectivamente, y Pi es la probabilidad de tener el producto i-ésimo an·an+k. 1. Haciendo uso de las ecuaciones anteriores determinar la PSD de una señal digital polar. Un posible código MATLAB de ejemplo sería el que se muestra a continuación: M=7; % Definimos el tamaño de la FFT 5/8 PRÁCTICA 1: ESPECTROS DE SEÑALES POP Tecn. Electrónicas y Comun. SISTEMAS DE COMUNICACIONES DIGITALES N=2^M; % Número de puntos de la FFT n=0:1:N-1; Ts=1; % Tiempo de duración del pulso T=10; % Tiempo total dt=T/N; t=n*dt; % Crea la forma de onda con pulso hasta tiempo=Ts w=zeros(1,length(t)); for i=1:length(w) if t(i)<Ts w(i)=1; end end % Calcula la DFT del pulso W=dt*fft(w); f=n/T; % Obtiene una posible señal de datos datos=sign(rand(1,ceil(T/Ts))-0.5); s=zeros(1,length(t)); for i=1:length(s) s(i)=datos(floor(t(i)/Ts)+1); end subplot(2,1,1) plot(t,s); title('Forma de onda en el tiempo') xlabel('Tiempo (s)') ylabel('s(t)') A=2; axis([0 T -2*A 2*A]); % Calcula R(k) R=0.5*A*A+0.5*(-A)*(-A); % Calcula la PSD P=(abs(W).^2)*R/Ts; pos=find(f>=4/Ts); if ~isempty(pos) pos=pos(1); % Calcula la posición del 4º nulo else pos=floor(length(f)/2); end subplot(2,1,2) plot(f(1:pos),P(1:pos)); title('PSD de una señal digital polar') xlabel('Frecuencia (Hz)') ylabel('P_{polar}(f)') El método anterior permite determinar de manera exacta la PSD de la señal aleatoria, pero requiere una serie de cálculos teóricos para llevarlo a cabo. Una forma alternativa consiste en promediar las PSD “intermedias” obtenidas mediante cálculos de la DFT de distintos tramos consecutivos de la señal aleatoria. Supongamos que disponemos de M muestras de la señal aleatoria cuya PSD deseamos determinar. Si subdividimos la secuencia de M muestras en K segmentos de N muestras cada uno (cuya duración temporal es T segundos), para cada segmento podemos estimar su PSD como: Pw( i ) ( f ) ≈ 1 (i ) WT ( f ) T 2 f =n / T ≈ 1 2 ∆tX i (n) T 6/8 (12) PRÁCTICA 1: ESPECTROS DE SEÑALES POP Tecn. Electrónicas y Comun. SISTEMAS DE COMUNICACIONES DIGITALES dado que, por definición: Pw ( f ) ≡ lim T →∞ 1 2 WT ( f ) T (13) El superíndice i en la PSD dada por (12) se utiliza para indicar que se trata del cálculo obtenido a partir del segmento i-ésimo, para 0 ≤ i ≤ K – 1. Así, promediando entre las K PSD obtenidas, se llega a una estimación de la PSD: Pw ( f ) ≈ 1 K K −1 ∑ Pw(i ) ( f ) ≈ i =0 1 K 1 ∆t 2 2 tX ( n ) ∆ = ∑ i KT i =0 T K −1 K −1 ∑X i =0 i ( n) 2 (14) donde X i ( n) = ( i +1) N −1 ∑ x ( k )e − j ( 2π / N ) nk (15) k =iN 2. Haciendo uso del MATLAB, estimar la densidad espectral de potencia de una señal polar mediante la ecuación (14). Comparar el resultado con el obtenido teóricamente aplicando (10). Un posible código sería el siguiente: M=8; % Definimos el tamaño de la FFT N=2^M; % Número de puntos de la FFT n=0:1:N-1; Ts=1; % Tiempo de duración del pulso T=10; % Tiempo total K=10000; k=0:1:N*K-1; dt=T/N; t=n*dt; t1=k*dt; % Crea la forma de onda con pulso hasta tiempo=Ts w=zeros(1,length(t)); for i=1:length(w) if t(i)<Ts w(i)=1; end end % Calcula la DFT del pulso W=dt*fft(w); f=n/T; % Obtiene una posible señal de datos datos=sign(rand(1,ceil(K*T/Ts))-0.5); s=zeros(1,length(t1)); for i=1:length(s) s(i)=datos(floor(t1(i)/Ts)+1); end A=2; s=A*s; S=zeros(1,N); for j=1:K S=S+abs(fft(s((j-1)*N+1:j*N))).^2; end S=S*dt^2/(K*T); subplot(3,1,1) plot(t1,s); 7/8 PRÁCTICA 1: ESPECTROS DE SEÑALES POP Tecn. Electrónicas y Comun. SISTEMAS DE COMUNICACIONES DIGITALES title('Forma de onda en el tiempo') xlabel('Tiempo (s)') ylabel('s(t)') axis([0 5*T -2*A 2*A]); % Calcula R(k) R=0.5*A*A+0.5*(-A)*(-A); % Calcula la PSD P=(abs(W).^2)*R/Ts; pos=find(f>=4/Ts); if ~isempty(pos) pos=pos(1); % Calcula la posición del 4º nulo else pos=floor(length(f)/2); end subplot(3,1,2) plot(f(1:pos),P(1:pos)); title('PSD de una señal digital polar (teórica)') xlabel('Frecuencia (Hz)') ylabel('P_{polar}(f)') subplot(3,1,3) plot(f(1:pos),S(1:pos)); title('PSD de una señal digital polar (estimada)') xlabel('Frecuencia (Hz)') ylabel('P_{polar}(f)') 3. Con el procedimiento anterior dado por (14), intentar estimar el espectro de una señal Manchester. Obsérvese que esto se limita a redefinir la señal s(t) tal que: s=zeros(1,length(t1)); for i=1:length(s) dato= datos(floor(t1(i)/Ts)+1); ind=mod(t1(i),Ts); if ind<0.5 s(i)=dato; else s(i)=-dato; end end Nota: Para la señalización Manchester NRZ, R(k) coincide con el obtenido para la señalización polar NRZ, es decir: ⎧ A2 , k = 0 R (k ) = ⎨ k≠0 ⎩0, 8/8