image thumbnail

Blind Channel estimation for MIMO systems using Linear Space time codes

by

 

Perform channel estimation for general STBC-MIMO systems using a subspace approach.

one_shot.m
%HELP one_shot
%
%Illustrate how to use the channel estimation script. This code generate a
%MIMO communication with Space time encoding. Then the channel is estimated
%through a subspace 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 STBCs( Alamouti, Spatial Multiplexing,
%>=1-rate STBCs). See publication [1] for details.
%
%Reference:
%
%[1] Ammar, N.; Ding, Z. "Blind Channel Identifiability for Generic
%Linear Space-Time Block Codes" IEEE Transactions on Signal Processing
%Volume 55, Issue 1, Jan. 2007 Page(s):202 - 217
%
%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 Subspace Channel Estimation: ');
estimated_channel_matrix=subspace_channel_estimation_STBC(received_signal,code_name,rate,num_code);
fprintf('\tOK\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