MIMO & Water-Filling
Multiple-input multiple-output (MIMO) channels are decomposed via SVD into independent sub-channels, then power is allocated optimally using the water-filling algorithm.
9.1 The MIMO Channel Model
A MIMO system with \(n_T\) transmit and \(n_R\) receive antennas has the input-output relation:
\[ \mathbf{Y} = H\mathbf{X} + \mathbf{Z}, \qquad H \in \mathbb{C}^{n_R \times n_T} \]
where \(\mathbf{Z} \sim \mathcal{CN}(0, \sigma^2 I)\) is complex Gaussian noise and\(H\) is the channel matrix whose entries represent the complex gain from each transmit to each receive antenna.
The capacity with known \(H\) at both ends and power constraint\(\operatorname{tr}(Q) \le P\) where \(Q = E[\mathbf{X}\mathbf{X}^\dagger]\):
\[ C = \max_{Q \succeq 0,\;\mathrm{tr}(Q)\le P} \log_2\det\!\left(I + \frac{1}{\sigma^2}HQH^\dagger\right) \]
9.2 SVD Decomposition into Parallel Channels
The singular value decomposition of \(H\):
\[ H = U\Lambda V^\dagger, \qquad \Lambda = \operatorname{diag}(\lambda_1, \ldots, \lambda_r) \]
By transmitting along right singular vectors (columns of \(V\)) and receiving along left singular vectors (columns of \(U\)), the MIMO channel decomposes into\(r = \operatorname{rank}(H)\) independent scalar sub-channels:
\[ \tilde{Y}_i = \lambda_i \tilde{X}_i + \tilde{Z}_i, \quad i = 1,\ldots,r \]
Each sub-channel has gain \(\lambda_i\) (a singular value) and independent noise\(\tilde{Z}_i \sim \mathcal{CN}(0, \sigma^2)\). The capacity becomes:
\[ C = \sum_{i=1}^{r} \log_2\!\left(1 + \frac{P_i\lambda_i^2}{\sigma^2}\right) \]
subject to \(\sum_i P_i \le P\), \(P_i \ge 0\)
9.3 Water-Filling Algorithm
We must maximize \(\sum_i \log_2(1+P_i\gamma_i)\) where \(\gamma_i = \lambda_i^2/\sigma^2\)subject to \(\sum P_i \le P\). Using Lagrange multipliers with KKT conditions:
\[ P_i^* = \left(\mu - \frac{1}{\gamma_i}\right)^+, \qquad \text{where } (x)^+ = \max(0, x) \]
The water level \(\mu\) is chosen so that\(\sum_i P_i^* = P\). The βwater-fillingβ metaphor: imagine pouring water into vessels of different heights (noise floors \(1/\gamma_i\)) β water fills the lower vessels first, and the surface is the water level \(\mu\).
Python: Water-Filling Simulation
Implements the water-filling algorithm for 4 parallel channels with gain-to-noise ratios 4, 1, 0.5, 0.25. Four plots: the water-filling bar diagram, capacity vs total power budget (water-filling vs equal allocation), per-channel power vs budget, and a MIMO 4Γ4 capacity distribution compared to SISO.
Click Run to execute the Python code
Code will be executed with Python 3 on the server