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

📄 add_training.m

📁 程序里面包含各部分算法仿真 可供参考和使用
💻 M
字号:
function [transmit_signal, training] = add_training(transmit_signal,PrefixRatio,...
    N_subc,N_used, Idx_used,cp_len, N_Tx_ant,N_tran_sym,CE_Method2)

% 1024点FFT的前导序列
% 多条天线的训练序列(同步帧),各两个OFDM符号
training = zeros(N_subc,N_tran_sym,N_Tx_ant);
% 产生伪随机序列,放在训练OFDM符号的导频位置.
PN_seq = mseq(12, [1 2 7 9], ones(1,12), 14);  % 参数先随意选取,可以调整
PN_seq = 2*PN_seq - 1;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if N_subc== 64
    Repeat = 4;  % 为保证在时域上重复Repeat次, 在频域上两个有数据的子载波间插(Repeat-1)个零
else Repeat = 8; 
    
end

% 产生第1个训练OFDM符号
for ant = 1:N_Tx_ant
    
    real_part = PN_seq( (ant-1)*N_Tx_ant + 1,1:N_used/Repeat ); % 截取PN序列
    imag_part = PN_seq( (ant-1)*N_Tx_ant + 2,1:N_used/Repeat );
    
    tran_tmp1 =  sqrt(Repeat/2) * ( real_part + j * imag_part );
    tmp1 = [ tran_tmp1 ; zeros( Repeat - 1 , N_used/Repeat ) ];
    tmp2 = reshape(tmp1, N_used, 1);
    tmp3 = [ tmp2(1:N_used/2) ; flipud(tmp2(N_used/2 + 1:end))];
    training(Idx_used,1,ant) = tmp3;
    
end

if N_Tx_ant == 1        % 单天线情况
    
    
    % 产生第2个训练OFDM符号, 在使用的子载波上放伪随机序列
    tran_tmp1 = PN_seq( 3,1:N_used ); % 截取PN序列    
    training(Idx_used,2,ant) = tran_tmp1;
    
    % 第3个训练OFDM符号, 在使用的子载波上放和第2个OFDM符号的相同的伪随机序列
    training(Idx_used,3,ant) = tran_tmp1;
    
elseif N_Tx_ant == 2     % 多天线情况
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 此处根据不同的多天线信道估计算法,修改得到不同的训练序列
    
    if CE_Method2 == 1  % 直接使用LS方法
        
        % 第1条天线的第2,3个训练OFDM符号, 在使用的子载波上放伪随机序列
        training(Idx_used,2,1) = PN_seq( 5 ,1:N_used );
        % training(Idx_used,3,1) = PN_seq( 6 ,1:N_used ) + i*PN_seq( 7 ,1:N_used );
        training(Idx_used,3,1) = exp(-j*2*pi*cp_len.*[0:N_used-1]/N_used);
        

        % 第2条天线的第2,3个训练OFDM符号, 在使用的子载波上放伪随机序列
        training(Idx_used,2,2) = PN_seq( 8 ,1:N_used );
        % training(Idx_used,3,2) = PN_seq( 9 ,1:N_used ) + i*PN_seq( 10 ,1:N_used );
        training(Idx_used,3,2) = exp(-j*2*pi*2*cp_len.*[0:N_used-1]/N_used);
        
        
        % 第2条天线的第2,3个训练OFDM符号, 在使用的子载波上放和第1条天线有如下关系的序列:
        % x2 = x1 * (-1)^k ; k 为子载波号
        %training(Idx_used,2,2) = training(Idx_used,2,1).*(-1).^Idx_used';
        %training(Idx_used,3,2) = training(Idx_used,3,1).*(-1).^Idx_used';      
        
    elseif CE_Method2 == 2
        
        % 第1条天线的第2个训练OFDM符号, 在使用的子载波上放伪随机序列
        tran_tmp1 = PN_seq( 5 ,1:N_used ); % 截取PN序列    
        training(Idx_used,2,1) = tran_tmp1;
        
        % 第1条天线的第3个训练OFDM符号, 放全零序列
        training(Idx_used,3,1) = zeros(N_used,1);
        
        % 第2条天线的第2个训练OFDM符号, 放全零序列
        training(Idx_used,2,2) = zeros(N_used,1);
        
        % 第2条天线的第3个训练OFDM符号, 在使用的子载波上放伪随机序列
        tran_tmp1 = PN_seq( 6 ,1:N_used ); % 截取PN序列    
        training(Idx_used,3,2) = tran_tmp1;
        
    end
    
elseif N_Tx_ant == 4    % 多天线情况
    training(Idx_used,1,1) = PN_seq( 1 ,1:N_used );
    training(Idx_used,1,2) = PN_seq( 2 ,1:N_used );    
    training(Idx_used,1,3) = PN_seq( 3 ,1:N_used );
    training(Idx_used,1,4) = PN_seq( 4 ,1:N_used );
    
    training(Idx_used,2,1) = PN_seq( 5 ,1:N_used );
    training(Idx_used,2,2) = PN_seq( 6 ,1:N_used );    
    training(Idx_used,2,3) = PN_seq( 7 ,1:N_used );
    training(Idx_used,2,4) = PN_seq( 8 ,1:N_used );

    training(Idx_used,3,1) = PN_seq( 9 ,1:N_used );
    training(Idx_used,3,2) = PN_seq( 10 ,1:N_used );    
    training(Idx_used,3,3) = PN_seq( 11 ,1:N_used );
    training(Idx_used,3,4) = PN_seq( 12 ,1:N_used );
    
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 产生时域训练序列


syn_frame = sqrt(N_subc) * ifft( fftshift( training , 1 ) );
cp = syn_frame(N_subc - cp_len + 1:N_subc ,:,:);
training_frame = [cp;syn_frame];
training_frame = reshape(training_frame,[1, (N_subc + cp_len)*N_tran_sym ,N_Tx_ant]);

transmit_signal = [ training_frame transmit_signal ];

⌨️ 快捷键说明

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