 %%% Este seria el sistema para OFDM-CDMA usando ZP en el caso mas simple
%%% es decir ttiendo un solo simbolo a la vez y usando codigos aleatorios
%parametros

Nt=2500;
L=16;
M=64;
P=L+M;
w=[0 2 4 6 8 10 12 14 16 18];
B=1;
hiper=0;

%ahora empezamos

Es=1;
K=length(w);

ejex1MMSE=zeros(1,9);
ejey1MMSE=zeros(1,9);
ejex2MMSE=zeros(1,9);
ejey2MMSE=zeros(1,9);
load('C:\Documents and Settings\Juan Pablo\Escritorio\pfdc\pfdc OFDM\PRUEBA\canales.mat')
[S1,s]=generasenal(Nt,M,hiper);
[S2,s]=generasenal(Nt,M,hiper);
[S3,s]=generasenal(Nt,M,hiper);
[S4,s]=generasenal(Nt,M,hiper);
[S5,s]=generasenal(Nt,M,hiper);
[S6,s]=generasenal(Nt,M,hiper);
[S7,s]=generasenal(Nt,M,hiper);
[S8,s]=generasenal(Nt,M,hiper);
c1=sign(randn(M,1));                         % genero el codigo
longitud=sqrt(length(c1));           %hago que el codigo tenga energia unidad
c1=c1/longitud;
c2=sign(randn(M,1));                         % genero el codigo
longitud=sqrt(length(c2));           %hago que el codigo tenga energia unidad
c2=c2/longitud;
c3=sign(randn(M,1));                         % genero el codigo
longitud=sqrt(length(c3));           %hago que el codigo tenga energia unidad
c3=c3/longitud;
c4=sign(randn(M,1));                         % genero el codigo
longitud=sqrt(length(c4));           %hago que el codigo tenga energia unidad
c4=c4/longitud;
c5=sign(randn(M,1));                         % genero el codigo
longitud=sqrt(length(c5));           %hago que el codigo tenga energia unidad
c5=c5/longitud;
c6=sign(randn(M,1));                         % genero el codigo
longitud=sqrt(length(c6));           %hago que el codigo tenga energia unidad
c6=c6/longitud;
c7=sign(randn(M,1));                         % genero el codigo
longitud=sqrt(length(c7));           %hago que el codigo tenga energia unidad
c7=c7/longitud;
c8=sign(randn(M,1));                         % genero el codigo
longitud=sqrt(length(c8));           %hago que el codigo tenga energia unidad
c8=c8/longitud;

for k=1:Nt
    SS1(:,k)=c1*S1(1,k);                %genero una matriz con los simbolos codificados que voy a ttir
end
for r=1:Nt
    SS2(:,r)=c2*S2(1,r);                %genero una matriz con los simbolos codificados que voy a ttir
end

for a=1:Nt
    SS3(:,a)=c3*S3(1,a);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for b=1:Nt
    SS4(:,b)=c4*S4(1,b);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for c=1:Nt
    SS5(:,c)=c5*S5(1,c);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for d=1:Nt
    SS6(:,d)=c6*S6(1,d);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for f=1:Nt
    SS7(:,f)=c7*S7(1,f);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for z=1:Nt
    SS8(:,z)=c8*S8(1,z);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
i=1;

