⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main1003.m~

📁 放大转发协同通信的有关仿真代码
💻 M~
📖 第 1 页 / 共 2 页
字号:
                        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 + -