 %%% 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=8;
hiper=0;

%ahora empezamos

Es=1;
K=length(w);
ejex1FAST=zeros(1,9);
ejey1FAST=zeros(1,9);
ejex2FAST=zeros(1,9);
ejey2FAST=zeros(1,9);

load('C:\Documents and Settings\Juan Pablo\Escritorio\pfdc\pfdc OFDM\PRUEBA\canales.mat')
[S1,s]=generasenal(Nt,M,hiper);
C1=sign(randn(M/B,1));                 % genero el codigo
I=eye(B);
c1=kron(I,C1);                         % genero el codigo
longitud1=sqrt(length(c1));           %hago que el codigo tenga energia unidad
c1=c1/longitud1;
[S2,s]=generasenal(Nt,M,hiper);
C2=sign(randn(M/B,1));                 % genero el codigo
I=eye(B);
c2=kron(I,C2);                         % genero el codigo
longitud2=sqrt(length(c2));           %hago que el codigo tenga energia unidad
c2=c2/longitud2;
[S3,s]=generasenal(Nt,M,hiper);
C3=sign(randn(M/B,1));                 % genero el codigo
I=eye(B);
c3=kron(I,C3);                         % genero el codigo
longitud3=sqrt(length(c3));           %hago que el codigo tenga energia unidad
c3=c3/longitud3;
[S4,s]=generasenal(Nt,M,hiper);
C4=sign(randn(M/B,1));                 % genero el codigo
I=eye(B);
c4=kron(I,C4);                         % genero el codigo
longitud4=sqrt(length(c4));           %hago que el codigo tenga energia unidad
c4=c4/longitud4;
[S5,s]=generasenal(Nt,M,hiper);
C5=sign(randn(M/B,1));                 % genero el codigo
I=eye(B);
c5=kron(I,C5);                         % genero el codigo
longitud5=sqrt(length(c5));           %hago que el codigo tenga energia unidad
c5=c5/longitud5;
[S6,s]=generasenal(Nt,M,hiper);
C6=sign(randn(M/B,1));                 % genero el codigo
I=eye(B);
c6=kron(I,C6);                         % genero el codigo
longitud6=sqrt(length(c6));           %hago que el codigo tenga energia unidad
c6=c6/longitud6;
[S7,s]=generasenal(Nt,M,hiper);
C7=sign(randn(M/B,1));                 % genero el codigo
I=eye(B);
c7=kron(I,C7);                         % genero el codigo
longitud7=sqrt(length(c7));           %hago que el codigo tenga energia unidad
c7=c7/longitud7;
[S8,s]=generasenal(Nt,M,hiper);
C8=sign(randn(M/B,1));                 % genero el codigo
I=eye(B);
c8=kron(I,C8);                         % 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:B,k);                %genero una matriz con los simbolos codificados que voy a ttir
end
for r=1:Nt
    SS2(:,r)=c2*S2(1:B,r);                %genero una matriz con los simbolos codificados que voy a ttir
end

for a=1:Nt
    SS3(:,a)=c3*S3(1:B,a);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for b=1:Nt
    SS4(:,b)=c4*S4(1:B,b);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for c=1:Nt
    SS5(:,c)=c5*S5(1:B,c);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for d=1:Nt
    SS6(:,d)=c6*S6(1:B,d);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for f=1:Nt
    SS7(:,f)=c7*S7(1:B,f);
                    %genero una matriz con los simbolos codificados que voy a ttir
end
for z=1:Nt
    SS8(:,z)=c8*S8(1:B,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);
Ttido=S1(1:B,:);
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
            %ZF
            ZZ=pinv(H*T*F)*YY;
            CC=c1'*ZZ;                       %señal demodulada
            ber=calculaber(Ttido,CC);
            ejexZF(i)=snr;
            ejeyZF(i)=ber;
            %FAST
                %FAST
                DELTA=Fp'*H*Fp;
                V=Fp'*T*F;
                U=SS;
                s=V*U;
                Y=Fp'*YY;
                %Y=DELTA*s+N;
                Rss=(s*s')/size(s,2);
                DELTA1=DELTA';
                Ryy=(Y*Y')/size(Y,2);
                Ryyinv=pinv(Ryy);
                Gmmse=DELTA1*inv(DELTA*DELTA1);
                Sest=Gmmse*Y;
                Uest=pinv(V)*Sest;
                CC=c'*Uest;
                ber=calculaber(Ttido,CC);
                ejexFAST(i)=snr;
                ejeyFAST(i)=ber;
            
            i=i+1;
           
        end
    
            ejex1FAST=ejex1FAST+ejexFAST;
            ejey1FAST=ejey1FAST+ejeyFAST;
          
            i=1;
    end
    ejex1FAST=ejex1FAST/60;
    ejey1FAST=ejey1FAST/60;
    ejex2FAST=ejex2FAST+ejex1FAST;
    ejey2FAST=ejey2FAST+ejey1FAST;
end
 ejex2FAST=ejex2FAST/10
    ejey2FAST=ejey2FAST/10
    semilogy(ejex2FAST,ejey2FAST,'gh-')
    grid;
    xlabel('Es/No');
    ylabel('Ber');
    
    