(8 votes, average: 4.00 out of 5)

# MIMO with Zero Forcing Successive Interference Cancellation equalizer

by on November 9, 2008

The post on MIMO with Zero Forcing equalizer discussed a probable way of equalizing a 2×2 MIMO channel. The simulated results with the 2×2 MIMO system with zero forcing equalizer showed matching results as obtained in for a 1×1 system for BPSK modulation in Rayleigh channel. In this post, we will try to improve the bit error rate performance by trying out Successive Interference Cancellation (SIC). We will assume that the channel is a flat fading Rayleigh multipath channel and the modulation is BPSK.

The background material on the MIMO channel has been described in the post on Zero Forcing equalizer. The text is repeated again for easy readability.

## 2×2 MIMO channel

In a 2×2 MIMO channel, probable usage of the available 2 transmit antennas can be as follows:

1. Consider that we have a transmission sequence, for example $\{x_1, x_2, x_3, \ldots, x_n \}$

2. In normal transmission, we will be sending $x_1$in the first time slot, $x_2$in the second time slot, $x_3$ and so on.

3. However, as we now have 2 transmit antennas, we may group the symbols into groups of two. In the first time slot, send $x_1$and $x_2$from the first and second antenna. In second time slot, send $x_3$ and $x_4$from the first and second antenna, send $x_5$ and $x_6$in the third time slot and so on.

4. Notice that as we are grouping two symbols and sending them in one time slot, we need only $\frac{n}{2}$ time slots to complete the transmission – data rate is doubled !

5. This forms the simple explanation of a probable MIMO transmission scheme with 2 transmit antennas and 2 receive antennas.

Figure: 2 Transmit 2 Receive (2×2) MIMO channel

## Other Assumptions

1. The channel is flat fading – In simple terms, it means that the multipath channel has only one tap. So, the convolution operation reduces to a simple multiplication. For a more rigorous discussion on flat fading and frequency selective fading, may I urge you to review Chapter 15.3 Signal Time-Spreading from [DIGITAL COMMUNICATIONS: SKLAR]

2. The channel experience by each transmit antenna is independent from the channel experienced by other transmit antennas.

