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

📄 adpt_mod_para.m

📁 OFDM的详细仿真代码
💻 M
字号:

function   [user_subc_alloc , mod_subc ,pwr_subc ,pad_bit_cnt] = adpt_mod_para... 
                ( coded_user_bit,N_sym,Idx_data ,AllocMethod , AdptMethod, H , var_noise, TargetBer );
            
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 功能:自适应调制和多用户复用

% 输入:     coded_user_bit, 输入用户比特序列,为cell结构
%           N_sym, 本帧中的OFDM符号个数
%           Idx_data, 数据OFDM符号的子载波标号
%           AllocMethod, 子载波分配方法
%           AdptMethod, 自适应调制方法
%           H, 频域信道响应
%           var_noise, 噪声样点的功率
%           TargetBer, 目标误比特率
%输出:      user_subc_alloc, 用户分配的子载波序号,为cell结构
%           pad_bit_cnt, 为保证用户比特在调制器中能正确调制,需要填充的比特数
%           mod_subc, 用户对应user_subc_alloc子载波上的调制方式,为cell结构
%           pwr_subc, 用户对应user_subc_alloc子载波上的功率,为cell结构 
            
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if nargin == 4
    
    % 不使用自适应调制, 对多个用户的数据使用固定的子载波分配方法 , 每个用户的子载波
    % 均使用相同的星座调制方式 ; 不同用户的子载波可能会使用不同的调制方式
    
    N_user = size(coded_user_bit,2);
    num_subc_user = length(Idx_data) / N_user ;   % 平均分配,每个用户的子载波数
    user_subc_alloc = cell(1,N_user);
    mod_subc = cell(1,N_user);
    pwr_subc = cell(1,N_user);
    
    for u = 1:N_user
        % 先计算出为保证所有用户的比特恰好分完, 需要填充的比特数, 在本帧末尾填充零
        % 每个用户每个OFDM符号的比特数
        userbit_sym = length(coded_user_bit{u})/N_sym;     
        % 每个用户使用的调制方式
        mod_user = ceil(userbit_sym / num_subc_user);     
         % 调制方式对应: 1--BPSK调制, 2--QPSK调制,3--8PSK调制, 4--16QAM调制,6--64QAM调制
        if mod_user > 6
            error('单个用户比特数太多,无法进行调制,子程序adpt_mod_para出错!');
        elseif mod_user == 5 
            mod_user = 6;                  
        end                                  
        pad_bit_cnt(u) = mod_user * num_subc_user * N_sym - length(coded_user_bit{u}) ;
    
    
        % 然后根据选择的固定子载波分配方法( 1--相邻分配, 2--交织分配, 3---跳频分配 )
        % 把子载波均匀地分配给用户. 用户的比特数不同, 会造成不同用户的调制方式和
        % 填充比特数的不同
    
        switch AllocMethod
           
        case    1           % 相邻分配 
            %user_subc_alloc((u-1)*num_subc_user + 1: u*num_subc_user) = u;
            user_subc_alloc{u} = Idx_data((u-1)*num_subc_user + 1: u*num_subc_user)';
            mod_subc{u} = mod_user*ones(num_subc_user, 1);
            pwr_subc{u} = ones(num_subc_user,1);
            
        case    2           % 交织分配
            
        case    3           % 跳频分配 
        
        otherwise
        
        end
    
    end
    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

else
    % 使用自适应调制, 多用户子载波分配方法由AllocMethod确定, 自适应调制方法由AdptMethod确定
    
    % 如果使用固定子载波分配方法
    if (AllocMethod == 1) | (AllocMethod == 2) | (AllocMethod == 3)
        
        N_user = size(coded_user_bit,2);
        N_data = length(Idx_data);
        % 平均分配,每个用户的子载波数
        num_subc_user = N_data / N_user;   
        user_subc_alloc = cell(1,N_user);
        mod_subc = cell(1,N_user);
        pwr_subc = cell(1,N_user);
        
        for u = 1:N_user
            
            % 先计算出,为保证每个用户每个OFDM符号的比特数为调整步长的整数倍, 需要填充的比特数
            % 如果使用基于功率梯度最小的QAM 算法, 分配给各子载波的比特数为0,2,4,6, 步长为2
            step = 2;
            
            % 每个用户本帧需要填充的比特数      
            if mod(length(coded_user_bit{u}) , step*N_sym) ~= 0
                pad_bit_cnt(u) = step*N_sym - mod(length(coded_user_bit{u}) , step*N_sym);
            else
                pad_bit_cnt(u) = 0;
            end
            
            % 每个用户每个OFDM符号的比特数
            num_userbit_sym = (length(coded_user_bit{u}) + pad_bit_cnt(u))/N_sym;
   
            switch AllocMethod
                case    1           % 相邻分配
                    %user_subc_alloc((u-1)*num_subc_user + 1: u*num_subc_user) = u;
                    user_subc_alloc{u} = Idx_data((u-1)*num_subc_user + 1: u*num_subc_user)';
                    %mod_subc{u} = mod_user*ones(num_subc_user, 1);
                    %pwr_subc{u} = ones(num_subc_user,1);
            
                case    2           % 交织分配
            
                case    3           % 跳频分配 
        
                otherwise
            end
            
            % 当前用户对应子载波的信道相应
            H_user = H{u}(user_subc_alloc{u},1,1);             
            
            switch AdptMethod
                % 自适应调制方法1, 给功率增加最小的子载波分配比特和功率
                case    1               
                    [mod_subc{u},pwr_subc{u}]=adaptive_power1(H_user,TargetBer,...
                                          num_subc_user,var_noise,num_userbit_sym);
                                      
                % 自适应调制方法2, 给误比特性能降低最小的子载波分配比特和增加功率
                case    2              
                    
                % 自适应调制方法3, 按照信道响应降序排列,子载波间争夺比特( 功率?? )
                case    3               
                    mod_subc{u} =adaptive(H_user,num_subc_user,num_userbit_sym);
                    pwr_subc{u} = ones(num_subc_user,1);
                    
                otherwise
            end
    
        end
        
    elseif  (AllocMethod == 4)           % 自适应子载波分配
        
        % 自适应子载波和比特功率分配
        for u = 1:N_user
            % 先计算需要填充的比特数
            step = 2;
            % 每个用户本帧需要填充的比特数              
            pad_bit_cnt(u) = step*N_sym - mod(length(coded_user_bit{u}) , step*N_sym);
            % 每个用户每个OFDM符号的比特数
            num_userbit_sym(u) = (length(coded_user_bit{u}) + pad_bit_cnt(u))/N_sym;
        end
        % 此函数未写
        adaptive_pwr_subc ( H(:,1) ,N_data, var_noise, num_userbit_sym );
        
    end
    
end    

⌨️ 快捷键说明

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