MIMO Channel Generation
MIMO Channels: The Foundation of Modern Wireless
Multiple-input multiple-output (MIMO) uses multiple antennas at both transmitter and receiver. Generating realistic MIMO channel matrices with proper spatial correlation is essential for simulating 4G, 5G, and Wi-Fi MIMO systems.
Definition: MIMO Channel Matrix
MIMO Channel Matrix
The MIMO channel matrix has entry representing the complex gain from transmit antenna to receive antenna :
For i.i.d. Rayleigh fading: .
def iid_mimo_channel(Nr, Nt, rng=None):
if rng is None:
rng = np.random.default_rng()
return (rng.standard_normal((Nr, Nt)) + 1j*rng.standard_normal((Nr, Nt))) / np.sqrt(2)
Definition: Kronecker Spatial Correlation Model
Kronecker Spatial Correlation Model
The Kronecker model separates transmit and receive correlations:
where has i.i.d. entries, is the receive correlation, and is the transmit correlation.
def kronecker_mimo(Nr, Nt, Rr, Rt, rng=None):
if rng is None:
rng = np.random.default_rng()
Lr = np.linalg.cholesky(Rr)
Lt = np.linalg.cholesky(Rt)
Hw = (rng.standard_normal((Nr, Nt)) + 1j*rng.standard_normal((Nr, Nt))) / np.sqrt(2)
return Lr @ Hw @ Lt.T
The Kronecker model assumes separable TX/RX correlations. This is a good approximation for moderate correlations but breaks down for keyhole channels.
Definition: Exponential Correlation Matrix
Exponential Correlation Matrix
For a uniform linear array (ULA) with correlation coefficient :
This Toeplitz matrix is positive definite for and captures the exponential decay of correlation with antenna separation.
def exp_corr_matrix(N, rho):
return rho ** np.abs(np.arange(N)[:, None] - np.arange(N)[None, :])
Theorem: MIMO Channel Capacity
The ergodic capacity of an MIMO channel with equal power allocation is:
For i.i.d. Rayleigh fading at high SNR, grows linearly with : each spatial stream adds approximately bits/s/Hz.
MIMO creates parallel spatial channels. The number of independent channels equals the rank of , which is for i.i.d. fading.
Theorem: Correlation Reduces MIMO Capacity
Spatial correlation always reduces MIMO capacity:
with equality only when and . High correlation () makes the channel matrix rank-deficient, reducing the number of effective spatial streams.
Correlated antennas see similar channels, reducing the spatial multiplexing gain. This is why antenna spacing of or more is preferred.
Example: Generating Correlated MIMO Channels
Generate 4x4 MIMO channels with exponential correlation at both TX and RX. Verify the correlation structure.
Implementation
Nr, Nt, rho = 4, 4, 0.7
Rr = rho ** np.abs(np.arange(Nr)[:,None] - np.arange(Nr)[None,:])
Rt = rho ** np.abs(np.arange(Nt)[:,None] - np.arange(Nt)[None,:])
Lr = np.linalg.cholesky(Rr)
Lt = np.linalg.cholesky(Rt)
N_ch = 10000
channels = np.zeros((N_ch, Nr, Nt), dtype=complex)
rng = np.random.default_rng(42)
for i in range(N_ch):
Hw = (rng.standard_normal((Nr,Nt)) + 1j*rng.standard_normal((Nr,Nt))) / np.sqrt(2)
channels[i] = Lr @ Hw @ Lt.T
Verify correlation
# Check receive correlation: E[h_{i,0} h_{j,0}*] should equal Rr[i,j]
h_col0 = channels[:, :, 0]
R_est = np.mean(h_col0[:,:,None] * np.conj(h_col0[:,None,:]), axis=0)
print("Estimated Rr:\n", np.abs(R_est).round(2))
MIMO Channel Matrix Visualization
Visualize the magnitude and phase of MIMO channel matrices with adjustable correlation and antenna configuration.
Parameters
Common Mistake: Using Real Cholesky for Complex Correlation
Mistake:
Using np.linalg.cholesky(R) when is complex Hermitian,
but forgetting to use Lt.conj().T instead of Lt.T in the Kronecker model.
Correction:
For complex correlation matrices, use
with Hermitian transpose. For real exponential correlation, .T suffices.
MIMO
Multiple-Input Multiple-Output: a system using multiple antennas at both transmitter and receiver for spatial multiplexing or diversity.
Kronecker Model
A MIMO channel model that separates transmit and receive spatial correlations: .