3. For the $i^{th}$ transmit antenna to $j^{th}$ receive antenna, each transmitted symbol gets multiplied by a randomly varying complex number $h_{j,i}$. As the channel under consideration is a Rayleigh channel, the real and imaginary parts of $h_{j,i}$ are Gaussian distributed having mean $\mu_{h_{j,i}=0$ and variance $\sigma^2_{h_{j,i}}=\frac{1}{2}$.

4. The channel experienced between each transmit to the receive antenna is independent and randomly varying in time.

5. On the receive antenna, the noise$n$ has the Gaussian probability density function with

$p(n) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{\frac{-(n-\mu)^2}{2\sigma^2}$ with $\mu=0$ and $\sigma^2 = \frac{N_0}{2}$.

7. The channel $h_{j,i}$ is known at the receiver.

## Zero forcing equalizer for 2×2 MIMO channel

Let us now try to understand the math for extracting the two symbols which interfered with each other. In the first time slot, the received signal on the first receive antenna is,

$y_1 =h_{1,1}x_1 + h_{1,2}x_2 + n_1 = [h_{1,1}\ h_{1,2}] \left[\begin{eqnarray}x_1 \\ x_2 \end{eqnarray}\right]+n_1$.

$y_2 = h_{2,1}x_1 + h_{2,2}x_2 + n_2 = [h_{2,1}\ h_{2,2}] \left[\begin{eqnarray}x_1 \\ x_2\end{eqnarray}\right]+n_2$.

where

$y_1$, $y_2$ are the received symbol on the first and second antenna respectively,

$h_{1,1}$ is the channel from $1^{st}$ transmit antenna to $1^{st}$ receive antenna,

$h_{1,2}$ is the channel from $2^{nd}$ transmit antenna to $1^{st}$ receive antenna,

$h_{2,1}$ is the channel from $1^{st}$ transmit antenna to $2^{nd}$ receive antenna,

$h_{2,2}$ is the channel from $2^{nd}$ transmit antenna to $2^{nd}$ receive antenna,

$x_1$, $x_2$are the transmitted symbols and

$n_1,\ n_2$ is the noise on $1^{st}, 2^{nd}$ receive antennas.

For convenience, the above equation can be represented in matrix notation as follows:

$\begin{eqnarray}\left[\begin{eqnarray}y_1 \\ y_2\end{eqnarray}\right] & = & {\left[\begin{array}{cc}h_{1,1}& h_{1,2} \\h_{2,1}&h_{2,2}\end{array}\right]}\left[\begin{eqnarray}x_1 \\ x_2 \end{eqnarray}\right]+\left[\begin{eqnarray}n_1\\n_2 \end{eqnarray}\right]\end{eqnarray}$.

Equivalently,

$\mathbf{y} = \mathbf{H}\mathbf{x} + \mathbf{n}$

To solve for $\mathbf{x}$, The Zero Forcing (ZF) linear detector for meeting this constraint $\mathbf{WH=I}$. is given by,

$\mathbf{W}=\mathbf{(H^HH)^{-1}H^H}$.

To do the Successive Interference Cancellation (SIC), the receiver needs to perform the following:

## Zero Forcing with Successive Interference Cancellation (ZF-SIC)

Using the Zero Forcing (ZF) equalization approach described above, the receiver can obtain an estimate of the two transmitted symbols $x_1$, $x_2$, i.e.

$\left[\begin{array}\hat{x}_1\\\hat{x}_2\end{array}\right] = \mathbf{(H^HH)^{-1}H^H}\left[\begin{array}y_1\\y_2\end{array}\right]$.

Take one of the estimated symbols (for example $\hat{x}_2$) and subtract its effect from the received vector $y_1$and $y_2$, i.e.

$\left[\begin{array}r_1\\r_2\end{array}\right] = \left[\begin{array}{ccl}y_1 &- & h_{1,2}&\hat{x}_2\\y_2 & - & h_{2,2}&\hat{x}_2\end{array}\right] = \left[\begin{array}{clc}h_{1,1}&x_1 &+ &n_1 \\ h_{2,1}&x_1 &+ &n_2\end{array}\right]$.

Expressing in matrix notation,

$\left[\begin{array}r_1\\r_2\end{array}\right] = \left[\begin{array} h_{1,1}&\\h_{2,1}\end{array}\right]x_1 + \left[\begin{array}n_1\\n_2\end{array}\right]$,

$\mathbf{r} = \mathbf{h}x_1+\mathbf{n}$

The above equation is same as equation obtained for receive diversity case. Optimal way of combining the information from multiple copies of the received symbols in receive diversity case is to apply Maximal Ratio Combining (MRC).

The equalized symbol is,

$\hat{\mathbf{x}}_1 = \frac{\mathbf{h}^H\mathbf{r}}{\mathbf{h}^H\mathbf{h}}$.

This forms the simple explanation for Zero Forcing Equalizer with Successive Interference Cancellation (ZF-SIC) approach.

## Simulation Model

The Matlab/Octave script performs the following

(a) Generate random binary sequence of +1′s and -1′s.

(b) Group them into pair of two symbols and send two symbols in one time slot

(c) Multiply the symbols with the channel and then add white Gaussian noise.

(d) Equalize the received symbols with Zero Forcing criterion

(e) Take the symbol from the second spatial dimension, subtract from the received symbol

(f) Perform Maximal Ratio Combining for equalizing the new received symbol

(g) Perform hard decision decoding and count the bit errors

(h) Repeat for multiple values of $\frac{E_b}{N_0}$ and plot the simulation and theoretical results.

Figure: BER plot for BPSK in 2×2 MIMO channel with Zero Forcing Successive Interference Cancellation equalization

## Observations

Compared to Zero Forcing equalization alone case, addition of successive interference cancellation results in around 2.2dB of improvement for BER of $10^{-3}$.

The improvement is brought in because decoding of the information from the first spatial dimension ($x_1$) has a lower error probability that the symbol transmitted from the second dimension. However, the assumption is that $x_2$ is decoded correctly may not be true in general. We can discuss alternate approaches in future posts.

## References

D id you like this article? Make sure that you do not miss a new article by subscribing to RSS feed OR subscribing to e-mail newsletter. Note: Subscribing via e-mail entitles you to download the free e-Book on BER of BPSK/QPSK/16QAM/16PSK in AWGN.

Razi December 21, 2012 at 8:36 pm

Dear Krishna,

Can you guide me on the accuracy of the BER analysis based on the number of times the Monte Carlo simulations are run?

I want to know after how many Monte Carlos can I be sure that my BER graph is accurate for a Rayleigh Fading Channel

Krishna Sankar December 25, 2012 at 5:43 am

@Razi: Typically, one need to run the simulations sufficiently large number of times to ensure that the simulation results are accurate. When computing the bit error rate, one solution is to ensure that we have atleast 100 errors for each Eb/N0 point

samyak June 14, 2012 at 3:02 pm

i want matlab code of parellel interference cancellation and sic

Krishna Sankar June 26, 2012 at 5:54 am

@samyak: what is parallel interference cancellation? my understanding was that we estimate each symbol and remove then one after the other.

Gidy Florez June 8, 2012 at 10:26 pm

Hi krishna!

Excellent work.

I’m trying to implement physically a 2×2 MIMO system, do you think I would need to add something else (besides mixers, amplifiers and LNAs) that the code for the transmission and reception as used in matlab?

Krishna Sankar June 11, 2012 at 5:07 am

@Gidy: Multipath channel + equivalent model for all the receive blocks should typically suffice

Murray Lefevers May 21, 2012 at 2:33 am

No offence to the writer but i’ve already spotted like 2-3 typo’s and havent even finished reading lol — do they charge you for spellchecker in your time zone (just kidding) nice layout though I’ll give you that

Krishna Sankar May 23, 2012 at 5:25 am

@Murray Lefevers: Aaah… sorry for the typos. On hindsight, am not a good proof reader…have to improve on that

Siddappa Karabannavar May 9, 2012 at 7:12 pm

Hi krishna
I want to build simple 2×2 MIMO-CDMA system using 16-QAM and zero forcing detector in MATLAB. So please help….

Krishna Sankar May 15, 2012 at 5:39 am

@Siddappa: I have discussed MIMO BPSK with zero-forcing equalizer in one of the post
http://www.dsplog.com/2008/10/24/mimo-zero-forcing/
It should be straightforward to extend it to 16qam case

krishna April 9, 2012 at 12:43 am

hi can u help me on interference cancellation on mimo

Krishna Sankar April 10, 2012 at 4:50 am

@krishna: Did this post help?

Thanh April 7, 2012 at 4:58 pm

Hi Krishna Sankar,

Why to calculate the inverse matrix as in the source code rather than using “inv” and “transpose” code in Matlab?
% Inverse of a [2x2] matrix [a b; c d] = 1/(ad-bc)[d -b;-c a]

Tks!

2.

Krishna Sankar April 8, 2012 at 5:01 am

@Thanh: Wanted to vectorize the operations (i.e. without for loops) to make the execution fast in Matlab. Hence did not use inv()

rinky January 5, 2012 at 1:19 pm

hello sir,
is it possible that we use the ZF receiver with 2*1 ,and 1*2 antenna system.?
please guide me how is that possilbe?

Krishna Sankar January 6, 2012 at 6:14 am

@rinky: Some post on
a) 1 transmit antenna, 2 receive antenna
Maximal ratio combining (MRC) http://www.dsplog.com/2008/09/28/maximal-ratio-combining/
Equal gain combining http://www.dsplog.com/2008/09/19/equal-gain-combining/

b) 2 transmit antenna, 1 receive antenna
Transmit beamforming
http://www.dsplog.com/2009/04/13/transmit-beamforming/

