📄 allian.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 + -