Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

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(n)=Ah(n-1)+w(n)
Observation equation:
Y(n)=X(n)h(n)+v(n)

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(n)=P(n|n-1) X(n)^H / ( X(n) P(n|n-1) X(n)^H + R )^-1
h(n|n)=h(n|n-1) + K(n) [ Y(n) – X(n) h(n|n-1)]
P(n|n)=[ I – K(n)X(n) ] 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(n) and Y(n)?

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(n) ]; % 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(n) = x;
x_free_vec(n) = 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

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top