📄 sc_turbodd_pic.m
字号:
for sn=0:Slot_number-1
R=Rm(:,sn*Slot_length+(1:Slot_length));
% Receiver: Channel estimation
Index_R=Gaurd_length;Fades=zeros(Antenna_number,Path_number*(Subslot_number+1));Index_Fades=0;
for kk=1:Subslot_number+1
Tmp_RP=R(:,Index_R+(1:Pilot_length));
Tmp_Fades=Tmp_RP*Pilot_matrix'/Pilot_length;
Fades(:,Index_Fades+(1:Path_number))=Tmp_Fades;
Index_R=Index_R+Subslot_length;
Index_Fades=Index_Fades+Path_number;
end
for p=1:Path_number
tmp_Fades=Fades(:,p:Path_number:end);
for na=1:Antenna_number
[Coefficients,Structure]=polyfit(0:Subslot_number,tmp_Fades(na,:),3);
[tmp_FadesP(na,:),delta]=polyval(Coefficients,0:0.5:Subslot_number,Structure);
end
Fades(:,p:Path_number:length(Fades))=tmp_FadesP(:,1:2:end);
FadesI(:,p:Path_number:length(Fades)-Path_number)=tmp_FadesP(:,2:2:end);
end
Index_R=Gaurd_length;Index_Fades=0;
for kk=1:Subslot_number+1
Tmp_Fades=Fades(:,Index_Fades+(1:Path_number));
Tmp_Noise = R(:,Index_R+(1:Pilot_length))-Tmp_Fades(:,1:Path_number)*Pilot_matrix;
Nv(kk)=sum(sum(abs(Tmp_Noise.*Tmp_Noise)))/Pilot_length/Antenna_number; % Estimate of noise variance
Index_R=Index_R+Subslot_length;
Index_Fades=Index_Fades+Path_number;
end
Noise_var(sn+1)=sum(Nv)/(Subslot_number+1);
% Receiver: Equalization in DFT domain
Index_R=Pilot_length; Index_Fades=0;R_EQ=[];
for kk=0:Subslot_number-1
Tmp_Fades=(FadesI(:,Index_Fades+(1:Path_number)));
RM=R(:,Index_R+(1:Subslot_length));
RMC((sn*Subslot_number+kk)*Subslot_length+(1:Subslot_length))=sum(cyc_cov(RM,Tmp_Fades),1);
h_half((sn*Subslot_number+kk)*Path_number+(1:Path_number))=sum(self_cov(Tmp_Fades),1);
Index_Fades=Index_Fades+Path_number;
Index_R=Index_R+Subslot_length;
end
end
for n=1:nIterDD
for sn=0:Slot_number-1
Noise_variance=Noise_var(sn+1);
for kk=0:Subslot_number-1
Tmp_RMC=RMC((sn*Subslot_number+kk)*Subslot_length+(1:Subslot_length));
Tmp_h_half=h_half((sn*Subslot_number+kk)*Path_number+(1:Path_number));
Tmp_h=[conj(Tmp_h_half(end:-1:2)) 0 Tmp_h_half(2:end)];
if n==1
x_rake=Tmp_RMC(Gaurd_length+(1:SubslotData_length));
Tmp_R_EQ=x_rake.*conj(PN(kk*SubslotData_length+(1:SubslotData_length)));
rou=Tmp_h_half(1);
x_sigma=ones(1,SubslotData_length)*(Noise_variance*rou+abs(Tmp_h*Tmp_h'));
for nn=1:4
[x_symbol,x_variance] =Symbol_Decision(Tmp_R_EQ,rou,x_sigma);
x_mean=[Gaurd_Pilot(Pilot_length+(Gaurd_length-Path_number+2:Gaurd_length)) x_symbol.*PN(kk*SubslotData_length+(1:SubslotData_length)) Gaurd_Pilot(1:Pilot_length)];
x_variance=[zeros(1,Path_number-1) x_variance zeros(1,Pilot_length)];
[x_intf, x_sigma]=Intf_Sigma(x_mean,x_variance,Tmp_h,SubslotData_length);
Tmp_R_EQ=(x_rake-x_intf).*conj(PN(kk*SubslotData_length+(1:SubslotData_length)));
x_sigma=Noise_variance*rou+x_sigma;
end
LLR_D = Soft_Demod(Tmp_R_EQ, rou,x_sigma ,zeros(4,SubslotData_length), SubslotData_length);
% LLR_D=zeros(1,4*SubslotData_length);
% for nn=1:4
%
% LLR_P=reshape(LLR_D,4,SubslotData_length);
% [x_mean0, x_variance]=Mean_Var(LLR_P);
% x_mean=[Gaurd_Pilot(Pilot_length+(Gaurd_length-Path_number+2:Gaurd_length)) x_mean0 Gaurd_Pilot(1:Pilot_length)];
% x_variance=[zeros(1,Path_number-1) x_variance zeros(1,Pilot_length)];
% rou =Tmp_h_half(1);
% [x_intf, x_sigma]=Intf_Sigma(x_mean,x_variance,Tmp_h,SubslotData_length);
% x_rake=Tmp_RMC(Gaurd_length+(1:SubslotData_length));
% Tmp_R_EQ=x_rake-x_intf;
% x_sigma=Noise_variance*rou+x_sigma;
% LLR_D = Soft_Demod(Tmp_R_EQ, rou,x_sigma ,LLR_P, SubslotData_length);
% end
else
LLR_P=reshape(LLR_DI((sn*Subslot_number+kk)*SubslotData_length*4+(1:SubslotData_length*4)),4,SubslotData_length);
[x_mean0, x_variance]=Mean_Var(LLR_P);
x_mean=[Gaurd_Pilot(Pilot_length+(Gaurd_length-Path_number+2:Gaurd_length)) x_mean0.*PN(kk*SubslotData_length+(1:SubslotData_length)) Gaurd_Pilot(1:Pilot_length)];
x_variance=[zeros(1,Path_number-1) x_variance zeros(1,Pilot_length)];
rou =Tmp_h_half(1);
[x_intf, x_sigma]=Intf_Sigma(x_mean,x_variance,Tmp_h,SubslotData_length);
x_rake=Tmp_RMC(Gaurd_length+(1:SubslotData_length));
% x_rec=x_intf+rou*x_mean0;
% alpha=abs((x_rake*x_rec')/(x_rake*x_rake'));
alpha=1;
Tmp_R_EQ=(x_rake-alpha*x_intf).*conj(PN(kk*SubslotData_length+(1:SubslotData_length)));
x_sigma=Noise_variance*rou+alpha^2*x_sigma;
LLR_D = Soft_Demod(Tmp_R_EQ, rou,x_sigma,LLR_P, SubslotData_length);
end
[Dem_signal((sn*Subslot_number+kk)*SubslotData_length*4+(1:SubslotData_length*4))]=LLR_D;
end
end
Dem_signal(Outer_intl_table)=Dem_signal;
Dem_signal_p=vec2mat(Dem_signal,Packet_number)';
for np=1:Packet_number
[decoded, LLR_all(np,:)] = TuDecLogMapNew(Dem_signal_p(np,:), puncture, nIter, Inner_intl_table, 1, 1, poly_g1, poly_g2);
errors(n)=errors(n)+sum(abs(decoded(1:Packet_msg_L)-msg(np,1:Packet_msg_L)));
end
LLR_DI=reshape(LLR_all,1,Packet_code_L*Packet_number);
LLR_DI=LLR_DI(Outer_intl_table);
end
errors
ber(:,SNR-SNR1+1)=errors'/k/Packet_msg_L/Packet_number
if (errors(nIterDD)>300 & k>3)
break;
end
end
if ber(1,SNR-SNR1+1)<1.0*10^(-6)
break;
end
end
save ber_16QAM200v_1 ber
end
semilogy(SNR1:SNR2,ber(:,1:SNR2-SNR1+1)')
grid
xlabel('SNR of Received Signal(in dB)')
ylabel('Bit Error Rate')
pause(0.2)
save ber_16QAM200v_1 ber
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -