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

📄 main1003.asv

📁 放大转发协同通信的有关仿真代码
💻 ASV
📖 第 1 页 / 共 3 页
字号:
                    % Number of bit errors in current iteration
                        err(iter) = length(find(xhat(1:L_total-m)~=x)); 
                        if err(iter)>0
                            nferr(1,iter) = nferr(1,iter)+1;
                        end   
                    end	%iter
                    errs(1,1:niter) = errs(1,1:niter) + err(1:niter);
                    error_bit(:,it) = errs(1,niter);
                 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
             case 'TURBO'
                 %signal.modulation_type = 'BPSK'; % 'BPSK', 'QPSK'
                 %channel(1).attenuation(1).pattern = 'no';% 'no','Rayleigh'
                 dec_alg = 1;                        % the decoding algorithm. (0:Log-MAP, 1:SOVA)  default 0)
                 niter = 5;                          % number of iterations for each frame: default 5
                 L_total = 130;
                 g = [ 1 1 1; 1 0 1 ];
                 [n,K] = size(g); 
                 m = K - 1;
                 nstates = 2^m;
                 puncture = 1;                       % choose punctured / unpunctured (0/1): default 0
                 rate = 1/(2+puncture);   
                 errs(1,1:niter) = zeros(1,niter);
                 %L_total = L_info + m; 
                 x1 = round(rand(1, L_total-m-16));           % info. bits 信息比特
                 CRC_CCITT = CRC_16(x1);
                 x =[x1,CRC_CCITT];                           %加上CRC 比特信息
                 L_info = length(x);
                 input = x;
                 [temp, alpha] = sort(rand(1,L_total));        % random interleaver mapping 随机交织映射
                 en_output = encoderm( x, g, alpha, puncture );  % encoder output (+1/-1) 编码输出 
                 switch channel(1).attenuation(1).pattern
                     case 'no'
             %if(channel(1).attenuation(1).pattern == 'no')
                 % Fading amplitude; a=1 in AWGN channel
                 a = 1; 
                 en = 10^(SNR(iSNR)/10);
                 L_c = 4*a*en*rate; 	% reliability value of the channel信道可靠性常量
                 sigma = 1/sqrt(2*rate*en); 	% standard deviation of AWGN noise  
                 r = en_output+sigma*randn(1,L_total*(2+puncture)); % received bits 输出信息+噪声
                     case 'Rayleigh'           
                 channel_fad = randn(1,1) + j * randn(1,1);
                 [channel_phi, channel_mag] = cart2pol(real(channel_fad),imag(channel_fad));
                 channel_phi = -channel_phi;
                 a = channel_mag;
                 en = 10^(SNR(iSNR)/10);
                 sigma = a/sqrt(2*rate*en);
                 %L_c = 4*a*en*rate; 	% reliability value of the channel信道可靠性常量
                 L_c = 4*a*en*rate; 
                 r = en_output*channel_fad + sigma * (randn(1,L_total*(2+puncture)) +  j* randn(1,L_total*(2+puncture))); % received bits 输出信息+噪声
                 r = r.* exp(j * (channel_phi));
                 r = real(r);
                 end       
                    yk = demultiplex(r,alpha,puncture); % demultiplex to get input for decoder 1 and 2 解复用
                    % Scale the received bits      
                    rec_s = 0.5*L_c*yk;
                    % Initialize extrinsic information      
                    L_e(1:L_total) = zeros(1,L_total);
                    for iter = 1:niter
                        % Decoder one
                        % deinterleave the extrinsic information for first decoder
                        L_a(alpha) = L_e;  % a priori info. 先验信息
                        if dec_alg == 0
                            L_all = logmapo(rec_s(1,:), g, L_a, 1);  % complete info.
                        else   
                            L_all = sova0(rec_s(1,:), g, L_a, 1);  % complete info.
                        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);%加上CRC位后,卷积编码
                 transmit_symbol = coded_bit;
                 
                 if (coop_rate==1/4)
                 %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;
                 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                 else 
                     transmit_symbol_N1 = zeros(1,256);
                     transmit_symbol_N1(1:2:end) = transmit_symbol(1:4:end);
                     transmit_symbol_N1(2:2:end) = transmit_symbol(2:4:end);
                     N1_symbol = transmit_symbol_N1;
                     transmit_symbol_N2 = zeros(1,256);
                     transmit_symbol_N2(1:2:end) = transmit_symbol(3:4:end);
                     transmit_symbol_N2(2:2:end) = transmit_symbol(4:4:end);
                     N2_symbol = transmit_symbol_N2;
                 end
                 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                 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);
                    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                    if (coop_rate==1/4)
                    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
                    
                    else
                        insert_decode_data = zeros(1,512);
                        insert_decode_data(1:4:end) = rx.signal2analyse(1:2:end);
                        insert_decode_data(2:4:end) = rx.signal2analyse(2:2:end);
                        insert_decode_data(3:4:end) = 0;
                        insert_decode_data(4:4:end) = 0;   %删除比特补0
                    end
                    
                    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                    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);
                        
                        if (coop_rate==1/4)
                        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
                        
                        else
                        relay_insert_decode_data = zeros(1,512);
                        relay_insert_decode_data(1:4:end) = relay.rx.signal2analyse(1:2:end);
                        relay_insert_decode_data(2:4:end) = relay.rx.signal2analyse(2:2:end);
                        relay_insert_decode_data(3:4:end) = 0;
                        relay_insert_decode_data(4:4:end) = 0; 
                        end
                        
                        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.signal2send =2* N2_symbol-1;
               %relay to destination

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -