📄 mimo_ofdm_vblast_simulation.m
字号:
% MIMO Linear Prediction based semi-blind channel estimation for MIMO-OFDM
% by Feng Wan
% Begin Feb,2006, Last Edited Feb.15,2007
%
% close all;
clear all;
rand('seed',1);
randn('seed',1);
disp_start='******Begin Time:***********';
disp_time_start1='hours:';
disp_time_start2='minutes:';
date_start=date;
time_start=clock;
fprintf('%s \n',disp_start);
fprintf('%s \n',date_start);
fprintf('%s %d %s %d \n',disp_time_start1,time_start(4),disp_time_start2,time_start(5));
fprintf('%s \n \n',disp_start);
disp('******** Initialization: *********');
% Define parameters
MIMO_OFDM_system_par=MIMO_OFDM_system_parset;
MIMO_OFDM_link_par=MIMO_OFDM_link_parset;
if(MIMO_OFDM_system_par.num_frame~=MIMO_OFDM_system_par.num_frame_channel_inv)
error('num_frame~=num_frame_channel_inv!');
end
num_frame=MIMO_OFDM_system_par.num_frame;
num_frame_channel_inv=MIMO_OFDM_system_par.num_frame_channel_inv;
if(rem(num_frame,num_frame_channel_inv)==0) %%%%%%%%%% rem是求余数
num_frame_equ=num_frame/num_frame_channel_inv;
MIMO_OFDM_system_par.num_frame_equ=num_frame_equ;
else
error('Error! num_frame_channel_inv must divide num_frame.');
end
num_tx_antenna=MIMO_OFDM_system_par.num_tx_antenna;
num_rx_antenna=MIMO_OFDM_system_par.num_rx_antenna;
channel_length=MIMO_OFDM_system_par.channel_length;
num_carriers=MIMO_OFDM_system_par.num_carriers;
%%% BEGIN the Simulation for different SNR
num_SNR=3;
minmum_SNR=5;
step_SNR=5;
num_MonteCarlo=10;
if(MIMO_OFDM_system_par.enable_LS_algorithm==1)
MSE_LS_SNR=zeros(num_SNR,1);
BER_LS_SNR=zeros(num_SNR,1);
end
BER_realch_SNR=zeros(num_SNR,1);
channel_0_range_min=0;
channel_0_range_max=1;
%%% LOOP :Simulation for different SNR
for n_SNR=1:num_SNR %%% Simulation for different SNR
%%% LOOP :Simulation for different SNR
if(rem(n_SNR,1)==0)
fprintf('\n *** In the iterations for different SNR *** totoal: %d *** now: %d' ,num_SNR,n_SNR);
end
MIMO_OFDM_system_par.SNR=step_SNR*(n_SNR-1)+minmum_SNR;
%%% BEGIN the Monte Carlo Simulation
if(MIMO_OFDM_system_par.enable_LS_algorithm==1)
MSE_LS_MC=zeros(num_MonteCarlo,1);
BER_LS_MC=zeros(num_MonteCarlo,1);
end
BER_realch_MC=zeros(num_MonteCarlo,1);
%%% LOOP : Monte Carlo Simulation
for n_MonteCarlo=1:num_MonteCarlo %%% Monte Carlo Simulation
%%% LOOP : Monte Carlo Simulation
if(rem(n_MonteCarlo,100)==0)
fprintf('\n *** In the Monte Carlo iterations *** totoal: %d *** now: %d' ,num_MonteCarlo,n_MonteCarlo);
end
% MIMO OFDM channel
% disp('******** Generate the channel: *********');
[channel_matrix_all,channel_matrix_equivalent_all,channel_matrix_upsampling_all,MIMO_OFDM_link_par]=...
MIMO_OFDM_channel_generation(MIMO_OFDM_system_par,MIMO_OFDM_link_par,...
channel_0_range_min,channel_0_range_max);
if(MIMO_OFDM_system_par.pulse_type==1)
channel_matrix=channel_matrix_all; % here channel_matrix=channel_matrix_all
channel_matrix_equivalent=channel_matrix_equivalent_all;
channel_matrix_upsampling=channel_matrix_upsampling_all;
% norm_channel_matrix=0;
% norm_channel_matrix_equivalent=0;
% for n1=1:size(channel_matrix,3)
% norm_channel_matrix=norm_channel_matrix+sum(sum(abs(channel_matrix(:,:,n1,1).^2)));
% end
%
% for n1=1:size(channel_matrix,3)
% norm_channel_matrix_equivalent=norm_channel_matrix_equivalent+...
% sum(sum(abs(channel_matrix_equivalent(:,:,n1,1).^2)));
% end
else
channel_matrix=channel_matrix_all;
channel_matrix_equivalent=channel_matrix_equivalent_all;
channel_matrix_upsampling=0;
% norm_channel_matrix=0;
% norm_channel_matrix_equivalent=0;
% for n1=1:size(channel_matrix,3)
% norm_channel_matrix=norm_channel_matrix+sum(sum(abs(channel_matrix(:,:,n1,1).^2)));
% end
%
% for n1=1:size(channel_matrix,3)
% norm_channel_matrix_equivalent=norm_channel_matrix_equivalent+...
% sum(sum(abs(channel_matrix_equivalent(:,:,n1,1).^2)));
% end
end
norm_channel_matrix=1;
norm_channel_matrix_equivalent=1;
% MIMO OFDM transmiter
[tx_signal_time,tx_data_pilot]=MIMO_OFDM_transmiter(MIMO_OFDM_system_par);
% MIMO OFDM channel
MIMO_OFDM_channel_par=0;
[rx_signal_time]=MIMO_OFDM_channel(MIMO_OFDM_system_par,tx_signal_time,...
channel_matrix,channel_matrix_upsampling);
% MIMO OFDM receiver
[rx_data_pilot_frequency,rx_data_depulsed_time]=MIMO_OFDM_receiver(rx_signal_time,MIMO_OFDM_system_par);
[BER] = MIMO_OFDM_VBLAST_receiver(channel_matrix_equivalent(:,:,:,1),tx_data_pilot,...
rx_data_pilot_frequency,MIMO_OFDM_system_par);
BER_realch_MC(n_MonteCarlo)=BER;
if(MIMO_OFDM_system_par.enable_LS_algorithm==1)
[channel_est_LS]=MIMO_OFDM_LS(rx_data_pilot_frequency,tx_data_pilot,MIMO_OFDM_system_par);
if(MIMO_OFDM_system_par.pulse_type==1)
MSE_LS_MC(n_MonteCarlo)=sum(sum(sum(abs(channel_matrix_equivalent(:,:,:,1)-channel_est_LS).^2)))/...
norm_channel_matrix_equivalent;
else
MSE_LS_MC(n_MonteCarlo)=sum(sum(sum(abs(channel_matrix_equivalent(:,:,:,1)-channel_est_LS).^2)))/...
norm_channel_matrix_equivalent;
end
[BER] = MIMO_OFDM_VBLAST_receiver(channel_est_LS,tx_data_pilot,rx_data_pilot_frequency,MIMO_OFDM_system_par);
BER_LS_MC(n_MonteCarlo)=BER;
end
end % End the iterations for Monte Carlo Simulations
% disp('******** End the iterations for Monte Carlo Simulations: *********');
if(MIMO_OFDM_system_par.enable_LS_algorithm==1)
MSE_LS_SNR(n_SNR)=sum(MSE_LS_MC)/num_MonteCarlo;
BER_LS_SNR(n_SNR)=sum(BER_LS_MC)/num_MonteCarlo;
end
BER_realch_SNR(n_SNR)=sum(BER_realch_MC)/num_MonteCarlo;
%%% LOOP :Simulation for different SNR
end %%% Simulation for different SNR
%%% LOOP :Simulation for different SNR
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%% End the iterations for the equivalent frames
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
disp(' ');
disp('BER using the real channel:');
BER_realch_SNR
if(MIMO_OFDM_system_par.enable_LS_algorithm==1)
disp('MSE of channel estimation using LS:');
MSE_LS_SNR
disp('BER using the LS channel estimate:');
BER_LS_SNR
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -