⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 receive.m

📁 L. Dong and A. P. Petropulu, 揗ultichannel ALLIANCES: A Cross-layer Cooperative Scheme for Wireless
💻 M
字号:
% This code is to resolve CTEm (i.e., the collision occured in one subchannel in slot n)

function [succ, raysucc]=receive(packet,y,HA, HH,para)

% parameters
Relay = para.Relay;
t1 = para.t1;
active = para.subactive; % active users
G = para.G;   % number of subchannels
SNR = para.SNR;
ML = para.ML;
subch= para.sss;
ADD_NOISE = para.ADD_NOISE;

% Simulation parameters
J= 32; % total number of users
NF=64;  % total number of carriers

Ng=48/G; % the number of carriers of each subchannel

num_active=length(active);

subch2 = para.subch2+(1:num_active-1);

for qq=1:length(subch2)
    timeoffset(qq) = fix(subch2(qq)/G)+1;
end

subch2=mod(subch2,G)+1;  % subchannels used in relay transmissions

NP=8;
Pref=NP;    % the length of CP


L=3;    % the length of FIR channel

NN=1000*1;   % block size

N=NN*Ng;

N1 = N - Ng*J; %number of data symbols per packet (QPSK)

ID = hadamard(J)+j*hadamard(J); 

fec = 0.02; % packets received with BER higher than fec is considered lost/corrupted


for mm=1:num_active-1
    relay = mod(Relay+mm,J)+1;
    
    tt = find(active == relay);
    if (~isempty(tt))  % source relay
        pack=reshape(packet(:,tt),Ng,size(packet,1)/Ng);
        x=zeros(NF,NN);
        x(8+((subch2(mm)-1)*Ng+1:subch2(mm)*Ng),:)=pack;
        % IFFT
        X=ifft(x,NF)*sqrt(NF); 
        
        % .........add cyclic prefix
        X1=[X(NF-(Pref-1):NF,:); X];
        
        X1=reshape(X1,1,prod(size(X1)));
        
        %.....convolution with the FIR channel - channel changes between blocks.....
        Y=filter(HA(relay,:,t1+timeoffset(mm)),1,X1); 
        randn('state',sum(100*clock));
        if ADD_NOISE
            noise = 10^(-SNR/20)*(randn(size(Y,1),size(Y,2))+j*randn(size(Y,1),size(Y,2)));
            Y = Y+noise;
        end
        
        YY=reshape(Y,NF+NP,floor(length(Y)/(NF+NP)));
        Y=YY(Pref+1:NF+NP,:);
        Y=fft(Y,NF)/sqrt(NF); %...................matrix of received blocks (columns).........
        
        y1=Y(8+((subch2(mm)-1)*Ng+1:subch2(mm)*Ng),:);
        
    else % non-source relay
        % assume the relays are able to change the subchannel to forward
        % their signals
        
        for iii=1:num_active
            
            x=zeros(NF,NN);
            pack=reshape(packet(:,iii),Ng,size(packet,1)/Ng);
            x(8+((subch-1)*Ng+1:subch*Ng),:)=pack;
            
            % IFFT
            X=ifft(x,NF)*sqrt(NF); 
            % .........add cyclic prefix
            X1=[X(NF-(Pref-1):NF,:); X];
            
            X1=reshape(X1,1,prod(size(X1)));
            
            Y=filter(HH(active(iii),relay,:,t1),1,X1);
            Y_save(iii,:)=Y;
        end
        Y1=sum(Y_save,1);   % received signal at relay node in slot n
        
         if ADD_NOISE
            noise = 10^(-SNR/20)*(randn(size(Y1,1),size(Y1,2))+j*randn(size(Y1,1),size(Y1,2)));
            Y1 = Y1 + noise;
        end
        
        % change the subchannel from subch to subch2(mm)
        YY=reshape(Y1,NF+NP,floor(length(Y1)/(NF+NP)));
        Y=YY(Pref+1:NF+NP,:);   % discard prefix
        Y=fft(Y,NF)/sqrt(NF); % DFT
        
        x1=zeros(NF,NN);
        for sss=1:Ng
            if ML % ML equalizer is very robust even under low SNR and high collision order
                % keeping the relay power same as power of source nodes is alright
                coeff(sss)=sqrt(NN*2)/norm(Y(8+(subch-1)*Ng+sss,:));
            else  % ZF equalizer is sensitive to noise
                % if K is very large, if the relay power is still same as the source nodes,
                % the effective power will be too small...  power boost shall be used
                coeff(sss) = 1;
            end   
            x1(8+(subch2(mm)-1)*Ng+sss,:)=coeff(sss)*Y(8+(subch-1)*Ng+sss,:);
        end
        
        % IFFT
        X1=ifft(x1,NF)*sqrt(NF); 
        % .........add cyclic prefix
        Y1=[X1(NF-(Pref-1):NF,:); X1];
        
        Y1=reshape(Y1,1,prod(size(Y1)));    
        
        
        clear Y_save
        %  forward signals to the BS
        Y=filter(HA(relay,:,t1+timeoffset(mm)),1,Y1); 
        if ADD_NOISE
            noise = 10^(-SNR/20)*(randn(size(Y,1),size(Y,2))+j*randn(size(Y,1),size(Y,2)));
            Y = Y+noise;
        end
        
        YY=reshape(Y,NF+NP,floor(length(Y)/(NF+NP)));
        Y=YY(Pref+1:NF+NP,:);
        Y=fft(Y,NF)/sqrt(NF); %...................matrix of received blocks (columns).........
        
        y1=Y(8+((subch2(mm)-1)*Ng+1:subch2(mm)*Ng),:);
        
    end
    
    y = [y; y1];
end
rev_pack=zeros(size(packet,1)-J*Ng,num_active);

for ii=1:Ng
    
    yy=y(ii:Ng:end,1:J);
    A=ID(:,active')'* yy.'/J/2;
    if ML==0
        % ZF decoder
        tt = y(ii:Ng:end,J+1:end).'*A'*inv(A*A');
        rev = sign(real(tt)) + j*sign(imag(tt));
    else
        rev = decodpac(y(ii:Ng:end,J+1:end).', A);     % ML decoder
    end
    rev_pack(ii:Ng:end,:)=rev;
end

succ=0;
raysucc=zeros(1,J);
for kk=1:num_active
    bbb=mapper2(packet(J*Ng+1:end,kk),1);
    sss=mapper2(rev_pack(:,kk),1);
    look=bbb-sss;
    IBER=find(abs(look)>0);
    BIT_ERROR_RATE=length(IBER)/N;
    if (BIT_ERROR_RATE <= fec)
        succ = succ + 1;        % number of sucessfully recovered packets
        raysucc(active(kk))=1;
    end
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -