📄 sc_turbopic_mimo.m
字号:
clear
% Define the slot structure
Spread_factor = 8; % Spread factor
Subslot_number = 4; % 8 or 4 % Number of subslots
Symbol_number_subslot = 29; % 13 or 29 % Symbol number in a subslot
Symbol_number_slot = Subslot_number*Symbol_number_subslot; % Symbol number in a slot
Pilot_length = 16; % Length of pilot signal in chips
Gaurd_length = 8; % Length of gaurd time in chips
GaurdPilot_length = Gaurd_length+Pilot_length; % Total length of gaurd time and pilot signal in chips
SubslotData_length = Symbol_number_subslot*Spread_factor; % Length of data in a subslot in chips
Subslot_length = SubslotData_length+GaurdPilot_length; % Length of a subslot in chips
SlotData_length = Subslot_number*SubslotData_length; % Length of data in a slot in chips
Slot_length = Subslot_number*Subslot_length+GaurdPilot_length; % Length of a slot in chips
% Define the channel
TxAntenna_number = 1;
RxAntenna_number = 1; % Number of receive antennas
Path_number = 4; % Number of paths
Path_Gain = [0.8084 0.462 0.253 0.259]; % Profile of channel model
% delay = [0 18 36 54 72 90]*2; % Delays of paths
% Delay_spread = 10; % in us
Path_Gain = exp(-(0:1/(Path_number-1):1)*3*log(10));
Path_Gain = Path_Gain/sqrt(Path_Gain*Path_Gain');
% delay = round((0:1/(Path_number-1):1)*Delay_spread*1.28);
Fc = 3.2e9; % Carrier frequency
V = 100; % moving speed in km/h
Tc = 1/1.28e6; % Chip width
% Define pilot signal
org_sequence = [1 j 1 -1 1 1 -1 -j 1 -j 1 1 1 -1 -1 j];
%org_sequence = [ 1 1 1 1 (1-j)/sqrt(2) -1 (1+j)/sqrt(2) -j...
% j -1 -j 1 (1+j)/sqrt(2) 1 (1-j)/sqrt(2) -j...
% -1 1 -1 1 (-1+j)/sqrt(2) -1 (-1-j)/sqrt(2) -j...
% -j -1 j 1 (-1-j)/sqrt(2) 1 (-1+j)/sqrt(2) -j];
% 32 Points pilot
for n_Tx=0:TxAntenna_number-1
Pilot_sequence(n_Tx+1,:) = [org_sequence(Pilot_length-n_Tx*Path_number+1:Pilot_length) org_sequence(1:Pilot_length-n_Tx*Path_number)];
end
for m=0:Path_number-1
Pilot_matrix(m*TxAntenna_number+(1:TxAntenna_number),:) = [Pilot_sequence(:,Pilot_length-m+1:Pilot_length) Pilot_sequence(:,1:Pilot_length-m)];
end
Pilot_Energy_Factor = 1;
Gaurd_Pilot = [Pilot_sequence(:,Pilot_length-Gaurd_length+1:Pilot_length) Pilot_sequence]*sqrt(Pilot_Energy_Factor);
Pilot_matrix = Pilot_matrix/sqrt(Pilot_Energy_Factor);
% turbo code
poly_g1 = 7; % 1 0 1
poly_g2 = 5; % 1 1 1
MemLen = 2;
poly_g1 = 11; % 1 0 1 1
poly_g2 = 13; % 1 1 0 1
MemLen = 3;
puncture = 0; % puncture = 0,rate=1/2;puncture = 1,no puncture rate =1/3
nIter = 7;
CodeRate = 1/(2+puncture);
InputN = 1; OutputN = 2+puncture;
Code_Rate = InputN/OutputN;
Symbol_bitN = 4; % 2 for QPSK and 4 for 16QAM
nIterDD = 6; % Iterate times for detection
%msg_L=Symbol_bitN*SlotData_length/OutputN*InputN*Slot_number-InputN*tblen; % Number of message bits
Slot_number = 64;
Packet_Slot_number = 0.5;
Packet_number = Slot_number/Packet_Slot_number;
Packet_msg_L = TxAntenna_number*Symbol_bitN*InputN/OutputN*SlotData_length*Packet_Slot_number-MemLen;
Packet_code_L = TxAntenna_number*Symbol_bitN*SlotData_length*Packet_Slot_number;
Slot_code_L = TxAntenna_number*Symbol_bitN*SlotData_length;
[Inner_intl_table] = interleave(Packet_msg_L+MemLen, floor(sqrt((Packet_msg_L+MemLen)/2)));
[Outer_intl_table] = interleave(Packet_code_L*Packet_number,floor(sqrt((Packet_code_L*Packet_number)/2)))+1;
[Det_intl_table] = interleave(SubslotData_length, floor(sqrt((SubslotData_length)/2)))+1;
Poly_degree = 2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%% Main Loop %%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SNR1 =6; SNR2 = 11;
All_SNR = SNR1:0.5:SNR2;
% Bit error rate
ber=zeros(nIterDD,length(All_SNR));
format long
Phase = 2*pi*rand(1,2);
Time_Begin = 0;
for index_SNR=1:length(All_SNR)
errors = zeros(1,nIterDD);
for k=1:200 % k is the index of Frame
SNR = All_SNR(index_SNR)
k
%%%%%%%%%%%%%%%%%%%%%
%%% Transmiter %%%
%%%%%%%%%%%%%%%%%%%%%
% Transmiter: Generate transmitted bit stream
msg = randint(Packet_number,Packet_msg_L,2); % Random data
% msg=[msg zeros(Packet_number,3)];
% Transmiter:Turbo encode and interleave
for np=1:Packet_number
code_p(np,:) = TuEnc(msg(np,:), puncture, Inner_intl_table, poly_g1, poly_g2);
end
code = reshape(code_p,1,Packet_code_L*Packet_number);
code = code(Outer_intl_table);
% Transmiter:Generate single-carrier baseband signals
s = [];
for sn=0:Slot_number-1
[x] = Modulation(code(sn*Slot_code_L+(1:Slot_code_L)), 4);
Index_x = 0;
for kk=1:Subslot_number
tmp = [Gaurd_Pilot vec2mat(x(Index_x+(1:TxAntenna_number*SubslotData_length)),SubslotData_length)];
s = [s tmp];
Index_x = Index_x+TxAntenna_number*SubslotData_length;
end
s = [s Gaurd_Pilot];
end
% Channel
Signal_length = Slot_number*Slot_length+Path_number-1; % Length of baseband signal
% Channel: The transmitted signal passes through multipath channel
for p=0:Path_number-1
ss(TxAntenna_number*p+(1:TxAntenna_number),:) = [zeros(TxAntenna_number,p) s zeros(TxAntenna_number,Path_number-1-p)];
end
CH_Data = MultiPathRayC(Fc,V,Tc,Signal_length,Time_Begin,reshape(repmat(Path_Gain,TxAntenna_number,RxAntenna_number),1,Path_number*TxAntenna_number*RxAntenna_number),Phase);
Time_Begin = Time_Begin+Signal_length;
for na=0:RxAntenna_number-1
Sm(na+1,:) = sum(ss.*CH_Data(na*Path_number*TxAntenna_number+(1:Path_number*TxAntenna_number),:));
end
% Channel: Add Gauss noise
Rm = awgn(Sm,SNR+10*log10(Slot_code_L*Code_Rate/Slot_length/TxAntenna_number)+10*log10(TxAntenna_number));%,'measured'); % SNR=Eb/N0
SNR_Es_N0 = 10*log10(sum(sum(abs(Sm).^2))/sum(sum(abs(Rm-Sm).^2)))
Noise_variance = sum(sum(abs(Rm-Sm).^2))/length(Sm)/RxAntenna_number
%%%%%%%%%%%%%%%%%%%%%
%%% Receiver %%%
%%%%%%%%%%%%%%%%%%%%%
for sn=0:Slot_number-1
R = Rm(:,sn*Slot_length+(1:Slot_length));
% Receiver: Channel estimation
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Index_R = Gaurd_length; Fades = zeros(RxAntenna_number,TxAntenna_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;
First_EstFades(:,Index_Fades+(1:TxAntenna_number*Path_number)) = Tmp_Fades;
Index_R = Index_R+Subslot_length;
Index_Fades = Index_Fades+TxAntenna_number*Path_number;
end
for p=1:TxAntenna_number*Path_number
tmp_Fades = First_EstFades(:,p:TxAntenna_number*Path_number:end);
for na=1:RxAntenna_number
[Coefficients,Structure] = polyfit(0:Subslot_number,tmp_Fades(na,:),Poly_degree);
% [tmp_FadesP(na,:),delta] = polyval(Coefficients,0:0.5:Subslot_number,Structure);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -