Expand description
Orthogonal space-time block codes (OSTBC).
A block code sends $K$ symbols over $T$ channel uses from $n_{t}$ antennas: the $T \times n_{t}$ codeword $X(s)$ is linear in the real and imaginary parts of the symbols,
$$ X(s) = c \sum_{k=1}^{K} \left(\Re(s_{k})\, A_{k} + \Im(s_{k})\, B_{k}\right), $$
with the dispersion matrices $A_{k} = X(e_{k})$ and $B_{k} = X(j e_{k})$ and the scale $c$ that makes the average transmitted energy one per channel use (each antenna sends $1/n_{t}$ of it on average). The code is orthogonal when $X^{H} X \propto \lVert s \rVert^{2} I$: then, whatever the channel, the received block $Y = H X^{T} + W$ ($n_{r} \times T$) decouples into one scalar channel per symbol, and linear combining is maximum likelihood. Each estimate is $\hat s_{k} = s_{k} + n_{k}$ with the noise variance $\sigma^{2} / (c^{2} \lVert H \rVert_{F}^{2})$ for the codes of unit-norm columns, a diversity of $n_{t} n_{r}$.
| Code | $n_{t}$ | $T$ | $K$ | Rate |
|---|---|---|---|---|
Ostbc::alamouti | 2 | 2 | 2 | 1 |
Ostbc::rate_3_4(3) | 3 | 4 | 3 | 3/4 |
Ostbc::rate_3_4(4) | 4 | 4 | 3 | 3/4 |
The rows of a codeword are the channel uses, its columns the antennas:
$$ X_{\mathrm{Alamouti}} = \begin{pmatrix} s_{1} & s_{2} \\ -s_{2}^{} & s_{1}^{} \end{pmatrix}, \qquad X_{3/4} = \begin{pmatrix} s_{1} & s_{2} & s_{3} & 0 \\ -s_{2}^{} & s_{1}^{} & 0 & s_{3} \\ -s_{3}^{} & 0 & s_{1}^{} & -s_{2} \\ 0 & -s_{3}^{} & s_{2}^{} & s_{1} \end{pmatrix} $$
(the three-antenna code keeps the first three columns).
§Examples
use comnum_mimo::detection::Estimates;
use comnum_mimo::stbc::Ostbc;
use comnum_math::C64;
use ndarray::array;
let code = Ostbc::alamouti();
let s = [C64::new(1.0, 1.0), C64::new(-1.0, 1.0)];
let x = code.encode(&s)?; // 2 antennas × 2 uses
let h = array![[C64::new(0.8, -0.3), C64::new(-0.2, 1.1)]]; // one receive antenna
let Estimates { symbols: est, noise_var: var } = code.decode(&h.view(), &h.dot(&x).view(), 0.01)?;
assert!(est.iter().zip(&s).all(|(a, b)| (a - b).norm() < 1e-12));
// the noise variance of every estimate is σ²/(c² ‖H‖²), with c² = 1/2 for Alamouti
let h2: f64 = h.iter().map(|v| v.norm_sqr()).sum();
assert!((var[0] - 0.01 / (0.5 * h2)).abs() < 1e-15);§References
- S. M. Alamouti, “A simple transmit diversity technique for wireless communications,” IEEE J. Sel. Areas Commun., 16(8), 1998.
- V. Tarokh, H. Jafarkhani and A. R. Calderbank, “Space-time block codes from orthogonal designs,” IEEE Trans. Inf. Theory, 45(5), 1999.
- O. Tirkkonen and A. Hottinen, “Square-matrix embeddable space-time block codes for complex signal constellations,” IEEE Trans. Inf. Theory, 48(2), 2002.
Structs§
- Ostbc
- An orthogonal space-time block code.