Hi everyone,

I am trying to simulate an M-QAM MIMO system, and I want to decode the received signal using QR decomposition and sphere decoding.

However, I am struggling to understand how to implement the simple tree sphere decoding algorithm.

Here's my understanding so far:

Given a receive signal as follows:

1. Y = HX + N;

where X is a K x 1 vector consisting of K MQAM data symbols, H is a K x K fading matrix, N is a

K x 1 AWGN vector, and Y is the K x 1 received vector.

We perform QR detection as follows:

2. H = QR;

where Q is a K x K Unitary matrix, and R is a upper-triangular matrix with entry R(i, j),

with i and j being the row and column indices respectively.

Then we equalise the receive signal in 1. as:

3. Z = (Q^H)*Y = RX + (Q^H)*N , where Q^H is the Hermitian transpose of Q.

I now want to perform Sphere decoding based on 3. This is where I am struggling.

My best attempt at coding this algorithm in Matlab is shown below (Assuming K = 8, and assuming an arbitrary radius d):

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% ## Inputs:

% # R, upper triangular matrix

% # Z,vector receive signal

% # d, radius of sphere

%

% ## Output

% # X_hat, vector of estimated symbols

n = 8; % n => K

d_vector = zeros(1, n);

d_vector(n) = d;

Upp_bound = zeros(1, n);

Low_bound = zeros(1, n);

minR = d_vector(n);

intersum = zeros(1, n);

intersum(n) = Z(n);

Upp_bound(n) = (d_vector(n) + Z(n))/R(n, n);

Low_bound(n) = (-d_vector(n) + Z(n))/R(n, n);

X_hat = zeros(1, n);

% ## begin algorithm

if Low_bound(n) > Upp_bound(n)

return null;

else

X_hat(n) = Low_bound(n);

end

k = n;

while X_hat(n) Upp_bound(k)

k = k + 1;

X_hat(k) = X_hat(k) + 1;

else

if k > 1

k = k - 1;

d_vector(k) = sqrt(d_vector(k)^2 - (intersum(k + 1) - R(k + 1, k + 1)*X_hat(k + 1))^2);

intersum(k) = Z(k) - R(k, (k + 1):n)*X_hat((k + 1):n);

Upp_bound(k) = (d_vector(k) + intersum(k))/R(k, k);

Low_bound(k) = (-d_vector(k) + intersum(k))/R(k, k);

if Low_bound(k) > Upp_bound(k)

k = k + 1;

X_hat(k) = X_hat(k + 1);

else

X_hat(k) = Low_bound(k);

end

else

while X_hat(k) norm(Z - R*X_hat, 'fro')^2

X_est_vector = X_hat; %found X_hat

minR = norm(Z - R*X_hat, 'fro')^2;

end

X_hat(k) = X_hat(k) + 1;

end

k = k + 1;

X_hat(k) = X_hat(k) + 1;

end

end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Please could you tell me where I might be going wrong.

Thank you.

Similar questions and discussions