image thumbnail

Blind Channel estimation for MIMO systems using Orthogonal Space time codes

by

 

Perform channel estimation for OSTBC-MIMO systems.

one_shot.m
%HELP one_shot
%
%Illustrate how to use the channel estimation script. This code generate a
%MIMO communication with Orthogonal Space time encoding. Then the channel is estimated
%through a Second Order Statistic-based approach using the knowledge of the Space time code
%structure. Note that the method is not able to estimate correctly the
%channel for non-identifiable OSTBCs( Alamouti,...). See publication [1,2] for details.
%
%Reference:
%
% [1] S. Shahbazpanahi, A.B. Gershman, and J.H. Manton, "Closed
% form blind mimo channel estimation for othogonal space-time
% codes," IEEE Transactions on Signal Processing, vol. 53, no.
% 12, pp. 4506{4517, 2005.
% [2] J. Va and I. Santamara, "On the blind identifiability of 
% orthogonal space-time block codes from second order statistics",
% IEEE Transactions on Information Theory, vol.54, no.2, pp.709-722,
% February 2008 
%
%Programmed by V. Choqueuse (vincent.choqueuse@gmail.com)

%Simulation parameters

N=512;                  %Number of symbols to be transmitted 
code_name='OSTBC3';     %Space time code (see file space_time_coding to obtain the list of supported STBC)
rate='3/4';             %Space time code (see file space_time_coding to obtain the list of supported STBC)
num_code=1;             %Space time code (see file space_time_coding to obtain the list of supported STBC)
modulation='PSK';       %supported modulation PSK, QAM,
state_nb=4;             %modulation with 4 states (4-PSK -> QPSK)
nb_receivers=4;         %Number of 4 receivers
snr=20;                  %Signal to noise ratio (dB)

close all;
fprintf('\n+-----------------------------------+\n');
fprintf('|   Simulate a MIMO communication   |\n');
fprintf('+-----------------------------------+\n\n');

%% extract space time block coding information
code_rate=str2num(rate);
[nb_emitters,code_length]=size(space_time_coding(0,code_name,rate,num_code,1));
Nb_symbole_code=code_length*str2num(rate);

%% Generate a symbol sequence randomly. The symbols belong to the set of
%%integer: [0 state_nb-1]
fprintf('- Generate %d random symbols: ',N);
symbols=randint(1,code_rate*N,state_nb);
fprintf('\t\t\tOK\n');
  
%% Modulate the symbols
fprintf('- Apply %d-%s constellation: ',state_nb,modulation);    
switch modulation
    case 'PSK'
        modulator=modem.pskmod(state_nb);
    case 'QAM'
        modulator=modem.qammod(state_nb);
end       
modulated_symbols=modulate(modulator,symbols);
fprintf('\t\t\tOK\n');

%% perform space time encoding
fprintf('- Perform %s-%s STBC encoding:',rate,code_name);
[STBC_blocs]=space_time_coding(modulated_symbols,code_name,rate,num_code);
fprintf('\t\tOK\n');

%% Create a random channel matrix
fprintf('- Generate a %d * %d Random Channel: ',nb_receivers,nb_emitters);
channel_matrix=sqrt(0.5)*(randn(nb_receivers,nb_emitters)+i*randn(nb_receivers,nb_emitters));
received_signal=channel_matrix*STBC_blocs;
fprintf('\t\tOK\n');

%% Apply AWGN noise
fprintf('- Apply %d dB additive noise: ',snr);
noise_variance=1/(10^(snr/10));
bruit=(sqrt(noise_variance/2))*(randn(nb_receivers,size(STBC_blocs,2))+...
                                i*randn(nb_receivers,size(STBC_blocs,2)));                          
received_signal=received_signal+bruit;
fprintf('\t\t\tOK (noise variance=%f)\n',noise_variance);

%% Perform Channel estimation
fprintf('- Perform SOS-based Channel Estimation: ');
estimated_channel_matrix=SOS_channel_estimation_OSTBC(received_signal,code_name,rate,num_code);
fprintf('OK\n');
fprintf('- Compute pinv(H_est)*H:\n');

pinv_H_est_H=pinv(estimated_channel_matrix)*channel_matrix   %close to a diagonal matrix for correct estimation
fprintf(' (Result must be closed to a diagonal matrix with equal diagonal element)\n')

Contact us