∑ ∑

Anuncio
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
Descargar