Expand description
Channel estimation on the OFDM resource grid.
The receiver knows the pilots: LS estimates $\hat H = Y / X$ at the pilot REs, then an interpolation over the grid — first across the subcarriers of every pilot-carrying symbol, then across the symbols of every subcarrier (linear in time, constant beyond the first and last pilot symbols).
FrequencyInterpolation::Linear: linear between pilot subcarriers;FrequencyInterpolation::SecondOrder,FrequencyInterpolation::Spline,FrequencyInterpolation::LowPassandFrequencyInterpolation::TimeDomain: the interpolations compared by Coleri et al. (2002), the quadratic through three pilots, the not-a-knot cubic spline, the band-limited interpolator of MATLABinterpand the zero padding of the IDFT of the pilot estimates (a comb of pilots on subcarriers $0, L, \dots$ of a grid of a multiple of $L$ subcarriers);FrequencyInterpolation::Lmmse: the linear MMSE estimator ofcomnum_dsp::estimationwith the frequency correlation of a power-delay profile, $R(\Delta k) = \sum_{l} p_{l}, e^{-j 2\pi \Delta k, d_{l} / N}$ — the true profile, or the uniform profile over the cyclic prefix of the robust design (Edfors et al. 1998).
With pilots on every subcarrier (block pattern) LMMSE still smooths the LS estimates (van de Beek et al. 1995); with a comb it interpolates them.
The LMMSE estimator and the band-limited interpolator are built once per set of pilot
subcarriers (super::wiener::Wiener2d on the pilots of the symbol, comnum_dsp::interpolation::LowPassInterpolator) and
applied to every pilot symbol that shares it.
§Examples
use comnum_waveform::ofdm::estimation::{estimate, FrequencyInterpolation};
use comnum_waveform::ofdm::grid::{PilotPattern, ResourceGrid};
use comnum_math::C64;
let g = ResourceGrid { n_subcarriers: 16, n_symbols: 4, pattern: PilotPattern::Comb { spacing: 4 }, seed: 3 };
// a flat channel 0.5 + 0.5j, no noise: the estimate is exact everywhere
let h = C64::new(0.5, 0.5);
let tx = g.map(&vec![C64::new(1.0, 0.0); g.n_data()])?;
let rx: Vec<C64> = tx.iter().map(|x| x * h).collect();
let est = estimate(&g, &rx, 1e-6, &FrequencyInterpolation::Linear)?;
assert!(est.iter().all(|e| (e - h).norm() < 1e-9));§References
- J.-J. van de Beek, O. Edfors, M. Sandell, S. K. Wilson and P. O. Börjesson, “On channel estimation in OFDM systems,” Proc. IEEE VTC, 815–819, 1995.
- O. Edfors, M. Sandell, J.-J. van de Beek, S. K. Wilson and P. O. Börjesson, “OFDM channel estimation by singular value decomposition,” IEEE Trans. Commun., 46(7), 931–939, 1998.
- S. Coleri, M. Ergen, A. Puri and A. Bahai, “Channel estimation techniques based on pilot arrangement in OFDM systems,” IEEE Trans. Broadcast., 48(3), 223–229, 2002.
Structs§
- Port
Estimation - The settings of
estimate_port: the interpolation, the noise variance per RE (used by LMMSE) and the transmit port among the ports of the grid. - Power
Delay Profile - A power-delay profile on the sampling grid of the OFDM symbol: checked when it is built, its fields read through getters.
- Random
Delay Profile - A channel of
pathsimpulses whose delays are independent and uniform over $[0, L]$ samples of the IFFT (max_delay= $L$), not on the sampling grid, of power $e^{-\tau/\tau_{\mathrm{rms}}}$ (or all equal), the first one at delay 0 whenfirst_at_zero: the “synchronized” (exponential, first at 0) and “uniform” models of Edfors et al. (1998, Sec. II). Its correlation averaged over the delays is, for one random delay of power $w(\tau)$,
Enums§
- Frequency
Interpolation - How the pilot estimates are interpolated across the subcarriers.
Functions§
- estimate
- The channel at every RE of the grid (symbol after symbol) from the received grid
rx(the FFT outputs of the active subcarriers), with the noise variance per REnoise_var(used by LMMSE). - estimate_
port estimatefor the channel of the port ofsettings, from its pilots (ResourceGrid::port_pilots): with one receive antenna’s gridrx, the channel between that antenna and the transmit port.