Doubts regarding Kalman filter for channel estimation of OFDM system

Status
Not open for further replies.

madlab88

Newbie level 3
Joined
Apr 1, 2011
Messages
3
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,320
Hi everyone.

I am doing a research regarding channel tracking of MIMO OFDM system using Kalman filter. As of now I am just trying to simulate using matlab a channel estimation algorithm for a simple 1 transmit antenna to 1 receive antenna OFDM system.

For example, let’s consider a system such that the number of subcarriers, N=128; length of cyclic prefix is, cp=16; number of symbols, M=10; and no multipath propagation. So let’s say I have a matrix of channel gains (parameter to be estimated) of size 1 x (M(N+cp)), denoted as h. A transmit signal matrix of size 1 x (MN) denoted as x. And also an observation matrix of 1 x (MN), denoted as y. Consider that the entire transmit signal is used as pilot signal.

In general, Kalman filter equations are as below:

State equations:
h=Ah(n-1)+w
Observation equation:
Y=Xh+v

The Kalman filter predict and update equations are:
h(n|n-1)=A h(n-1|n-1)
P(n|n-1)=A P(n-1|n-1) A^H + Q
K=P(n|n-1) X^H / ( X P(n|n-1) X^H + R )^-1
h(n|n)=h(n|n-1) + K [ Y – X h(n|n-1)]
P(n|n)=[ I – KX ] P(n|n-1)

Assume that the state transition matrix A, and noise covariances Q and R are all known. So my question is this, when I am using those Kalman filter equations, what is the correct way of defining the X and Y?

I mean for example if for the k-th subcarrier and n-th OFDM symbol, is it correct for me to use x(n,k) and y(n,k) in one iteration, and the next iteration I use x(n,k+1) and y(n,k+1), then the next iteration x(n,k+2) and y(k+2) and so on... Is it correct to iterate on a subcarrier basis?

Or is it correct for me to iterate on an OFDM symbol level, meaning first iteration is x(1) as a matrix with all subcarriers for the first symbol, then the next iteration x(2) as a matrix with all subcarriers for the second symbol, and so on...

I find it difficult to express this problem in words lol, but anyone who can understand what I meant, please assist me. I have managed to simulate an OFDM system, where I have obtained the observation datas and transmit signal datas. What I don’t know at the moment is how to utilize them in the Kalman filter equations to obtain the respective estimates.

Thank you in advance.
 

Dear madlab88 & shams_313

As I mentioned in shams_313's thread, Kay's book would be great helpful your project. One of chapter deals with channel modeling and filtering about the kalman filter.

< Fundamentals of Statistical Signal Processing, Volume I: Estimation Theory (v. 1) by Steven M. Kay >

Here's my codes for single-carrier channel estimation using kalman filter. This codes is basically and based on a Kay's book.
I think... you can easily extend this code with multi-carrier system.

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%
% File Name : main_Kalman_CE.m
% Description: Time varying channel estimation using Kalman filter
%
% Date : 2009.8.3. (by chano.)
%
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %


clear all;
close all;


% % % % % % % % % % % % Parameter Define % % % % % % % % % % % %
N = 101; % number of observation
p = 2; % number of multipath
A = [0.99 0; 0 0.999];
sigma_u = 0.01;
Q = [sigma_u^2 0; 0 sigma_u^2];
sigma = sqrt(0.1); % observation noise S.D

H = [1; .9]; % h[-1]
h_hat_1 = [0; 0]; % initial channel state, h_hat[-1|-1]
M_1 = 100*eye(p); % initial MMSE val, M[-1|-1]

w = sigma*randn;
v = [zeros(5,1); ones(5,1);zeros(5,1); ones(5,1)];
v = [v;v;v;v;v;v]; % channel input, v[n]
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %


h_mat_True = zeros(p,N);
h_mat_Est= zeros(p,N);
K_mat= zeros(p,N);
M_mat= zeros(p,N);
x_free_vec = zeros(1,N);
x_vec= zeros(1,N);


for n = 1 : N-1

U = sigma_u*randn(p,1);
H = A*H+U; % unknown channel update
V = [ v(n+1);v ]; % known input
w = sigma*randn; % wgn
x_free = V'*H ; % Noiseless channel output
x = x_free + w; % Channel Output

h_hat_2 = A*h_hat_1;
M_2 = A*M_1*A'+Q;
K = ( M_2*V )./ ( sigma^2 + V'*M_2*V );
h_hat_1 = h_hat_2 + K*(x -V'*h_hat_2 );
M_1 = ( eye(p) - K*V' )*M_2;

% % % for plotting % % %
x_vec = x;
x_free_vec = x_free;

h_mat_True,n) = H;
h_mat_Est,n) = h_hat_2;

K_mat,n) = K;

M_mat,n) = [ M_1(1,1); M_1(2,2) ];

end

figure(1); %title('Realization of TDL coefficients');
subplot(2,1,1);
plot(h_mat_True(1,1:100), '--', 'LineWidth', 2);
hold on; grid on;
plot(h_mat_Est(1,1:100),'r', 'LineWidth', 2);
xlabel('Sample number, n');
ylabel('Tap weight, h_n[0]');
legend('True','Estimate');
ylim( [0 2] )

subplot(2,1,2);
plot(h_mat_True(2,1:100), '--', 'LineWidth', 2);
hold on; grid on;
plot(h_mat_Est(2,1:100), 'r', 'LineWidth', 2);
xlabel('Sample number, n');
ylabel('Tap weight, h_n[1]');
legend('True','Estimate');
ylim( [0 2] )


figure(2);
subplot(3,1,1);
plot(v(1:100), 'LineWidth', 2);
xlabel('Sample number, n');
ylabel('Channel input, v[n]');
ylim( [-1 2.5] )

subplot(3,1,2);
plot(x_free_vec(1,1:100), 'LineWidth', 2);
xlabel('Sample number, n');
ylabel('Noiseless channel, y[n]');
ylim( [-1 2.5] )

subplot(3,1,3);
plot(x_vec(1,1:100), 'LineWidth', 2);
xlabel('Sample number, n');
ylabel('Channel input, v[n]');
ylim( [-1 2.5] )


figure(3);
subplot(2,1,1);
plot(K_mat(1,1:100), 'LineWidth', 2);
xlabel('Sample number, n');
ylabel('Kalman gain, K_1[n]');
ylim( [-.6 1.1] )

subplot(2,1,2);
plot(K_mat(2,1:100), 'LineWidth', 2);
xlabel('Sample number, n');
ylabel('Kalman gain, K_2[n]');
ylim( [-.6 1.1] )


figure(4)
subplot(2,1,1);
plot(M_mat(1,1:100), 'LineWidth', 2);
xlabel('Sample number, n');
ylabel('Min. MSE, M_11[n]');
ylim( [0 0.2] )

subplot(2,1,2);
plot(M_mat(2,1:100), 'LineWidth', 2);
xlabel('Sample number, n');
ylabel('Min. MSE, M_22[n]');
ylim( [0 0.2] )
 
Thank you. Your post is a good reference for me.
 

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…