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

📄 mimo_ofdm_ls.m

📁 用matlab对MIMO-OFDM通信系统的设计仿真的源代码
💻 M
字号:
function [channel_est_LS]=MIMO_OFDM_LS(rx_data_pilot_frequency,tx_data_pilot,MIMO_OFDM_system_par)
% Function MIMO_OFDM_LS +++++++++++++++++++++++++++++++++++++++++++++++++
% Realize LS algorithm for MIMO OFDM system

% Input data:  rx_data_pilot_frequency - receive frequency data of MIMO OFDM system
%              tx_data_pilot - transmit frequency data of MIMO OFDM system
%              MIMO_OFDM_system_par - parameters of MIMO OFDM system
% Output data: channel_est_LS - the estimated channel matrix of MIMO OFDM system
%         if pulse shaping is disabled, (num_rx_antenna,num_tx_antenna,channel_length)
%         if pulse shaping is enabled,(num_rx_antenna,num_tx_antenna,channel_length_equivalent)

% Begin:  Feb, 2005
% Last edited: Feb.6, 2005
%   Feng Wan    
num_frame_channel_inv=MIMO_OFDM_system_par.num_frame_channel_inv;
num_tx_antenna=MIMO_OFDM_system_par.num_tx_antenna;
num_rx_antenna=MIMO_OFDM_system_par.num_rx_antenna;

num_pilot=MIMO_OFDM_system_par.num_pilot;
num_carriers=MIMO_OFDM_system_par.num_carriers;
firstnum_pilot=MIMO_OFDM_system_par.firstnum_pilot;
interval_pilot=MIMO_OFDM_system_par.interval_pilot;
channel_length=MIMO_OFDM_system_par.channel_length;
pulse_type=MIMO_OFDM_system_par.pulse_type;
if(pulse_type==1)
    channel_length=MIMO_OFDM_system_par.channel_length_equivalent;  % when pulse type is enabled,
                                              % the channel_length_quivalent  is the true channel length
end

tx_pilot=zeros(num_tx_antenna,num_pilot,num_frame_channel_inv);
for n1=1:num_frame_channel_inv
    tx_pilot(:,:,n1)=tx_data_pilot(:,firstnum_pilot:interval_pilot:num_carriers,n1);
end

rx_pilot=zeros(num_rx_antenna,num_pilot,num_frame_channel_inv);
for n1=1:num_frame_channel_inv
    rx_pilot(:,:,n1)=rx_data_pilot_frequency(:,firstnum_pilot:interval_pilot:num_carriers,n1);
end

matrix_F=zeros(num_pilot,channel_length);

