www.gusucode.com > MATLAB,PSK_QAM误码率源码程序 > MATLAB,PSK_QAM误码率源码程序/subspace_channel_identification_4_STBC/subspace_channel_estimation_STBC.m

    function [channel]=subspace_channel_estimation_STBC(received_signal,code_name,rate,num_code)

%HELP: subspace_channel_estimation_STBC 
%
%Blind Subspace channel identification for MIMO-STBC systems. The method
%uses the knowledge of the Space time code to extract the channel. The
%method doesn't work for non-identifiable STBCs (see publication [1] for
%details). For identifiable STBCs, there is one scalar ambiguity after
%channel estimation. 
%
%Input: - received signal
%       - code_name: The code name ('Alamouti','OSTBC3',...)
%       - code_rate: The code rate ('1','1/2',...)
%       - num_code: The code number (1,2,...)
%Ouput: - channel
%       - separated data
%
%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)

verbose=1;

%% extract space time block coding information
Rendement=str2num(rate);
[nb_emitters,code_length]=size(space_time_coding(0,code_name,rate,num_code,1));
nb_symbols_block=code_length*str2num(rate);
[nb_receiver,N]	= size(received_signal); 
Nb_bloc=N/code_length;

%extract space time codign information

for indice=1:nb_symbols_block
    real_part=zeros(1,nb_symbols_block);
    real_part(indice)=1;
    imag_part=zeros(1,nb_symbols_block);
    imag_part(indice)=i; 
    Ak=space_time_coding(real_part,code_name,rate,num_code);  
    Bk=space_time_coding(imag_part,code_name,rate,num_code);   
    C(:,indice)=Ak(:);
    C(:,indice+nb_symbols_block)=Bk(:);
end

%% rewrite the receiving sample
R=[];
for indice=1:Nb_bloc
   received_bloc=received_signal(:,(indice-1)*code_length+1:indice*code_length);
   R(:,indice)=received_bloc(:);
end    
size(R);

%% extract a basis NL for the left null space of R without noise
[U,D,V]=svd(R);
NL=U(:,2*nb_symbols_block+1:end);

%% Construct the Phi matrix
Big_E=[];
for indice=1:code_length
   %contruct Ek
   Ek=[zeros(nb_receiver*(indice-1),nb_receiver);...
       eye(nb_receiver);...
       zeros(nb_receiver*(code_length-indice),nb_receiver)];
   Big_E=[Big_E;kron(eye(nb_emitters),Ek)];    
end   

%% perform channel estimation
phi=kron(C.',NL')*Big_E;
[U2,D2,V2]=svd(phi);
h_est=V2(:,nb_receiver*nb_emitters);
channel=reshape(h_est,nb_receiver,nb_emitters);

%Display the result
if verbose==1
   transmitted_signal=pinv(channel)*received_signal;
   for indice=1:nb_emitters
        scatterplot(transmitted_signal(indice,:));
        title(sprintf('Extracted signal nb %d',indice));
        grid;
   end 
end