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

📄 fix_soft_1664qam24.m

📁 stbc在2发2收
💻 M
📖 第 1 页 / 共 2 页
字号:
            mult_tempt(1,4) = rec_code_i(2,r,n)*ch_mul_noice_r(1,r,n);
            
            for nnn = 1:4
                if mult_tempt(1,nnn) >= Max_add_value
                    mult_temp(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))/tempt_scale; 
            decode_tempt_i(1,2) = decode_tempt_i(1,2)+ sum_tempt;
            
            if decode_tempt_i(1,2) >= Max_add_value
                decode_tempt_i(1,2) = Max_add_value-1;
                add_flow_num = add_flow_num+1;
            elseif decode_tempt_i(1,2) <-Max_add_value
                decode_tempt_i(1,2) = -Max_add_value;
                add_flow_num = add_flow_num+1;
            end
            if r == Rx_num-1
                tempt_scale = 2;
                decode_tempt_r(1,1) = decode_tempt_r(1,1)/2;
                decode_tempt_i(1,1) = decode_tempt_i(1,1)/2;
                decode_tempt_r(1,2) = decode_tempt_r(1,2)/2;
                decode_tempt_i(1,2) = decode_tempt_i(1,2)/2;
            end 
        end%r =  1:Rx_num 
            
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            bit = 6;
            scale = 2^bit;
            %Max_value2 = 2^(2*Max_quantity_bits-2);
            Max_value2 = 2^(Max_quantity_bits+bit+1);
            decode_tempt_r(1,1) = fix(decode_tempt_r(1,1)*max_rec_code/Max_value*scale);
            decode_tempt_r(1,2) = fix(decode_tempt_r(1,2)*max_rec_code/Max_value*scale);
            decode_tempt_i(1,1) = fix(decode_tempt_i(1,1)*max_rec_code/Max_value*scale);
            decode_tempt_i(1,2) = fix(decode_tempt_i(1,2)*max_rec_code/Max_value*scale);
            
            if abs(decode_tempt_r(1,1))>Max_value2|abs(decode_tempt_i(1,1))>Max_value2|...
                    abs(decode_tempt_r(1,2))>Max_value2|abs(decode_tempt_i(1,2))>Max_value2
                add_flow_num = add_flow_num+1;
            end
            if decode_tempt_r(1,1) >=Max_value2
                decode_tempt_r(1,1) = Max_value2-1;
            elseif decode_tempt_r(1,1)<-Max_value2
                decode_tempt_r(1,1) = -Max_value2;
            end
            if decode_tempt_i(1,1) >=Max_value2
                decode_tempt_i(1,1) = Max_value2-1;
            elseif decode_tempt_i(1,1)<-Max_value2
                decode_tempt_i(1,1) = -Max_value2;
            end
            if decode_tempt_r(1,2) >=Max_value2
                decode_tempt_r(1,2) = Max_value2-1;
            elseif decode_tempt_r(1,2)<-Max_value2
                decode_tempt_r(1,2) = -Max_value2;
            end
            if decode_tempt_i(1,2) >=Max_value2
                decode_tempt_i(1,2) = Max_value2-1;
            elseif decode_tempt_i(1,2)<-Max_value2
                decode_tempt_i(1,2) = -Max_value2;
            end
            ch_sum = 0;       
            for n1 = 1:Tx_num*Rx_num
                ch_sum = ch_sum + real(m(n1))^2+imag(m(n1))^2;
            end
            
            % 根据下面两式子的比较,可见,ch_sum的精确对判决的重要作用
            % 所以tempt_scale取得过小会有摆尾现象,太大又会溢出;
            % 16qam 和 64qam的tempt_scale取值不同,才可保证两个qam都可以得到好的性能
            bit = 6;
            tempt_scale = 2^bit;         
            ch_sum = fix(ch_sum/Max_value^2*max_ch_noice*tempt_scale);
            %ch_sum = ch_sum/Max_value^2*max_ch_noice*max_ch_noice;
            %Max_value3 = 2^(2*Max_quantity_bits-6);
            Max_value3 = 2^(Max_quantity_bits+bit-2);
            if ch_sum>=Max_value3
                ch_sum = Max_value3-1;
                add_flow_num = add_flow_num+1;
            end
            
            % decode_tempt 就是译码输出的软信息(用8bits量化)
            decode_tempt_r(1,1) = fix((decode_tempt_r(1,1)/ch_sum)*tempt_scale/scale)*2;
            decode_tempt_i(1,1) = fix((decode_tempt_i(1,1)/ch_sum)*tempt_scale/scale)*2;
            decode_tempt_r(1,2) = fix((decode_tempt_r(1,2)/ch_sum)*tempt_scale/scale)*2;
            decode_tempt_i(1,2) = fix((decode_tempt_i(1,2)/ch_sum)*tempt_scale/scale)*2;
            if Mod_type == 6
                decode_tempt_r(1,1) = fix(decode_tempt_r(1,1)*128/138);
                decode_tempt_i(1,1) = fix(decode_tempt_i(1,1)*128/138);
                decode_tempt_r(1,2) = fix(decode_tempt_r(1,2)*128/138);
                decode_tempt_i(1,2) = fix(decode_tempt_i(1,2)*128/138);
            end
            
            if abs(decode_tempt_r(1,1))>Max_value|abs(decode_tempt_i(1,1))>Max_value|...
                    abs(decode_tempt_r(1,2))>Max_value|abs(decode_tempt_i(1,2))>Max_value
                add_flow_num = add_flow_num+1;
            end
            if decode_tempt_r(1,1) >=Max_value
                decode_tempt_r(1,1) = Max_value-1;
            elseif decode_tempt_r(1,1)<Min_value
                decode_tempt_r(1,1) = Min_value;
            end
            if decode_tempt_i(1,1) >=Max_value
                decode_tempt_i(1,1) = Max_value-1;
            elseif decode_tempt_i(1,1)<Min_value
                decode_tempt_i(1,1) = Min_value;
            end
            if decode_tempt_r(1,2) >=Max_value
                decode_tempt_r(1,2) = Max_value-1;
            elseif decode_tempt_r(1,2)<Min_value
                decode_tempt_r(1,2) = Min_value;
            end
            if decode_tempt_i(1,2) >=Max_value
                decode_tempt_i(1,2) = Max_value-1;
            elseif decode_tempt_i(1,2)<Min_value
                decode_tempt_i(1,2) = Min_value;
            end
            if Mod_type == 4
                star_index_length = 16;
                tempt_table = table16;
            elseif Mod_type == 6
                star_index_length = 64;
                tempt_table = table64;
            end
            for star_index = 1:star_index_length
                
                % 这里和L263
                % decode_tempt_r(1,1) = fix((decode_tempt_r(1,1)/ch_sum)/2)*tempt_scale;
                % 中 除以2,是因为在16qam中,7/sqrt(42)>1,所以为了让所有的星座点都<1,必须除以2;
                star_r = fix(real(tempt_table(star_index)));
                star_i = fix(imag(tempt_table(star_index)));
                
                % 软判决
                compare_tempt(1,1) = (decode_tempt_r(1,1)-star_r)^2+(decode_tempt_i(1,1)-star_i)^2;
                compare_tempt(2,1) = (decode_tempt_r(1,2)-star_r)^2+(decode_tempt_i(1,2)-star_i)^2;
                
                if star_index==1
                    compare_tempt(1,2) = compare_tempt(1,1);
                    compare_tempt(2,2) = compare_tempt(2,1); 
                    result_index(1) = star_index;
                    result_index(2) = star_index;
                else
                    if compare_tempt(1,1) < compare_tempt(1,2)
                        compare_tempt(1,2) = compare_tempt(1,1);
                        result_index(1) = star_index;
                    end
                    if compare_tempt(2,1) < compare_tempt(2,2)
                        compare_tempt(2,2) = compare_tempt(2,1);
                        result_index(2) = star_index;
                    end
                end
            end % star_index = 1:16 or 1:64
            demap_int(1,n) = result_index(1)-1;
            demap_int(2,n) = result_index(2)-1;
            
        end  % n = 1:Ofdm_bits  
        
        %------------------------qam 解调-------------------------------------------%
        demap_out = zeros(Tx_num,pqam_length);
        %demap_out = qam_demap(demap_int);
        for t = 1:Tx_num
            tempt = dec2bin(demap_int(t,:),Mod_type);
            for n = 1:Ofdm_bits
                demap_out(t,(n-1)*Mod_type+1:n*Mod_type) = tempt(n,1:Mod_type)-48;     
            end
        end
        
        %------------------------统计误码率-----------------------------------------%
        % pqam_length = Ofdm_bits*Mod_type;
        error_ratio = 0;
        error_num = 0;
        sig_all_num = pqam_length*Tx_num;
        
        error_matrix = zeros(Tx_num,pqam_length);
        for t = 1:Tx_num 
            for n = 1:pqam_length   
                if demap_out(t,n)~=sig_code(t,n)
                    error_num = error_num+1;
                    error_matrix(t,n) = 1;
                end
            end
        end
        error_ratio = error_num/sig_all_num;
        e_record(iterative_length) = error_ratio;
    end % snr_db_step =snr_min:snr_max 
    xanxis = snr_min:stepsize:snr_max;  
    if Mod_type == 4
        semilogy(xanxis,e_record,'mo-');  
    elseif Mod_type == 6
        if Max_quantity_bits == 8
        semilogy(xanxis,e_record,'k*-'); 
    elseif Max_quantity_bits == 9
        semilogy(xanxis,e_record,'b*-');
    elseif Max_quantity_bits == 16
        semilogy(xanxis,e_record,'r*-');
    else
        semilogy(xanxis,e_record,'m*-');
    end
    end
    grid on;
    hold on;
    title('T2R4 系统');
    legend('8','9','16','','','')
    
    mult_flow_num
    add_flow_num 
    
    
    

⌨️ 快捷键说明

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