 %%% 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')
Hada=Hadamard(M/B);
[S1,s]=generasenal(Nt,M,hiper);
C1=Hada(:,1);
I=eye(B);
c1=kron(I,C1); 
longitud=sqrt(length(c1));           %hago que el codigo tenga energia unidad
c1=c1/longitud;
[S2,s]=generasenal(Nt,M,hiper);
C2=Hada(:,2);
I=eye(B);
c2=kron(I,C2); 
longitud=sqrt(length(c2));           %hago que el codigo tenga energia unidad
c2=c2/longitud;
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
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);                    %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
             %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(S(1,:),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');
   