nazia parveen July 19, 2010 at 1:21 pm

matlab code interference cancellation in mimo

nazia parveen July 19, 2010 at 1:15 pm

i nazia is working with interference cancellation in mimo i want matlab code parallel interference cancellation

Krishna Sankar July 23, 2010 at 7:05 am

@nazia: Hope this post helps.

nazia parveen July 19, 2010 at 12:08 pm

noise cancellation mat lab code in mimo pl help me

nazia parveen July 19, 2010 at 11:49 am

i nazia want matlab code for interference cancellation using mimo system

nazia parveen July 19, 2010 at 11:38 am

i nazia parveen want matlab code for interference cancellation using mimo using parallel interference cancellation algorithm

nazia parveen July 17, 2010 at 12:17 pm

i nazia working as professor is guiding project on interference cancellation using mimo please help me for code using v-blast

eng_dina June 17, 2010 at 3:54 am

please Mr. Krishna Sankar Iwant to build simple mimo ofdm system to simulate snr vs. ber but I want it the mimo system to be flexable not only 2×2 so ican change the number of transmitter and recievers please help me if you have the matlab code please send it to me

Krishna Sankar June 21, 2010 at 5:11 am

@eng_dina: In most of the articles which I have discussed I have used 2×2 MIMO case. And to increase the speed of the Matlab simulations, I have not used inv() operation in Matlab. You can try using inv() operation and increase the speed of the simulations

