📄 mimo_ofdm_ls.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 + -