F=matrizifft(L,M);
Fp=matrizifft(L,P);
T=matrizTzp(L,M);
for q=1:10
    h=canal(:,q)
    q
    H=matrizcanalzp(h,L,M);
    XX=H*T*F*(SS1+SS2+SS3+SS4+SS5+SS6+SS7+SS8);                    %señal que ttito
    for g=1:60
        for snr=0:5:40
            No=1/10^(snr/10);
            P=L+M;
            sigma=sqrt(No/2);          
            ni=randn(P,Nt);
            nq=randn(P,Nt);
            N=sigma.*(ni+i.*nq);
            %niOLA=randn(M,Nt);
            %nqOLA=randn(M,Nt);
            %NOLA=sigma.*(niOLA+i.*nqOLA);
            
            
            YY=XX+N;                        %señal que recibo
            
            
            
             %MMSE
             
             A=H*T*F;
                U=SS1;
                %R=A*U+N;
                R=YY;
                A1=A';
                Rrr=(R*R')/size(R,2);
                Rrrinv=pinv(Rrr);
                Gmmse=A1*Rrrinv;
                Uest=Gmmse*R;
                CC=c1'*Uest;
                ber=calculaber(S1(1,:),CC);
                ejexMMSE(i)=snr;
                ejeyMMSE(i)=ber;
            i=i+1;
           
        end
    
        
            ejex1MMSE=ejex1MMSE+ejexMMSE;
            ejey1MMSE=ejey1MMSE+ejeyMMSE;
            i=1;
    end

    ejex1MMSE=ejex1MMSE/60;
    ejey1MMSE=ejey1MMSE/60;
    ejex2MMSE=ejex2MMSE+ejex1MMSE;
    ejey2MMSE=ejey2MMSE+ejey1MMSE;
end

    ejex2MMSE=ejex2MMSE/10
    ejey2MMSE=ejey2MMSE/10
    semilogy(ejex2MMSE,ejey2MMSE,'bd-')  %en azul aleatorio 
    grid;
    xlabel('Es/No');
    ylabel('Ber');
    
    hold on
    
    
    
    
    
    
    
    Hada=Hadamard(M);
c1=Hada(:,1);                         % genero el codigo
longitud1=sqrt(length(c1));           %hago que el codigo tenga energia unidad
c1=c1/longitud1;

c2=Hada(:,2);                         % genero el codigo
longitud2=sqrt(length(c2));           %hago que el codigo tenga energia unidad
c2=c2/longitud2;

c3=Hada(:,3);                         % genero el codigo
longitud3=sqrt(length(c3));           %hago que el codigo tenga energia unidad
c3=c3/longitud3;

c4=Hada(:,4);                         % genero el codigo
longitud4=sqrt(length(c4));           %hago que el codigo tenga energia unidad
c4=c4/longitud4;

c5=Hada(:,5);                         % genero el codigo
longitud5=sqrt(length(c5));           %hago que el codigo tenga energia unidad
c5=c5/longitud5;

c6=Hada(:,6);                         % genero el codigo
longitud6=sqrt(length(c6));           %hago que el codigo tenga energia unidad
c6=c6/longitud6;

c7=Hada(:,7);                         % genero el codigo
longitud7=sqrt(length(c7));           %hago que el codigo tenga energia unidad
c7=c7/longitud7;

c8=Hada(:,8);                         % genero el codigo
longitud8=sqrt(length(c8));           %hago que el codigo tenga energia unidad
c8=c8/longitud8;
for k=1:Nt
    SS1(:,k)=c1*S1(1,k);                %genero una matriz con los simbolos codificados que voy a ttir
end
for r=1:Nt
    SS2(:,r)=c2*S2(1,r);                %genero una matriz con los simbolos codificados que voy a ttir
end
for a=1:Nt
    SS3(:,a)=c3*S3(1,a);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for b=1:Nt
    SS4(:,b)=c4*S4(1,b);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for c=1:Nt
    SS5(:,c)=c5*S5(1,c);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for d=1:Nt
    SS6(:,d)=c6*S6(1,d);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for f=1:Nt
    SS7(:,f)=c7*S7(1,f);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for z=1:Nt
    SS8(:,z)=c8*S8(1,z);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
    


for q=1:10
    h=canal(:,q)
    q
    H=matrizcanalzp(h,L,M);
    XX=H*T*F*(SS1+SS2+SS3+SS4+SS5+SS6+SS7+SS8);                    %señal que ttito
    for g=1:60
        for snr=0:5:40
            No=1/10^(snr/10);
            P=L+M;
            sigma=sqrt(No/2);          
            ni=randn(P,Nt);
            nq=randn(P,Nt);
            N=sigma.*(ni+i.*nq);
            %niOLA=randn(M,Nt);
            %nqOLA=randn(M,Nt);
            %NOLA=sigma.*(niOLA+i.*nqOLA);
            
            
            YY=XX+N;                        %señal que recibo
            
            
            
             %MMSE
             
             A=H*T*F;
                U=SS1;
                %R=A*U+N;
                R=YY;
                A1=A';
                Rrr=(R*R')/size(R,2);
                Rrrinv=pinv(Rrr);
                Gmmse=A1*Rrrinv;
                Uest=Gmmse*R;
                CC=c1'*Uest;
                ber=calculaber(S1(1,:),CC);
                ejexMMSE(i)=snr;
                ejeyMMSE(i)=ber;
            i=i+1;
           
        end
    
        
            ejex1MMSE=ejex1MMSE+ejexMMSE;
            ejey1MMSE=ejey1MMSE+ejeyMMSE;
            i=1;
    end

    ejex1MMSE=ejex1MMSE/60;
    ejey1MMSE=ejey1MMSE/60;
    ejex2MMSE=ejex2MMSE+ejex1MMSE;
    ejey2MMSE=ejey2MMSE+ejey1MMSE;
end

    ejex2MMSE=ejex2MMSE/10
    ejey2MMSE=ejey2MMSE/10
    semilogy(ejex2MMSE,ejey2MMSE,'r+-') %en rojo Hadamard
    grid;
    xlabel('Es/No');
    ylabel('Ber');
    
    