📄 gmc_16qam_turbo.m
字号:
[x] = Modulation(code(nc,sn*code_SlotL+(1:code_SlotL)), 4);
% Tmp_s=reshape((Walsh*reshape(x,Code_channel,Symbol_number_slot))',1,SlotData_length).*PN; % spread spectrum modulation and interleving
Tmp_s=x;
Index_s=0; % Insert pilot and gaurd
for kk=1:Subslot_number
tmp=Tmp_s(Index_s+(1:SubslotData_length));
tmp=[Gaurd_Pilot tmp];
s=[s tmp];
Index_s=Index_s+SubslotData_length;
end
s=[s Gaurd_Pilot];
sb(nc,:)=s;
end
% Transmiter:Combine subcarrier baseband signals into multicarrier baseband signal
st=mc_sfb(sb,Slot_length,prototype_filter,Carrier_number,SubCarrier_first,SubCarrier_last,Sampling_factor,Filter_length);
% Channel
Signal_length=Sampling_factor*(Slot_length-1)+Filter_length+delay(Path_number_mc); % Length of multicarrier baseband signal
for p=1:Path_number_mc
ss(p,:)=[zeros(1,delay(p)) st zeros(1,delay(Path_number_mc)-delay(p))];
end
for na=1:Antenna_number
CH_Data = MultiCHannel(Path_Gain,Fc,V,Tc,Signal_length,Time_Begin,Phase(na,:));
Sm(na,:)=sum(ss.*CH_Data); % The transmitted signal is passed through multipath channel
end
Time_Begin = Time_Begin+Signal_length;
% Add Gauss noise
Rm=awgn(Sm,SNR);%-10*log10(Spread_factor/Code_channel)-10*log10(Sampling_factor/Carrier_number_used),'measured');
Noise_variance=sum(sum(abs(Rm-Sm).^2))/length(Sm)/Antenna_number;
% Receiver
% Receiver:Separate the received mulicarrier signal into subcarrier signals
for na=1:Antenna_number
% rs(na,:,:)=mc_afb(Rm(na,:),Slot_length,prototype_filter,Carrier_number,SubCarrier_first,SubCarrier_last,Sampling_factor,Oversampling_factor,Filter_length);
tmp=mc_afb(Rm(na,:),Slot_length,prototype_filter,Carrier_number,SubCarrier_first,SubCarrier_last,Sampling_factor,Oversampling_factor,Filter_length);
rs(na,:,:)=SC_sync(tmp,Slot_length,Subslot_length,Subslot_number,Gaurd_Pilot1,Interp_factor,rcflt,Path_number);
end
% pause
% Receiver: Process each subcarrier separately
for nc=1:Carrier_number_used
R=reshape(rs(:,nc,:),Antenna_number,length(rs(:,nc,:)));
% 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
%tmp_FadesP(na,:)=interp(tmp_Fades(na,:),2);
[Coefficients,Structure]=polyfit(0:Subslot_number,tmp_Fades(na,:),3);
[tmp_FadesP(na,:),delta]=polyval(Coefficients,0:0.5:Subslot_number,Structure);
%tmp_FadesP(na,:)=spline(0:Subslot_number,tmp_Fades(na,:),0:Subslot_number);
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
Tmp_Nv=sum(Nv)/(Subslot_number+1);
% Tmn_Nv=0;
% 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(nc,(sn*Subslot_number+kk)*Subslot_length+(1:Subslot_length))=sum(cyc_cov(RM,Tmp_Fades),1);
h_half(nc,(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
end
for nc=1:Carrier_number_used
for sn=0:Slot_number-1
for kk=0:Subslot_number-1
Tmp_RMC=RMC(nc,(sn*Subslot_number+kk)*Subslot_length+(1:Subslot_length));
Tmp_h_half=h_half(nc,(sn*Subslot_number+kk)*Path_number+(1:Path_number));
R_DFT=fft(Tmp_RMC);
H_DFT=fft([Tmp_h_half zeros(1,Subslot_length-2*Path_number+1) conj(Tmp_h_half(end:-1:2))]);
X_DFT=R_DFT./((H_DFT+Noise_variance));
Tmp_R_EQ=ifft(X_DFT);
% R_EQ(kk*SubslotData_length+(1:SubslotData_length))= Tmp_R_EQ(Gaurd_length+(1:SubslotData_length));
rou = abs(mean((H_DFT)./(H_DFT+Noise_variance)));
[Dem_signal(nc,(sn*Subslot_number+kk)*SubslotData_length*4+(1:SubslotData_length*4))] = Soft_Demod(Tmp_R_EQ(Gaurd_length+(1:SubslotData_length)), rou, 1, zeros(4,SubslotData_length), SubslotData_length);
%[Dem_signal(nc,(sn*Subslot_number+kk)*SubslotData_length*4+(1:SubslotData_length*4))] = SoftDeMod(Tmp_R_EQ(Gaurd_length+(1:SubslotData_length)), 4);
% Tmp_R_EQ(1:Gaurd_length)=Gaurd_Pilot(Pilot_length+(1:Gaurd_length));
% Tmp_R_EQ(Gaurd_length+SubslotData_length+(1:Pilot_length))=Gaurd_Pilot(1:Pilot_length);
end
%[Dem_signal(nc,sn*code_SlotL+(1:code_SlotL))] = -SoftDeMod(R_EQ, 4);
end
end
Dem_signal(:,int_table)=Dem_signal;
Dem_signal_p=vec2mat(reshape(Dem_signal',1,code_L*packet_N),packet_N)';
for np=1:packet_N
[decoded, LLR_all] = TuDecLogMapNew(Dem_signal_p(np,:), puncture, nIter, int_table0, 1, 1, poly_g1, poly_g2);
%[decoded] = TuDecSova(Dem_signal_p(np,:), puncture, nIter, int_table0, 1, 1, poly_g1, poly_g2);
errors=errors+sum(abs(decoded(1:msg_L)-msg(np,1:msg_L)));
end
errors
ber(log2(Antenna_number)+1,SNR-SNR1+1)=errors/k/msg_L/packet_N;
ber(log2(Antenna_number)+1,1:SNR-SNR1+1)
if (errors>300 & k>10)
break;
end
end
if ber(log2(Antenna_number)+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 + -