📄 main1003.m~
字号:
end
L_e = L_all - 2*rec_s(1,1:2:2*L_total) - L_a; % extrinsic info.
% Decoder two
L_a = L_e(alpha); % a priori info.
if dec_alg == 0
L_all = logmapo(rec_s(2,:), g, L_a, 2); % complete info.
else
L_all = sova0(rec_s(2,:), g, L_a, 2); % complete info.
end
L_e = L_all - 2*rec_s(2,1:2:2*L_total) - L_a; % extrinsic info.
% Estimate the info. bits
xhat(alpha) = (sign(L_all)+1)/2;
% Number of bit errors in current iteration 本次迭代中错误比特数
err(iter) = length(find(xhat(1:L_total-m)~=x));
end
errs(1,1:niter) = errs(1,1:niter) + err(1:niter);
error_bit(:,it) = errs(1,niter);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'RCPC'
source_bit = randint(1,112);
[source_crc,coded_bit] = generate_coded_data(source_bit);%add CRC and encode, 1*512 after encode
transmit_symbol = coded_bit;
%puncture set puncture period P=8,punctured to rate=1/3
transmit_symbol_N1 = zeros(1,384);
transmit_symbol_N1(1:3:end) = transmit_symbol(1:4:end);
transmit_symbol_N1(2:3:end) = transmit_symbol(2:4:end);
transmit_symbol_N1(3:3:end) = transmit_symbol(3:4:end);
N1_symbol = transmit_symbol_N1;
%the remained N2 bits
transmit_symbol_N2 = transmit_symbol(4:4:end);
N2_symbol = transmit_symbol_N2;
signal(1).nr_of_bits = length(N1_symbol);
signal.modulation_type = 'BPSK'; % 'BPSK', 'QPSK'
calculate_signal_parameter(N1_symbol); %BPSK modulation
if (use_direct_link == 1)
[channel(1), rx] = add_channel_effect(channel(1), rx,signal(1).symbol_sequence,1/4);
rx = rx_correct_phaseshift(rx, channel(1).attenuation.phi); %校正相位
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%decode the N1 symbols
rx.signal2analyse = real(rx.signal2analyse);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
insert_decode_data = zeros(1,512);
insert_decode_data(1:4:end) = rx.signal2analyse(1:3:end);
insert_decode_data(2:4:end) = rx.signal2analyse(2:3:end);
insert_decode_data(3:4:end) = rx.signal2analyse(3:3:end);
insert_decode_data(4:4:end) = 0; %删除比特补0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
decode_symbol_N1 =data_decode(insert_decode_data);
error_count1 = sum(abs(source_crc - decode_symbol_N1));%1*128
%error_bit(:,it) = error_count1;
%中继端接收源端的信号,译码,通过CRC校验位检查是否译码正确
% Relay decode the N1 bits
if (use_relay == 1)
[channel(2), relay.rx] = add_channel_effect(channel(2),relay.rx, signal(1).symbol_sequence,1/4);
relay.rx =rx_correct_phaseshift(relay.rx,channel(2).attenuation.phi);
relay.rx.signal2analyse = real(relay.rx.signal2analyse);
relay_insert_decode_data = zeros(1,512);
relay_insert_decode_data(1:4:end) = relay.rx.signal2analyse(1:3:end);
relay_insert_decode_data(2:4:end) = relay.rx.signal2analyse(2:3:end);
relay_insert_decode_data(3:4:end) = relay.rx.signal2analyse(3:3:end);
relay_insert_decode_data(4:4:end) = 0; %删除比特补0
relay_decode_symbol_N1 = data_decode(relay_insert_decode_data);%译码
% The number of relay decode error bits
error_count2= sum(abs(source_crc - relay_decode_symbol_N1));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Check the CRC
relay_received_bit =relay_decode_symbol_N1;
relay_code = coded_data(relay_received_bit);
%relay_code_data =relay_code;
relay_N2_symbol=relay_code(4:4:end);%1*128
relay_received_source = relay_received_bit(1:112);%1*112,the source bits R received
relay_received_crc = relay_received_bit(113:128);%1*16,the CRC bits R received
relay_crc_bit = CRC_16(relay_received_source); %译码比特生成CRC,并与接收的CRC位比较
if ((relay_crc_bit - relay_received_crc) == 0)
% Relay transmit the N2 bits,译码正确则由中继转发原删除的比特
relay.signal2send =2* relay_N2_symbol-1; %BPSK调制
%relay to destination
[channel(3), rx] = add_channel_effect(channel(3), rx,relay.signal2send,1/4);
rx = rx_correct_phaseshift(rx,channel(3).attenuation.phi);
else
%source transmit the remained bit,译码失败,源端发送删除的比特
signal(1).nr_of_bits = length(N2_symbol);
calculate_signal_parameter(N2_symbol);
[channel(1), rx] = add_channel_effect(channel(1), rx,signal(1).symbol_sequence,1/4);
rx = rx_correct_phaseshift(rx, channel(1).attenuation.phi);
end
%rx.signal2analyse = real(rx.signal2analyse);
insert_decode_data(4:4:end) = real(rx.signal2analyse);
decode_N_bit = data_decode(insert_decode_data);
% The number of rx decode error bits with N2 bits
error_count3 = sum(abs(source_crc - decode_N_bit));
error_bit(:,it) = error_count3;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'DF'
o_source_bits =randint(1,128);
transmit_symbol = coded_data(o_source_bits);%encode the bit
signal(1).nr_of_bits = length(transmit_symbol);
signal.modulation_type = 'BPSK'; % 'BPSK', 'QPSK'
calculate_signal_parameter(transmit_symbol);
receive_value =[];
if (use_direct_link == 1)
[channel(1), rx] = add_channel_effect(channel(1), rx,signal.symbol_sequence,1/4);
mrc_rx = rx.received_signal; % mrc combine
rx = rx_correct_phaseshift(rx, channel(1).attenuation.phi);
receive_value =[receive_value;rx.signal2analyse];
receive_code = real(receive_value);
rece_coded_bit =(sign(receive_code)+1)/2;
decoded_bit =data_decode(receive_code);
%error_bit1(:,it) = sum(abs(transmit_symbol - rece_coded_bit)); %direct transmit error bit
error_bit1(:,it) = sum(abs(o_source_bits - decoded_bit));
end
if (use_relay == 1)
[channel(2), relay.rx] = add_channel_effect(channel(2),relay.rx, signal.symbol_sequence,1/4);
relay.rx =rx_correct_phaseshift(relay.rx,channel(2).attenuation.phi);
relay_decode =data_decode(real(relay.rx.signal2analyse));%relay decode the received data
error_bit2(:,it) = sum(abs(o_source_bits - relay_decode));
relay_sendcode = coded_data(relay_decode);%re-encode
relay.signal2send = 2*relay_sendcode-1; %modulate
% Relay to destination
[channel(3), rx] = add_channel_effect(channel(3), rx,relay.signal2send,1/4);
mrc_rx =[mrc_rx;rx.received_signal];% the code before combine
rx = rx_correct_phaseshift(rx,channel(3).attenuation.phi);
receive_value =[receive_value;rx.signal2analyse];
rx.signal2analyse = real(receive_value);%2*512
end
[received_bit, signal.received_bit_sequence] = rx_combine(rx, channel, use_relay,mrc_rx);
%received_bit =mean(rx.signal2analyse,1);
%receive_decode =data_decode(received_bit);%decode
rx_input=rx.signal2analyse(2,:);
inputdf = zeros(1,512);
inputdf(1:4:end)=receive_code(1:2:end);
inputdf(2:4:end)=receive_code(2:2:end);
inputdf(3:4:end)=rx_input(1:2:end);
inputdf(4:4:end)=rx_input(2:2:end);
receive_decode =data_decode_df(inputdf);%decode
%received_bit =sign(received_bit);
%received_bit = (received_bit+1)/2;
error_count2 = sum(abs(received_bit - transmit_symbol));
%error_count2 = sum(abs(receive_decode - o_source_bits));
error_bit(:,it) = error_count2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'AF'
source_bits =randint(1,128);
o_source_bits = coded_data(source_bits);%encode the bit
signal(1).nr_of_bits = length(o_source_bits);
signal.modulation_type = 'BPSK'; % 'BPSK', 'QPSK'
calculate_signal_parameter(o_source_bits);
receive_value =[];
if (use_direct_link == 1)
[channel(1), rx] = add_channel_effect(channel(1), rx,signal.symbol_sequence,1/4);
mrc_rx = rx.received_signal; % mrc combine
rx = rx_correct_phaseshift(rx, channel(1).attenuation.phi);
receive_value =[receive_value;rx.signal2analyse];
receive_code = sign(real(receive_value));
receive_code = (receive_code+1)/2;
error_bit1(:,it) = sum(abs(o_source_bits - receive_code));
end
if (use_relay == 1)
% Sender to relay
[channel(2), relay.rx] = add_channel_effect(channel(2),relay.rx, signal.symbol_sequence,1/4);
rx.received_signal;
relay = prepare_relay2send(relay,channel(2));%amplify
relay.signal2send;
% Relay to destination
[channel(3), rx] = add_channel_effect(channel(3), rx,relay.signal2send,1/4);
mrc_rx =[mrc_rx;rx.received_signal];% the code before combine
rx = rx_correct_phaseshift(rx,channel(3).attenuation.phi + channel(2).attenuation.phi);
receive_value =[receive_value;rx.signal2analyse];
rx.signal2analyse =real(receive_value);
end
% Receiver combine
%[received_bit, signal.received_bit_sequence] = rx_combine(rx, channel, use_relay);
[received_bit, signal.received_bit_sequence] = rx_combine(rx, channel, use_relay,mrc_rx);
receive_decode =data_decode(received_bit);
error_count2 = sum(abs(received_bit - o_source_bits));
error_count3 = sum(abs(receive_decode - source_bits));
error_bit(:,it) = error_count3;
end
end
% Receiver
%[received_symbol, signal.received_bit_sequence] = rx_combine(rx, channel, use_relay);
% BER(iSNR) = BER(iSNR) + sum(not(source_bit == decode_N_bit));
nr_error_bits =0;
for n=1:nr_of_iterations
nr_error_bits =nr_error_bits +error_bit(:,n);
end
BER(iSNR) = nr_error_bits;
%BER(iSNR) = BER(iSNR) ./ it ./ signal.nr_of_bits;
%BER(iSNR) = BER(iSNR) ./it ./ 1000;
BER(iSNR) = BER(iSNR) ./ it ./ 256;
end
% ------------------------------------
% Present the result of the simulation
txt_distance = [' - distance: ',num2str(channel(1).attenuation.distance), ':',num2str(channel(2).attenuation.distance), ':',num2str(channel(3).attenuation.distance)];
%txt_distance='';
if (use_relay == 1)
if (relay.magic_genie == 1)
txt_genie = ' - Magic Genie';
else
txt_genie = '';
end
txt_combining = [' - combining: ', rx(1).combining_type];
switch rx(1).combining_type
case 'FRC'
txt_combining = [txt_combining, ' ',num2str(rx(1).sd_weight),':1'];
end
if (crc_check ==1)
txt_crc = '- CRC ';
else
txt_crc ='';
end
%add2statistic(SNR,BER,[signal.modulation_type, ' - ',relay.mode, txt_combining, txt_distance, txt_genie])
%add2statistic(SNR,BER,[signal.modulation_type, ' - ',relay.mode,txt_crc])
switch channel(1).attenuation.pattern
case 'no'
txt_fading = ' - AWGN';
otherwise
txt_fading = ' - Rayleigh';
end
switch relay.mode
case {'AF','DF'}
add2statistic(SNR,BER,[relay.mode,txt_fading,txt_combining])
%add2statistic(SNR,BER,[relay.mode,txt_fading,txt_combining,'+0dB'])
%add2statistic(SNR,BER,['No cooperation',txt_fading,])
otherwise
add2statistic(SNR,BER,[relay.mode,txt_fading])
end
end
% % -----------------
% % Graphs to compare
SNR_linear = 10.^(SNR/10);
%add2statistic(SNR,ber(SNR_linear,'BPSK', 'no'),'No cooperation - AWGN - theory')
%add2statistic(SNR,ber(SNR_linear,'BPSK', 'Rayleigh'),'No cooperation - Rayleigh - theory')
%add2statistic(SNR,ber_2_senders(SNR_linear, 'QPSK'),'QPSK - 2 senders')
show_statistic;
toc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -