Main Content

Effect of Mutual Coupling on MIMO Communication

This example shows how the antenna mutual coupling affects the performance of an orthogonal space-time block code (OSTBC) transmission over a multiple-input multiple-output (MIMO) channel. The transmitter and receiver have two dipole antenna elements each. The bit error rate (BER) vs. signal to noise ratio (SNR) curves are plotted under different correlation and coupling scenarios. To run this example, you need Antenna Toolbox™.

System Parameters

Simulate a QPSK modulated Alamouti OSTBC over a 2x2 quasi-static frequency-flat Rayleigh channel [ [1] ]. The system operates at 2.4 GHz. The simulation range for SNR is 0 to 10 dB.

fc = 2.4e9;         % Center frequency
Nt = 2;             % Number of Tx antennas
Nr = 2;             % Number of Rx antennas
blkLen = 2;         % Alamouti code block length
snr = 0:10;         % SNR range
maxNumErrs = 3e2;   % Maximum number of errors
maxNumBits = 5e4;   % Maximum number of bits

Create objects to perform Alamouti encoding and combining, AWGN channel as well as BER calculation.

alamoutiEnc = comm.OSTBCEncoder( ...
alamoutiDec = comm.OSTBCCombiner( ...
    NumTransmitAntennas=Nt, ...
awgnChanNC = comm.AWGNChannel( ... % For no coupling case
    NoiseMethod="Signal to noise ratio (SNR)",...
berCalcNC = comm.ErrorRate;       % For no coupling case

% Clone objects for mutual coupling case 
awgnChanMC = clone(awgnChanNC); 
berCalcMC  = clone(berCalcNC);

Antenna Arrays and Coupling Matrices

Use a two-element resonant dipole array at both transmit (Tx) and receive (Rx) side. At Tx, the dipoles are spaced a half-wavelength apart. At Rx, the spacing is a tenth of a wavelength.

txSpacing = 0.5;
rxSpacing = 0.1;
lambda = physconst("lightspeed")/fc;
antElement = dipole( ...
    Length=lambda/2, ...
txArray = linearArray( ...
rxArray = linearArray( ...

Calculate the coupling matrix based on a circuit model of the array as per [ [2] ]. Calculate the S-parameters for the transmit and receive arrays and derive the impedance matrix representation of the array from these calculations.

txMCMtx = helperCalculateCouplingMatrix(txArray, fc, [1 Nt]);
rxMCMtx = helperCalculateCouplingMatrix(rxArray, fc, [1 Nr]);

Spatial Correlation Matrices

The transmit and receive spatial correlation matrices capture the propagation environment of the channel. Without coupling, it is assumed that the two elements at Tx are uncorrelated and the two elements at Rx have high correlation. The combined/overall correlation matrix for the whole channel is their Kronecker product.

txCorrMtx = eye(2);
rxCorrMtx = [1 0.9; 0.9 1];
combCorrMtx = kron(txCorrMtx, rxCorrMtx);

With coupling, use the approach in [ [3] ] to modify the Tx and Rx correlation matrices by pre and post-multiplying them by the corresponding coupling matrices. This is valid under the assumption that the correlation and coupling can be modeled independently.

txMCCorrMtx = txMCMtx * txCorrMtx * txMCMtx';
rxMCCorrMtx = rxMCMtx * rxCorrMtx * rxMCMtx';

The combined spatial correlation with coupling is kron(txMCCorr, rxMCCorr). Alternatively, you can treat the Tx/Rx coupling matrix as being "absorbed" into the Tx/Rx correlation matrix and derive the combined correlation matrix as follows:

txSqrtCorrMtx = txMCMtx * sqrtm(txCorrMtx);
rxSqrtCorrMtx = rxMCMtx * sqrtm(rxCorrMtx);
combMCCorrMtx = kron(txSqrtCorrMtx, rxSqrtCorrMtx);
combMCCorrMtx = combMCCorrMtx * combMCCorrMtx';

MIMO Channel Modeling

Create two comm.MIMOChannel objects to simulate the 2x2 MIMO channels with and without coupling. Assign the combined spatial correlation matrix in each case. Set the MaximumDopplerShift property of the objects to 0 to model a quasi-static channel.

mimoChanNC = comm.MIMOChannel( ...  % For no coupling case 
    MaximumDopplerShift=0, ...
    SpatialCorrelationSpecification="Combined", ...

% Clone objects for mutual coupling case 
mimoChanMC = clone(mimoChanNC);
mimoChanMC.SpatialCorrelationMatrix = combMCCorrMtx;


Simulate the QPSK modulated Alamouti code for each SNR value with and without antenna coupling. One Alamouti code is simulated through the MIMO channel in each iteration. To model a quasi-static channel, reset the comm.MIMOChannel object to obtain a new set of channel gains for each code transmission (iteration).

% Set up a figure to visualize BER results
h1 = figure; grid on; hold on;
ax = gca;
ax.YScale = "log";
xlim([snr(1), snr(end)]); ylim([1e-3 1]);
xlabel("SNR (dB)"); ylabel("BER"); 
h1.NumberTitle = "off";
h1.Name = "Orthogonal Space-Time Block Coding";
title("Alamouti-coded 2x2 System - High Coupling, High Correlation");

s = rng(108);  % For repeatability
[berNC, berMC] = deal(zeros(3,length(snr)));

% Loop over SNR values
for idx = 1:length(snr)
    awgnChanNC.SNR = snr(idx); 
    awgnChanMC.SNR = snr(idx); 
    while min(berNC(2,idx),berMC(2,idx)) <= maxNumErrs && (berNC(3,idx) <= maxNumBits)    
        % Generate random data
        txData = randi([0 3], blkLen, 1);
        % Perform QPSK modulation and Alamouti encoding
        txSig = alamoutiEnc(pskmod(txData,4,pi/4)); 
        % Pass through MIMO channel
        reset(mimoChanNC); reset(mimoChanMC);
        [chanOutNC, estChanNC] = mimoChanNC(txSig);
        [chanOutMC, estChanMC] = mimoChanMC(txSig);
        % Add AWGN
        rxSigNC = awgnChanNC(chanOutNC);
        rxSigMC = awgnChanMC(chanOutMC);
        % Perform Alamouti decoding with known channel state information
        decSigNC = alamoutiDec(rxSigNC, squeeze(estChanNC));
        decSigMC = alamoutiDec(rxSigMC, squeeze(estChanMC));
        % Perform QPSK demodulation 
        rxDataNC = pskdemod(decSigNC,4,pi/4);
        rxDataMC = pskdemod(decSigMC,4,pi/4);
        % Update BER
        berNC(:, idx) = berCalcNC(txData, rxDataNC);
        berMC(:, idx) = berCalcMC(txData, rxDataMC);

    % Plot results
    semilogy(snr(1:idx), berNC(1,1:idx), 'r*');
    semilogy(snr(1:idx), berMC(1,1:idx), 'bo');
    legend({"Channel Without Coupling", "Channel With Coupling"});

% Perform curve fitting
fitBERNC = berfit(snr, berNC(1,:));
fitBERMC = berfit(snr, berMC(1,:));
semilogy(snr, fitBERNC, "r", snr, fitBERMC, "b");
legend({"Channel Without Coupling", "Channel With Coupling"});

rng(s); % Restore RNG

Further Exploration

The effect of correlation and mutual coupling on the BER performance can be further studied by modifying the correlation coefficient and/or by changing the spacing between the elements. The smaller the spacing is, the higher the coupling is. Similar to what has been done in this example for high correlation (0.9) and high coupling (spacing = 0.1λ) at Rx, the BER vs. SNR results for low correlation (0.1) and/or low coupling (spacing = 0.5λ) are shown below.

  • High Coupling (spacing = 0.1λ), Low Correlation (0.1)

  • Low Coupling (spacing = 0.5λ), High Correlation (0.9)

  • Low Coupling (spacing = 0.5λ), Low Correlation (0.1)


The simulation results are similar to those reported in the first reference. A spacing of 0.5λ has a negligible impact on BER under both high and low correlation conditions. For the case with high coupling, i.e., 0.1λ element spacing, the results indicate that depending on the correlation conditions, the BER could be either higher or lower than if coupling were not considered.


This example uses the following helper functions:

Related Topics


[1] A. A. Abouda, H. M. El-Sallabi, and S. G. Haggman, "Effect of Mutual Coupling on BER Performance of Alamouti Scheme," IEEE International Symposium on Antennas and Propagation, July 2006.

[2] Gupta, I., and A. Ksienski. “Effect of Mutual Coupling on the Performance of Adaptive Arrays.” IEEE Transactions on Antennas and Propagation 31, no. 5 (September 1983): 785–91.

[3] Y. Wu, J. P. Linnartz, J. W. M. Bergmans, and S. Attallah, "Effects of Antenna Mutual Coupling on the Performance of MIMO Systems," Proc. 29th Symposium on Information Theory in the Benelux, May 2008.