mannou April 11, 2010 at 2:45 pm

hello,
with match respect can you mr send me a explain shéma of MMSE,ZF,ZF_SICand MMSE_SIC.
Thank you

Krishna Sankar April 14, 2010 at 5:05 am
Zakia March 21, 2010 at 2:16 pm

Hi,
Thanks for your high quality contribution in this site.Could you please mention some refernce books for understanding the theory what you have used here.

Krishna Sankar March 28, 2010 at 1:56 pm

@Zakia: Some of the books which I refer are listed here
http://www.dsplog.com/2008/12/24/books/

minh November 25, 2009 at 6:36 pm

I have done simulation with MMSE-SIC but there is no diversity gain compared with MMSE equalizer. I have tried to find out the reason but I haven’t got it. Would you please give me an explain. Thank you in advance

Krishna Sankar December 7, 2009 at 4:36 am

@minh: I have not compared MMSE-SRC vs MMSE. However, from my results comparing ZF-SIC vs ZF, I can see gains.
http://www.dsplog.com/2009/04/21/six-equalizers-for-v-blast/

minh December 10, 2009 at 8:27 pm

Sorry, I found my mistake, MMSE-MRC is still better than MMSE . By the way, thank you so much for your post. It helps me a lot!

Krishna Sankar December 11, 2009 at 6:15 am

jhon November 3, 2009 at 10:35 am

what exactly is the meaning of successive interfernce cancellation?

when we subtract x2 from y1 to get x1,,, does this mean that we are cancelling noise common to both spatial stream?

thanks

Krishna Sankar November 8, 2009 at 8:40 am

@jhon: No, we form an estimate of one symbol. Then use that estimate to subtract the interference caused by that symbol to the other symbol.

w@p July 13, 2009 at 5:58 pm

hi krishna………hi sir…………
I am working multiuser detection successive interference cancellation with goldcode 31 but still error .can you help me?
emailme in yutt.pangestu@gmail.com. thanks…..
this the programs :

*main

clc,clear all;
format long;

SNR_dB=0:5:30;
P=[1 1 1 1 1];
Nb=10000;
squence=gold_codes;
chan_type=2;

BER_sic=sim_sic(SNR_dB, P, Nb, squence, chan_type)

semilogy(SNR_dB, BER_sic, ‘bv-’)
xlabel(‘SNR dalam dB’);
ylabel(‘probabilitas bit error’);
grid;
legend(‘sic awgn’);
title(‘simulasi sic’);
hold on;

*sim_sic

% BER_sic=sim_sic_fn(SNR_dB, P, Nb, code_matrix, chan_type)
% return bit error rate of the sic receiver in AWGN or rayleigh fading
%
% PARAMETER:
% SNR_dB=signal-ti-nopise ratio in dB
% P=power control vector, P(i)=transmitted power of i-th user
% Nb=number of transmitted bit
% code_matrix=matrix of the spreading code used
% chan_type=channel type(1=AWGN, 2=rayleigh fading channel)
%
% output:
% BER_sic=bit error of the sic receiver
%
function BER_sic=sim_sic(SNR_dB, P, Nb, squence, chan_type)

BER_sic=zeros(size(SNR_dB));
K=length(P); %number of user

G(:,1)=squence(33,:)’;
G(:,2:K)=squence(1:K-1,:)’;

%generate the crosscorrelation matrix R
R=G’*G;

for p=1:length(SNR_dB),

SNR=10^(SNR_dB(p)/10);
SNRchip=SNR/N;

