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

📄 allian.m

📁 L. Dong and A. P. Petropulu, 揗ultichannel ALLIANCES: A Cross-layer Cooperative Scheme for Wireless
💻 M
字号:
% use ALLIANCES to resolve collisions

% t1: time index
% HH, HA: channel
% active: active users
% subch: subchannels used by active users
% ch: collision order at each subchannel
% G: number of subchannels
% Relay: counter of relay 
% succ: number of successful packets

function [succ, Raysucc]=allian(t1,HH,HA,active,subch,ch,G,Relay,ML)

% Simulation parameters
J = 32; % total number of users

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

ADD_NOISE=1;    % whether to add noise
SNR=20;         % signal to noise ratio
%ML=1;           % ML decoder (ML=1) or ZF decoder (ML=0)

NN=1000;   % block size

N=NN*Ng;    % total symbol number of one packet in one slot

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

ID = hadamard(J)+j*hadamard(J);      % every user has an ID orthogonal to others'

threshold=0.1; %threshold for active user detection

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

L=3; % length of channel taps
Pref=8;     % length of CP

Raysucc=zeros(1,J);

num_active=length(active);
 succ = 0;
 err=0;
 Err_Det=0;

 % transmitter + channel
 for iii=1:num_active
    [trs_bit,Y]=transmit(active(iii),HA(active(iii),:,t1),subch(iii),G);
    Y_save(iii,:)=Y;    % received symbols
    packet(:,iii)=trs_bit;  % transmitted packets
end
Y=sum(Y_save,1);    % total received symbols at the BS

% add noise at the receiver
if ADD_NOISE
    randn('state',sum(100*clock));
    noise = sqrt(1/(10^(SNR/10)))*(randn(size(Y,1),size(Y,2))+j*randn(size(Y,1),size(Y,2)));
    Y = Y+noise;
end

%%%%%%%%%% BS side %%%%%%%%%%%%%%%%%%%%

YY=reshape(Y,NF+Pref,floor(length(Y)/(NF+Pref)));
Y=YY(Pref+1:NF+Pref,:);   % discard prefix
Y=fft(Y,NF)/sqrt(NF); % DFT

%....collision/ active user detection........
y=Y(:,1:J);
alpha1=ID'* y.'/J/2;

subch2=1;
for sss=1:G % resolve collisions for each subchannel
    alpha=alpha1(:,8+((sss-1)*Ng+1:sss*Ng));

    DetUser= find(mean(abs(alpha),2)'>threshold);

    if size(DetUser,2)==1
        DetUser=DetUser';
    end

    num_DetUser=length(DetUser);
    
    indx=find(subch==sss);
    subactive=active(indx); % active users in subchannel sss
    num_subactive=length(subactive); % number of active users in subchannel sss
    
    if size(subactive,1) ~=1
        subactive = subactive';
    end
    
    if ~isempty(subactive)
        if ( num_DetUser == num_subactive ) & (DetUser == sort(subactive))


            if num_DetUser>1
                 
                % parameters
                para.Relay =  Relay;
                para.subch2=subch2; % subchannels for relay transmissions
                para.t1 = t1;
                para.subactive = subactive; % active users
                para.G=G;   % number of subchannels
                para.SNR=SNR;
                para.ML=ML;
                para.sss=sss;
                para.ADD_NOISE=ADD_NOISE;
                
                % resolve collsions and calculate the sucessful packets
                [succ1 raysucc]=receive(packet(:,indx),Y(8+((sss-1)*Ng+1:sss*Ng),:),HA, HH,para);
                
                Relay = mod(Relay + num_subactive - 1,J)+1;
                subch2=mod(subch2+num_DetUser-1,G)+1;
                
%                 succ1=length(subactive);
%                 raysucc=zeros(1,J);
%                 raysucc(subactive)=1;
                Raysucc=Raysucc+raysucc;
                err=err+(num_DetUser-succ1);
                succ=succ+succ1;

            else

                raysucc=zeros(1,J);
                A = alpha1(DetUser,8+((sss-1)*Ng+1:sss*Ng));
                yy=Y(8+((sss-1)*Ng+1:sss*Ng),J+1:end);
                A=diag(A);
                if ML==0
                    % Linear Decoding (Zero Forcing)
                    tt = yy.'*A'*inv(A*A');
                    rev = sign(real(tt)) + j*sign(imag(tt));
                else
                    rev = decodpac(yy.', A);   % ML decoder
                end
                rev=reshape(rev.',size(rev,1)*size(rev,2),1);
                bbb=mapper2(packet(J*Ng+1:end,indx),1);
                sss=mapper2(rev,1);
                look=bbb-sss;
                IBER=find(abs(look)>0);
                BIT_ERROR_RATE=length(IBER)/N;
                if (BIT_ERROR_RATE <= fec)
                    succ = succ + 1;
                    raysucc(active(indx))=1;
                    Raysucc=Raysucc+raysucc;
                else
                    err=err+1;
                end
            end
        else
            Err_Det=Err_Det+1;
        end %if active user detection is correct
    end     % if not empty
end     % end for sss


⌨️ 快捷键说明

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