Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PROYECTO
OFDM
ESTUDIANTES:
Edwin Quispe Ortiz
Rodrigo Uruchi
ASIGNATURA:
Procesamiento Digital De Seales
DOCENTE:
Sylvain Damien Lesage
PROYECTO OFDM
1. INTRODUCCIN
OFDM es un metodo de codificacion digital de datos en frecuencias con
multiples portadoras. OFDM ha sido desarrollado en un ambiente popular
para comunicacin digital de banda ancha, utilizado en aplicaciones como
transmision de television y audio digital, acceso a internet DSL (por su sigla
en ingls Digital Suscriber Line), redes inalambricas y redes de
comunicaciones moviles 4G.
OFDM (Multiplexacion por divisin de frecuencia ortogonal) es un tipo de
multiplexacion que consiste en enviar un conjunto de seales portadoras en
diferentes frecuencias, muy cercanas, donde cada una transporta
informacin la cual puede ser modulada en QPSK o QAM. La caracterstica
principal de este tipo de multiplexacion es que las portadoras que tiene son
ortogonales entre si en frecuencia, lo cual esta definido por la siguiente
frmula:
T 0 +t
f 1 ( t )f 2 ( t ) dt=0
T0
Donde:
f1
y
f2
Cuantificacion
Asignacion de Bits
d. Reflejo/IFFT y des-reflejo/FFT
Asi como la conversin Serie/Paralelo, el reflejo es sencillo en su
principio y su implementacin, y es esencial para DMT. Necesitamos
que se transmita una seal con valores reales, pero despus del
exactamente
g. Ecualizacion y aproximacin
En la ecualizacin, los bloques de coeficientes espectrales recibidos
(por ejemplo: despus de quitar el prefico cclico y realizar la FFT)
estn ajustados para compensar la respuesta en frecuencia del canal
(no se puede quitar el ruido aditivo). Debido al prefijo cclico, cada
bloque ha sufrido convolucion cclica con la respuesta al impulso del
canal. Si la respuesta en frecuencia no tiene ceros y es conocida por
el receptor, es posible quitar perfectamente el efecto de filtrado del
canal. Ya que el canal multiplico puntualmente los bloques por su
respuesta en frecuencia, todo lo que se necesita hacer es multiplicar
los bloques por: uno sobre la respuesta en frecuencia (1/resp. En
frec).
6. RESULTADO Y ANALISIS
A continuacin se muestra el cdigo implementado, es importante nombrar
que se el programa principal es el archivo run.m, este archivo es el que se
compila, sin embargo a su vez este programa llama a las funciones: a2d,
approximate, channel, constbuilder, constmap, cyclicpad, d2a, deconstmap,
decyclicpad, demirror, filterchannel, matlaberr, mirror, parallel2series,
series2parallel; cuyos codigos tambin sern mostrados.
a. Run.m
Es el archivo principal que llama a las funciones que emulan los
bloques de un sistema de transmisin DMT ADSL, el cdigo es el
siguiente.
B= 4; % # de bits para la cuantificacion
C= 16; % # de puntos de la constelacion, resultado de 2^B
S= 256; % # Subportadoras
L=16; % longitud del canal
noise=.0001; % amplitud del ruido
sN=0; % # picos en el dominio del tiempo
N=L; % Longitud del prefijo ciclico
F=128; % longitud de los bloques (1/2 # de sub portadoras)
M=constbuilder(C); % Matriz de Constelacion
s=abs(randn(L,1));
s=s./sum(s);
% canal aleatorio
load handel
y=y(1:S); %seal de entrada, se tomaran las primeras 256 muestras
x=a2d(y,B); %conversor analogico a digital incluyendo cuantificacion
z=constmap(x,M); %Constelacion para el mapeo de la seal digital x
a=series2parallel(z,F); %conversor de serie a paralelo
b=mirror(a);
c=ifft(b);
d=cyclicpad(c,N);
e=matlaberr(parallel2series(d));
aN = randn(length(conv(e,s)),1)*noise;
f=channel(e,s,aN,sN);
f=f(1:length(e));
g=series2parallel(f,2*F+N);
h=decyclicpad(g,N);%
k=fft(h);
m=filterchannel(k,s);
n=demirror(m);
n(1,:)=a(1,:);
o=parallel2series(n);
p=approximate(o,M);
q=deconstmap(p,M);
r=d2a(q,B);
figure(1)
stem(y/max(abs(y)));title('SEAL DE ENTRADA');
xlabel('Muestras'); ylabel('Amplitud');
axis([1 S -1 1]);
grid on
figure(2)
stem(d2a(x,B));
title('ENTRADA CUANTIFICADA');
xlabel('Muestras'); ylabel('Amplitud');
axis([1 S -1 1]);
grid on
%
figure(3)
plot(real(M(:,length(M(1,:)))),imag(M(:,length(M(1,:)))),'.b');
grid on
title('MAPA DE CONSTELACION');
xlabel('Real'); ylabel('Imaginario');
axis([-1.5 1.5 -1.5 1.5]);
%
figure(4)
Q=length(d(:,1));
stem(1:Q-N,matlaberr(d(1:Q-N,1)),'b');ylabel('Prefijo ciclico aadido');
title('PREFIJO CICLICO AADIDO');
xlabel('Muestras'); ylabel('Amplitud');
hold
stem(1:N,matlaberr(d(1:N,1)),'r');
stem(Q-N+1:Q,matlaberr(d((Q-N+1):Q,1)),'r');
hold;
%
%
figure(5)
stem(e);
title('ENTRADA CON ISI - ICI ');
xlabel('Muestras'); ylabel('Amplitud');
Q=2*(2*F+N);
stem(1:Q/2,e(1:Q/2));
hold
stem(Q/2+1:Q,e(Q/2+1:Q),'g');
stem(Q/2-L/2+1/2:Q/2+L/2,s,'r');
hold;
%
figure(7)
plot(real(o),imag(o),'*r');
hold;
plot(real(M(:,length(M(1,:)))),imag(M(:,length(M(1,:)))),'.b');
title('PUNTOS DE CONSTELACION RECIBIDOS');
xlabel('Real'); ylabel('Imaginario');
hold;
grid;
axis([-1.5 1.5 -1.5 1.5]);
figure(6)
stem(fftshift(abs(fft(s,256))));
b. A2d.m
Esta funcin es la conversora de datos analgicos a digitales.
function y = a2d(x,b)
% a2d(x) convierte a tiempo discreto, una seal analogica a
%
un flujo de bits (b bits por muestra)
% x seal original
% b numero de bits por muestra
N = length(x);
qinterval = 2*max(abs(x))/((2^b)-1);
if b<=1;
for i=1:N
if x(i)<=0
bits(i)=0;
else
bits(i)=1;
end
end
else
q = quant(x-min(x),qinterval);
bits=zeros(N*b,1);
for k=0:((2^b)-1)
u=dec2bin(k);
for i=1:length(u)
w(i)=str2num(u(i));
end
v=[zeros((b-length(w)),1)',w];
p(k+1,:)=v;
end
for i=0:N-1
for k=0:((2^b)-1)
if q(i+1)==k*qinterval
bits(b*i+1:b*i+b)=p(k+1,:);
break
else
end
end
end
end
y=bits;
c. Constmap.m
Es la funcin que realiza el mapeo en la constelacin
function y = constmap(x,M)
% constmap(x) mapa de constelacion para el flujo de bits (2
bits/simbolo)
%
x flujo de bits
m=length(M(1,:))-1;
N = length(x);
newN=m*round(N/m);
x=x(1:newN);
for i=1:m
newvector(:,i)=x(i:m:newN-(m-i));
end
alpha=zeros(newN/m,1);
for i=1:newN/m
for k=1:length(M(:,1))
if (newvector(i,:)==M(k,1:m))
alpha(i)=M(k,m+1);
break
else
end
end
end
y=alpha;
d. Series2parallel.m
Es la funcin que convierte el flujo de bits de serie a paralelo
function y = series2parallel(x,N)
L=length(x);
q=floor(L/N);
newvec=zeros(N,q);
for i=1:q
newvec(1:N,i)=x((1+(i-1)*N):i*N);
end
y=newvec;
e. Mirror.m
Es la funcin que se encarga del reflejo de el flujo de bits.
function y = mirror(X)
R=length(X(1,:));
L=length(X(:,1));
if isreal(X(1,:))
X=X;
else
X(1,:)=zeros(1,R);
end
newvec=zeros(2*L,R);
newvec(1:L,:)=X;
newvec(L+1,:)=X(1,:);
newvec(L+2:2*L,:)=conj(flipud(X(2:L,:)));
y=newvec;
f. Cyclicpad.m
Es la funcin encargada del prefijo cclico
function y=cyclicpad(X,L)
N=length(X(:,1));
Y=[X(N-L+1:N,:);X];
y=Y;
g. Matlaberr.m
Es la funcin encargada de aadir error al flujo de bits.
function y = matlaberr(X)
R=length(X(1,:));
L=length(X(:,1));
for m=1:R
for n=1:L
if abs(real(X(n,m)))<.000001
a=0;
else
end
a=real(X(n,m));
end
if abs(imag(X(n,m)))<.000001
b=0;
else
b=imag(X(n,m));
end
X(n,m)=a+j*b;
end
y=X;
h. Channel.m
Es el cdigo encargado del canal de transmisin
function y=channel(x,h,aN,sN)
a=conv(x,h);
N=length(a);
w=a+aN;
m=max(abs(x));
for k=1:sN
w(round(abs(randn(1,1))*(N-1))+1)=m;
end
y=w;
i. Decyclicpad.m
Es la funcin encargada de quitar el prefijo cclico
function y=decyclicpad(X,L)
N=length(X(:,1));
Y=X(L+1:N,:);
y=Y;
j. Filterchannel.m
Es la funcin encargada de emular el filtro pasa bajo a causa del
canal.
function y=filterchannel(X,h)
N=length(X(:,1));
W=length(X(1,:));
H=fft(h,N);
invH=1./H;
for k=1:W
y(:,k)=invH.*X(:,k);
end
y;
k. Demirror.m
Es la funcin encargada de quitar el reflejo de la informacin en el
smbolo.
function y = demirror(X)
R=length(X(1,:));
L=length(X(:,1));
if rem(L,2)==1
y=[ones(1,R);X(1:L/2,:)];
else
y=X(1:L/2,:);
end
l. Approximate.m
Es la funcin encargada de la aproximacin de puntos a la
constelacin.
function y = approximate(x,M)
% approximate(x,M) aproxima un simbolo con ruido x con smbolos validos
% en M
%
x vector de simbolo con ruido
%
M matriz que representa el mapa de constelacion
%M=[0 0 1;0 1 j;1 0 -1;1 1 -j];
W=length(M(1,:));
L=length(M(:,1));
N = length(x);
a = M(:,W);
alpha=zeros(N,1);
for i=1:N
mindist=100;
symnum=0;
for k=1:L
if abs(a(k)-x(i))<=abs(mindist)
mindist=abs(a(k)-x(i));
alpha(i)=a(k);
else
end
end
end
y=alpha;
m. Deconstmap.m
Se encarga de quitar el mapeo de bits del smbolo.
function y = deconstmap(x,M)
% deconstmap(x) mapa de constelacion en el simbolo (2 bits/symbol)
%
x - bitstream
n. D2a.m
Funcin encargada de la conversin digital a analgica de la seal.
function y = d2a(x,b)
% d2a(x) convierte el flujo de bits (b bits por muestra) de tiempo
discreto,
%
a una seal analogica
% x flujo de bits
% b numero de bits por muestra
x=x';
N = length(x);
L=floor(N/b);
qinterval = 2/(2^b-1);
if b<=1;
for i=1:N
if x(i)==0
sig(i)=-1;
else
sig(i)=1;
end
end
else
sig=zeros(L,1);
for k=0:((2^b)-1)
u=dec2bin(k);
w=zeros(1,length(u)); % conversion a binario
for i=1:length(u)
w(i)=str2num(u(i));
end
v=[zeros((b-length(w)),1)',w];
p(k+1,:)=v; % p es un vector de binaries para un interval de #s
end
if b~=4
for i=0:L-1
% marca el valor de q con etiqueta #
for k=0:((2^b)-1) % inserta el valor binario correspondiente
dentro del flujo de datos
if (x((1+(i*b)):(b*i+b))== p(k+1,:))
sig(i+1)=qinterval*k-1;
break
else
end
end
end
else
for i=0:L-1
%%for k=1:b
if x(1+i*b)==0
if x(2+i*b)==0
if x(3+i*b)==0
if x(4+i*b)==0
sig(i+1) =
else
sig(i+1) =
else
if x(4+i*b)==0
sig(i+1) =
else
sig(i+1) =
else
if x(3+i*b)==0
if x(4+i*b)==0
sig(i+1) =
else
sig(i+1) =
else
if x(4+i*b)==0
sig(i+1) =
else
sig(i+1) =
else
if x(2+i*b)==0
if x(3+i*b)==0
if x(4+i*b)==0
sig(i+1) =
else
sig(i+1) =
else
if x(4+i*b)==0
sig(i+1) =
else
sig(i+1) =
else
if x(3+i*b)==0
if x(4+i*b)==0
sig(i+1) =
else
-1;
qinterval*1-1;end
qinterval*2-1;
qinterval*3-1;end; end
qinterval*4-1;
qinterval*5-1;end
qinterval*6-1;
qinterval*7-1;end; end; end
qinterval*8-1;
qinterval*9-1;end
qinterval*10-1;
qinterval*11-1;end; end
qinterval*12-1;
end
end
sig(i+1) = qinterval*13-1;end
else
if x(4+i*b)==0
sig(i+1) = qinterval*14-1;
else
sig(i+1) = qinterval*15-1;end; end; end; end
end
y=sig;
o. Constbuilder
Funcin encargada de la construccin de la constelacin.
function y = constbuilder(N)
b=ceil(log2(N));
p=zeros(N,b);
for k=0:(N-1)
u=dec2bin(k);
w=zeros(1,length(u));
for i=1:length(u)
w(i)=str2num(u(i));
end
v=[zeros((b-length(w)),1)',w];
p(k+1,:)=v;
end
n=0:N-1;
if N<=16
a=exp(j*2*pi/N.*n');
M=[p,a];
else
a=exp(j*2*pi/16.*(0:15)');
if N<=24
b=0.5*exp(j*2*pi/(N-17).*(0:N-17)');
M=[p,[a;b]];
else
b=0.66*exp(j*2*pi/8.*(0:8)'+j*pi/16);
if N<=32
c=0.33*exp(j*2*pi/(N-26).*(0:N-26)');
M=[p,[a;b;c]];
else
a=exp(j*2*pi/N.*n');
M=[p,a];
end
end
end
if N==16
a=[.354+.354*j;sqrt(2)/2;sqrt(2)/2*j;-.354+.354*j;sqrt(2)/2*j;.354-.354*j;-.354-.354*j;-sqrt(2)/2];
b=exp(j*2*pi/8.*(0:7)');
M=[p,[a;b]];
else
end
y=matlaberr(M);