Skip to main content

Module stbc

Module stbc 

Source
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::alamouti2221
Ostbc::rate_3_4(3)3433/4
Ostbc::rate_3_4(4)4433/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

  1. S. M. Alamouti, “A simple transmit diversity technique for wireless communications,” IEEE J. Sel. Areas Commun., 16(8), 1998.
  2. V. Tarokh, H. Jafarkhani and A. R. Calderbank, “Space-time block codes from orthogonal designs,” IEEE Trans. Inf. Theory, 45(5), 1999.
  3. 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.