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