disp(‘processing…’)
error_count=0;

%loop for Nb symbol bits
for n=1:Nb,

%generate a bernoulli symbol, i.e. b=1 or 0
b=input_symbols(K,1);

if chan_type==1
A=sqrt(P’);
elseif chan_type==2
A=rayleigh(1,K).*sqrt(P’);
else
disp(‘invalid channel type’);
dbquit;
end

%transmitted sinal
X=G*(A.*b);

%generate the observed data
r=awgn_chan(x,SNRchip);

%assume that the codes are known and that they are
%perfectly synchronized
%matched filter output
y=G’*r;

%short users according tho their received powers
[y_sorted,sort_order]=sort(y.^2);
user_index=find(sort_order==1);
y_sorted=y(sort_order);
A_sorted=A(sort_order);
R_sorted=R(sort_order,sort_order);

%detect users successively
b_hat=zeros(K,1);
b_hat(K)=sign(y_sorted(K));

for u=K-1:-1:1,
b_hat(u)=sign(y_sorted(u)-sum(A_sorted(u+1:K).*R_sorted(u+1:K,u).*b_hat(u+1:K)));
end
b_hat(1)=sign(y_sorted(1)-interference_estimate(1));

%if detected symbol is incerrect, increment the error_count
if b_hat(user_index)~=b(1)
error_count=error_count+1;
end

end

%carculating Bit Error rate i.e. the percentage of erroneous
%symbol estimates
BER_sic(p)=error_count/Nb;
end

*awgn_chan

% r=awgn_chan(signal,SNR)
% return the awgn channel output given the input signal and the SNR
%
% PARAMETERS:
% Vsignal=normalized anti podal signal (-1,+1); can be a matrix
% SNR=linear signal-to-noise ratio for the AWGN channel
%
% OUTPUT:
% r=AWGN channel output
%
function r=awgn_chan(signal,SNR)

sigma=1/sqrt(SNR);
r=signal+sigma*randn(size(signal));

*rayleigh

% A=rayleigh(omega,K)
% return a vector of rayleigh-distrimuted random variables
%
% PARAMETERS:
% omega=variance of the rayleigh-distributed random variables
% K=length of vector (i.e. number of users)
%
% OUTPUT:
% A=vector of rayleigh-distributed RVS
%
function A=rayleigh(omega,K)
A=sqrt(omega*log(1./(1-rand(K,1))));

*input_symbols

% b=input_symbols(K,Nb)
% Return the randomly generated antipodal symbol(+1,-1)
%
% PARAMETERS:
% K=number of users
% Nb=number of symbol for each user
%
% OUTPUT:
% b=the randomly generated antipodal symbols
%
function b=input_symbols(K,Nb)
b=sign(rand(K,Nb)-0.5);

*gold_codes

function [gold_codes]=gold_codes
clc;
Xa=[0 0 0 1 0];
Xb=[0 0 0 1 0];
t=1:1:31;
for i=1:31

Xa=[mod(Xa(3)+Xa(5),2) Xa(1:4)];
seq1(i)=Xa(5),
Xb=[mod(Xb(2)+Xb(4)+Xb(5),2) Xb(1:4)];
seq2(i)=Xb(5),
gold_codes(i)=mod(Xa(5)+Xb(5),2);
end

thanks………

Krishna Sankar July 15, 2009 at 5:18 am

@ w@p: Sorry, due to time constraints, may I refuse to debug the code

mohamed July 3, 2009 at 4:58 pm

hi good work thank u
i want to ask if we used alamouti code and we want to do the mmse-sic reciever
what will be different than the above algorithm?

Krishna Sankar July 6, 2009 at 5:47 pm

@mohamed: Well, with Alamouti coding we do not need MMSE-SIC receiver. A Zero Forcing equalization is optimal.

samira June 25, 2009 at 1:55 pm

Hi,
Iwould like knowing if we can use VBLAST with multiuser(CDMA).If yes you can send me a code matlab for that.Think you.

Krishna Sankar June 26, 2009 at 5:14 am

@samira: The modeling of V-BLAST and multiuser communication is kind of similar (in V-BLAST the other spatial stream is the interferer and in multiuser the other user is the interferer). I did not quite understand your intention, when you said you want to put together V-BLAST with multi user.