for n1=1:channel_length
    matrix_F(:,n1)=exp(-i*2*pi*(n1-1)*((firstnum_pilot:interval_pilot:num_carriers).'-1)/num_carriers);
end

matrix_A=zeros(num_pilot*num_frame_channel_inv,channel_length*num_tx_antenna);

% matrix_data_test=zeros(num_pilot*num_frame_channel_inv,num_pilot*num_tx_antenna);


vec_temp=zeros(num_pilot,1);
for n1=1:num_frame_channel_inv
    for n2=1:num_tx_antenna
        for n3=1:num_pilot
            vec_temp(n3)=tx_pilot(n2,n3,n1);
        end
        matrix_temp=diag(vec_temp);
        matrix_A(num_pilot*(n1-1)+1:num_pilot*n1,channel_length*(n2-1)+1:channel_length*n2)=matrix_temp*matrix_F;
%         matrix_data_test(num_pilot*(n1-1)+1:num_pilot*n1,num_pilot*(n2-1)+1:num_pilot*n2)=matrix_temp;
    end
end

% matrix_F_comp_test=zeros(size(matrix_F,1)*2,size(matrix_F,2)*2);
% matrix_F_comp_test(1:size(matrix_F,1),1:size(matrix_F,2))=matrix_F;
% matrix_F_comp_test(1+size(matrix_F,1):size(matrix_F,1)*2,1+size(matrix_F,2):size(matrix_F,2)*2)=matrix_F;
% 
% disp('matrix_F_comp_test')
% size(matrix_F_comp_test)
% rank(matrix_F_comp_test)
% 
% disp('matrix_data_test');
% size(matrix_data_test)
% rank(matrix_data_test)
% 
% matrix_A_comp=matrix_data_test*matrix_F_comp_test;
% disp('matrix_A_comp');
% size(matrix_A_comp)
% rank(matrix_A_comp)
% 
% disp('norm comp');
% norm(matrix_A_comp-matrix_A)
% 
% size(matrix_A)
% rank_temp=rank(matrix_A)

pinv_matrix_A=pinv(matrix_A);

matrix_Y=zeros(num_frame_channel_inv*num_pilot,num_rx_antenna);
for n1=1:num_frame_channel_inv
    for n2=1:num_rx_antenna
        for n3=1:num_pilot
            matrix_Y(num_pilot*(n1-1)+n3,n2)=rx_pilot(n2,n3,n1);
        end
    end
end

% % add to compare the result
% channel_mat_LS_freq_temp=pinv(matrix_temp)*matrix_Y;

channel_mat_LS=pinv_matrix_A*matrix_Y;
% change the format
channel_est_LS=zeros(num_rx_antenna,num_tx_antenna,channel_length);
for n1=1:num_rx_antenna
    for n2=1:num_tx_antenna
        for n3=1:channel_length
            channel_est_LS(n1,n2,n3)=channel_mat_LS(channel_length*(n2-1)+n3,n1);
        end
    end
end


% matrix_F_inv=zeros(channel_length,num_pilot);
% 
% for n1=1:channel_length
%     matrix_F_inv(n1,:)=exp(i*2*pi*(n1-1)*((firstnum_pilot:interval_pilot:...
%         num_carriers)-1)/num_carriers)/num_carriers;
% end
% 
% matrix_A_prime=zeros(num_pilot*num_frame_channel_inv,num_pilot*num_tx_antenna);
% vec_temp=zeros(num_pilot,1);
% for n1=1:num_frame_channel_inv
%     for n2=1:num_tx_antenna
%         for n3=1:num_pilot
%             vec_temp(n3)=tx_pilot(n2,n3,n1);
%         end
%         matrix_temp=diag(vec_temp);
%         matrix_A_prime(num_pilot*(n1-1)+1:num_pilot*n1,num_pilot*(n2-1)+1:num_pilot*n2)=matrix_temp;
%     end
% end
% 
% % size(matrix_A_prime)
% % rank_temp=rank(matrix_A_prime)
% 
% pinv_matrix_A_prime=pinv(matrix_A_prime);
% 
% matrix_Y=zeros(num_frame_channel_inv*num_pilot,num_rx_antenna);
% for n1=1:num_frame_channel_inv
%     for n2=1:num_rx_antenna
%         for n3=1:num_pilot
%             matrix_Y(num_pilot*(n1-1)+n3,n2)=rx_pilot(n2,n3,n1);
%         end
%     end
% end
% 
% channel_mat_LS_freq=pinv_matrix_A_prime*matrix_Y;
% 
% % change the format
% channel_est_LS_freq=zeros(num_rx_antenna,num_tx_antenna,num_pilot);
% for n1=1:num_rx_antenna
%     for n2=1:num_tx_antenna
%         for n3=1:channel_length
%             channel_est_LS_freq(n1,n2,n3)=channel_mat_LS_freq(num_pilot*(n2-1)+n3,n1);
%         end
%     end
% end
% 
% % get the estimated channel in time domain
% channel_est_LS=zeros(num_rx_antenna,num_tx_antenna,channel_length);
% vec_temp_2=zeros(num_pilot,1);
% for n1=1:num_rx_antenna
%     for n2=1:num_tx_antenna
%         for n3=1:num_pilot
%             vec_temp_2(n3)=channel_est_LS_freq(n1,n2,n3);
%         end
%         for n3=1:channel_length
%             channel_est_LS(n1,n2,n3)=matrix_F_inv(n3,:)*vec_temp_2;
%         end
%     end
% end

⌨️ 快捷键说明

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