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.