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

📄 stbc_decode44.m

📁 stbc在2发2收
💻 M
📖 第 1 页 / 共 2 页
字号:

function [decode_out,demap_int] = stbc_decode44(stbc_code,snr_db_step);
global Time_length Ofdm_bits Tx_num Rx_num Mod_type table16 table64
global Max_bit_num Max_value Min_value Max_add_value scale_eff st2

mult_flow_num = 0;
add_flow_num = 0;

rec_code = zeros(Time_length,Rx_num,Ofdm_bits);
    ch_mul_noice = zeros(Tx_num,Rx_num,Ofdm_bits);
    ch_mul_noice = sqrt(0.5)*(randn(Tx_num,Rx_num,Ofdm_bits)+j*randn(Tx_num,Rx_num,Ofdm_bits));
    for n = 1:Time_length 
        for m = 1:Ofdm_bits
            rec_code(n,:,m) = stbc_code(n,1:Tx_num,m)*ch_mul_noice(1:Tx_num,1:Rx_num,m);
        end
    end
    
    %---------------------信号功率统计,加高斯白噪声----------------------------%
    % 注意:这里只有0.75的信号平均功率!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    rec_code = rec_code*sqrt(4/3);
    sig_pante_pow = 0;
    for n = 1:Rx_num
        Agwn = sqrt(10^(-snr_db_step/10)/2)*(randn(Time_length,1,Ofdm_bits)+j*randn(Time_length,1,Ofdm_bits));
        rec_code(:,n,:) = rec_code(:,n,:) + Agwn;  
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %---------------------接收信号并进行stbc译码(定点仿真开始)-----------------%
    ch_scale = sqrt(Tx_num);
    rec_code = rec_code/sqrt(4/3);
    rec_code = rec_code*ch_scale;      %  接收信号(叠加高斯白噪声后)
    [max_rec_sig,max_index] = max(max(max(max(real(rec_code),imag(rec_code)))));
    max_rec_sig = fix(max_rec_sig/(fix(max_rec_sig)+1)*Max_value)/Max_value*(fix(max_rec_sig)+1);
    rec_code = rec_code/max_rec_sig;   % 信号归一化,归一化后信号都为纯小数
    rec_code = fix(rec_code*Max_value);
    
    [max_ch_est,max_index] = max(max(max(max(real(ch_mul_noice),imag(ch_mul_noice)))));
    max_ch_est = fix(max_ch_est/(fix(max_ch_est)+1)*Max_value)/Max_value*(fix(max_ch_est)+1);
    ch_mul_noice = ch_mul_noice/max_ch_est;    % 信道估计值归一化
    ch_mul_noice = fix(ch_mul_noice*Max_value);

    rec_code_r = real(rec_code);
    rec_code_i = imag(rec_code);
    ch_mul_noice_r = real(ch_mul_noice);
    ch_mul_noice_i = imag(ch_mul_noice);
    decode_out = zeros((Tx_num-1),Ofdm_bits);  % 输出星座点的值
    demap_int = zeros(Tx_num,Ofdm_bits);       % 输出qam映射的下标
    
    for n = 1:Ofdm_bits
        decode_tempt_r = zeros(1,(Tx_num-1));  % 信号长度=Tx_num (4)-1
        decode_tempt_i = zeros(1,(Tx_num-1));
        m = reshape(ch_mul_noice(:,:,n),1,16);          % 16 = Tx_num*Rx_num=4*4 ------ ch_mul_noice
        tempt_eff = scale_eff;
        for r =  1:Rx_num 
            mult_tempt(1,1) = rec_code_r(1,r,n)*ch_mul_noice_r(1,r,n);
            mult_tempt(1,2) = rec_code_i(1,r,n)*ch_mul_noice_i(1,r,n);
            mult_tempt(1,3) = rec_code_r(2,r,n)*ch_mul_noice_r(2,r,n);
            mult_tempt(1,4) = rec_code_i(2,r,n)*ch_mul_noice_i(2,r,n);
            mult_tempt(1,5) = -rec_code_r(4,r,n)*ch_mul_noice_r(4,r,n);
            mult_tempt(1,6) = -rec_code_i(4,r,n)*ch_mul_noice_i(4,r,n);
            mult_tempt(1,7) = -rec_code_r(3,r,n)*ch_mul_noice_r(3,r,n);
            mult_tempt(1,8) = -rec_code_i(3,r,n)*ch_mul_noice_i(3,r,n);
            for nnn = 1:8
                if mult_tempt(1,nnn) >= Max_add_value 
                    mult_tempt(1,nnn) = Max_add_value-1;
                    mult_flow_num = mult_flow_num+1;
                elseif mult_tempt(1,nnn) < -Max_add_value
                    mult_tempt(1,nnn) = -Max_add_value;
                    mult_flow_num = mult_flow_num+1;
                end
            end

            sum_tempt = fix((mult_tempt(1,1)+mult_tempt(1,2)+mult_tempt(1,3)+mult_tempt(1,4)+...               
                mult_tempt(1,5)+mult_tempt(1,6)+mult_tempt(1,7)+mult_tempt(1,8))/2^tempt_eff);
            decode_tempt_r(1,1) = decode_tempt_r(1,1)+sum_tempt;              
            
            mult_tempt(1,1) = -rec_code_r(1,r,n)*ch_mul_noice_i(1,r,n);
            mult_tempt(1,2) = rec_code_i(1,r,n)*ch_mul_noice_r(1,r,n);
            mult_tempt(1,3) = rec_code_r(2,r,n)*ch_mul_noice_i(2,r,n);
            mult_tempt(1,4) = -rec_code_i(2,r,n)*ch_mul_noice_r(2,r,n);
            mult_tempt(1,5) = -rec_code_r(4,r,n)*ch_mul_noice_i(3,r,n);
            mult_tempt(1,6) = rec_code_i(4,r,n)*ch_mul_noice_r(3,r,n);
            mult_tempt(1,7) = -rec_code_r(3,r,n)*ch_mul_noice_i(4,r,n);
            mult_tempt(1,8) = rec_code_i(3,r,n)*ch_mul_noice_r(4,r,n);   
            for nnn = 1:8
                if mult_tempt(1,nnn) >= Max_add_value 
                    mult_tempt(1,nnn) = Max_add_value-1;
                    mult_flow_num = mult_flow_num+1;
                elseif mult_tempt(1,nnn) < -Max_add_value
                    mult_tempt(1,nnn) = -Max_add_value;
                    mult_flow_num = mult_flow_num+1;
                end
            end
            sum_tempt = (mult_tempt(1,1)+mult_tempt(1,2) +...
                mult_tempt(1,3)+mult_tempt(1,4)+...
                mult_tempt(1,5)+mult_tempt(1,6)+...
                mult_tempt(1,7)+mult_tempt(1,8))/2^tempt_eff;
            decode_tempt_i(1,1) = decode_tempt_i(1,1)+sum_tempt;
      
            mult_tempt(1,1) = rec_code_r(1,r,n)*ch_mul_noice_r(2,r,n);
            mult_tempt(1,2) = rec_code_i(1,r,n)*ch_mul_noice_i(2,r,n);
            mult_tempt(1,3) = -rec_code_r(2,r,n)*ch_mul_noice_r(1,r,n);
            mult_tempt(1,4) = -rec_code_i(2,r,n)*ch_mul_noice_i(1,r,n);
            mult_tempt(1,5) = rec_code_r(4,r,n)*ch_mul_noice_r(3,r,n);
            mult_tempt(1,6) = rec_code_i(4,r,n)*ch_mul_noice_i(3,r,n);
            mult_tempt(1,7) = -rec_code_r(3,r,n)*ch_mul_noice_r(4,r,n);
            mult_tempt(1,8) = -rec_code_i(3,r,n)*ch_mul_noice_i(4,r,n);
            for nnn = 1:8
                if mult_tempt(1,nnn) >= Max_add_value 
                    mult_tempt(1,nnn) = Max_add_value-1;
                    mult_flow_num = mult_flow_num+1;
                elseif mult_tempt(1,nnn) < -Max_add_value
                    mult_tempt(1,nnn) = -Max_add_value;
                    mult_flow_num = mult_flow_num+1;
                end
            end
            sum_tempt = fix((mult_tempt(1,1)+mult_tempt(1,2) +...
                mult_tempt(1,3)+mult_tempt(1,4)+...
                mult_tempt(1,5)+mult_tempt(1,6)+...
                mult_tempt(1,7)+mult_tempt(1,8))/2^tempt_eff); 
            decode_tempt_r(1,2) = decode_tempt_r(1,2)+sum_tempt;
            
            mult_tempt(1,1) = -rec_code_r(1,r,n)*ch_mul_noice_i(2,r,n);
            mult_tempt(1,2) = rec_code_i(1,r,n)*ch_mul_noice_r(2,r,n);
            mult_tempt(1,3) = -rec_code_r(2,r,n)*ch_mul_noice_i(1,r,n);
            mult_tempt(1,4) = rec_code_i(2,r,n)*ch_mul_noice_r(1,r,n);
            mult_tempt(1,5) = rec_code_r(4,r,n)*ch_mul_noice_i(4,r,n);
            mult_tempt(1,6) = -rec_code_i(4,r,n)*ch_mul_noice_r(4,r,n);
            mult_tempt(1,7) = -rec_code_r(3,r,n)*ch_mul_noice_i(3,r,n);
            mult_tempt(1,8) = rec_code_i(3,r,n)*ch_mul_noice_r(3,r,n);
            for nnn = 1:8
                if mult_tempt(1,nnn) >= Max_add_value 
                    mult_tempt(1,nnn) = Max_add_value-1;
                    mult_flow_num = mult_flow_num+1;
                elseif mult_tempt(1,nnn) < -Max_add_value
                    mult_tempt(1,nnn) = -Max_add_value;
                    mult_flow_num = mult_flow_num+1;
                end
            end
            sum_tempt = fix((mult_tempt(1,1)+mult_tempt(1,2) +...
                mult_tempt(1,3)+mult_tempt(1,4)+...
                mult_tempt(1,5)+mult_tempt(1,6)+...
                mult_tempt(1,7)+mult_tempt(1,8))/2^tempt_eff);
            decode_tempt_i(1,2) = decode_tempt_i(1,2)+sum_tempt;
  
            mult_tempt(1,1)  = rec_code_r(1,r,n)*ch_mul_noice_r(3,r,n);
            mult_tempt(1,2)  = rec_code_i(1,r,n)*ch_mul_noice_i(3,r,n);
            mult_tempt(1,3)  = rec_code_r(2,r,n)*ch_mul_noice_r(3,r,n);
            mult_tempt(1,4)  = rec_code_i(2,r,n)*ch_mul_noice_i(3,r,n);
            mult_tempt(1,5)  = rec_code_r(1,r,n)*ch_mul_noice_r(4,r,n);
            mult_tempt(1,6)  = rec_code_i(1,r,n)*ch_mul_noice_i(4,r,n);
            mult_tempt(1,7)  = -rec_code_r(2,r,n)*ch_mul_noice_r(4,r,n);
            mult_tempt(1,8)  = -rec_code_i(2,r,n)*ch_mul_noice_i(4,r,n);
            mult_tempt(1,9)  = rec_code_r(3,r,n)*ch_mul_noice_r(1,r,n);
            mult_tempt(1,10) = rec_code_i(3,r,n)*ch_mul_noice_i(1,r,n);
            mult_tempt(1,11) = rec_code_r(3,r,n)*ch_mul_noice_r(2,r,n);
            mult_tempt(1,12) = rec_code_i(3,r,n)*ch_mul_noice_i(2,r,n);
            mult_tempt(1,13) = rec_code_r(4,r,n)*ch_mul_noice_r(1,r,n);
            mult_tempt(1,14) = rec_code_i(4,r,n)*ch_mul_noice_i(1,r,n);
            mult_tempt(1,15) = -rec_code_r(4,r,n)*ch_mul_noice_r(2,r,n);
            mult_tempt(1,16) = -rec_code_i(4,r,n)*ch_mul_noice_i(2,r,n);
            for nnn = 1:16
                if mult_tempt(1,nnn) >= Max_add_value 
                    mult_tempt(1,nnn) = Max_add_value-1;
                    mult_flow_num = mult_flow_num+1;
                elseif mult_tempt(1,nnn) < -Max_add_value
                    mult_tempt(1,nnn) = -Max_add_value;
                    mult_flow_num = mult_flow_num+1;
                end
            end
            sum_tempt = fix((mult_tempt(1,1)+mult_tempt(1,2) +...
                mult_tempt(1,3)+mult_tempt(1,4)+...
                mult_tempt(1,5)+mult_tempt(1,6)+...
                mult_tempt(1,7)+mult_tempt(1,8)+...
                mult_tempt(1,9)+mult_tempt(1,10) +...
                mult_tempt(1,11)+mult_tempt(1,12)+...
                mult_tempt(1,13)+mult_tempt(1,14)+...
                mult_tempt(1,15)+mult_tempt(1,16))/st2/2^tempt_eff);
            decode_tempt_r(1,3) = decode_tempt_r(1,3)+sum_tempt;
   
            mult_tempt(1,1)  = -rec_code_r(1,r,n)*ch_mul_noice_i(3,r,n);
            mult_tempt(1,2)  = rec_code_i(1,r,n)*ch_mul_noice_r(3,r,n);
            mult_tempt(1,3)  = -rec_code_r(2,r,n)*ch_mul_noice_i(3,r,n);
            mult_tempt(1,4)  = rec_code_i(2,r,n)*ch_mul_noice_r(3,r,n);
            mult_tempt(1,5)  = -rec_code_r(1,r,n)*ch_mul_noice_i(4,r,n);
            mult_tempt(1,6)  = rec_code_i(1,r,n)*ch_mul_noice_r(4,r,n);
            mult_tempt(1,7)  = rec_code_r(2,r,n)*ch_mul_noice_i(4,r,n);
            mult_tempt(1,8)  = -rec_code_i(2,r,n)*ch_mul_noice_r(4,r,n);
            mult_tempt(1,9)  = rec_code_r(3,r,n)*ch_mul_noice_i(1,r,n);
            mult_tempt(1,10) = -rec_code_i(3,r,n)*ch_mul_noice_r(1,r,n);
            mult_tempt(1,11) = rec_code_r(3,r,n)*ch_mul_noice_i(2,r,n);
            mult_tempt(1,12) = -rec_code_i(3,r,n)*ch_mul_noice_r(2,r,n);
            mult_tempt(1,13) = rec_code_r(4,r,n)*ch_mul_noice_i(1,r,n);
            mult_tempt(1,14) = -rec_code_i(4,r,n)*ch_mul_noice_r(1,r,n);
            mult_tempt(1,15) = -rec_code_r(4,r,n)*ch_mul_noice_i(2,r,n);
            mult_tempt(1,16) = rec_code_i(4,r,n)*ch_mul_noice_r(2,r,n);
            for nnn = 1:16

⌨️ 快捷键说明

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