shah May 2, 2009 at 5:54 pm

Hi Krishna
This is very useful site,keep it up, do u have any MATLAB code for multicarrier delay diversity moduulation(MDDM)for MIMO

Krishna Sankar May 12, 2009 at 4:58 am

@shah: Thanks.
No, I have not tried modeling multi carrier delay diversity modulation.

Communications_engineer April 21, 2009 at 8:27 pm

Hello Krishna, can you start tutorials for multiuser detection for cdma and ofdma. Thanks

Krishna Sankar April 30, 2009 at 5:02 am

@Communications_engineer: Sure. Further, the articles of receiver structures for V-BLAST can be directly applied to Multi user detection case too. Agree?

tidjani April 8, 2009 at 10:19 am

Hi Sir,
I am doing work on wireless communication.would like to send me a matlab code for frequency modulation (BW=200 kHz).
2- how to plot the spectrum of it?
Thanks
kind regard

Krishna Sankar April 11, 2009 at 6:59 am

@tidjani: Sorry, I have not written posts on FM modulation.

Ronaldo April 7, 2009 at 6:15 pm

Can u give me some explain on the H^H operation in your Matlab script?

Krishna Sankar April 11, 2009 at 6:39 am

@Ronaldo: ()^H is the Hermitian operator. Hermitian operator means – conjgutate transpose of a matrix

John Titor February 18, 2009 at 8:28 pm

hi, the ZF-SIC should be a non-linear approach, but why the result you got is so linear?

Krishna Sankar February 21, 2009 at 7:38 am

@John: Hmm… I did not follow your question. As the SNR increases, its reasonable to expect lower BER too….

darshini February 11, 2009 at 3:01 pm

hi krishna
what about golden code? whether there r any posts about MIMO using golden codes?

Krishna Sankar February 12, 2009 at 6:40 am

@darshini: No, nothing yet on golden codes with MIMO

darshini February 11, 2009 at 2:57 pm

hi krishna

thanks, ur alamouti code helped me. But in that URL u give for v-blast, i cant find any specific v-blast codings. All are with ZF,SIC etc.. except v-blast. can u plz let me know…In v-blast processing steps there shld be a optimal ordering step, but here mimo with zf and optimal ordering is available. whether it is v-blast or any specific v-blast coding is available?

Krishna Sankar February 12, 2009 at 6:42 am

@darshini: As I understand, in V-Blast we transmit the different symbol simultaneously from two tx antennas. Whether we do optimal ordering for decoding is receiver dependent. The simplest equalization scheme uses Zero Forcing, and then we can have decoding schemes like MMSE, MMSE-SIC, ML etc.

darshini January 27, 2009 at 11:40 am

hi
I am working on BER performance of MIMO with V-BLAST spatial multiplexing and space time codes like golden code, almouti code, linear dispersion code etc. Can u provide me the simulation code, if u tried for any of the above(especially v-blast).

darshini January 27, 2009 at 10:54 am

hi

I am working on BER performance of MIMO with V-BLAST spatial multiplexing and space time codes like golden codes, almouti code and linear dispersion codes
can u provide me the simulation code if u tried for any of above.

Krishna Sankar January 28, 2009 at 6:03 am

@darshini: I have some posts on MIMO V-BLAST at
URI: http://www.dsplog.com/tag/mimo/

There is also a post on Alamouti STBC code @
http://www.dsplog.com/2008/10/16/alamouti-stbc/

Hope this helps.

moh March 26, 2009 at 7:37 pm

can find me code with mimi vblast

Krishna Sankar April 4, 2009 at 7:57 am

@moh: You meant, MIMO with V-BLAST. This post indeed talks about V-BLAST scheme. For MIMO V-BLAST with zero forcing equalizer, please refer to
http://www.dsplog.com/2008/10/24/mimo-zero-forcing/

Hope this helps.

Krishna Sankar November 25, 2008 at 6:10 am

@karl: Thanks Sure, will add posts on MIMO-OFDM.

karl November 22, 2008 at 11:19 pm

great work Krishna. congrats. your coding style is simple and easy to understand. hope you can post some work about MIMO-OFDM for example using alamouti or CDD. keep posting.