-
Notifications
You must be signed in to change notification settings - Fork 0
Transmit Diversity
在 MMSE_CPP 引擎中,数据信道(PDSCH)为了追求极高的吞吐量,通常使用空间复用(Spatial Multiplexing)。然而,对于控制信道(PDCCH 和 PCFICH),其首要任务是极端的可靠性——如果控制指令丢失,整个子帧的数据都将作废。
因此,3GPP 协议规定 PDCCH 强制使用 QPSK 调制,并在多天线场景下使用**空频块码(SFBC, Space-Frequency Block Coding)**进行发射分集。
本页面详细记录了 MMSE_CPP 是如何在底层代码中优雅且高效地实现 SFBC 解码的。
SFBC 本质上是经典的 Alamouti 空时分组码在“频率域”上的变体。基站在发送时,将相邻的两个子载波($k$ 和
假设我们要发送两个 QPSK 符号
-
在子载波
$k$ 上:天线 0 发送$X_1$ ,天线 1 发送$X_2$ 。 -
在子载波
$k+1$ 上:天线 0 发送 $-X_2^$,天线 1 发送 $X_1^$。
在接收端,天线收到的信号
利用 Alamouti 矩阵天然的正交性,我们可以在数学上彻底消灭交叉干扰,完全避免矩阵求逆。
在 src/mmse_equalizer_cpu.cpp 中的 demap_pdcch_transmit_diversity_scalar 函数里,我们实现了极速的最大比合并 (MRC, Maximum Ratio Combining):
对于接收天线 0,提取
由于正交性,包含干扰符号的项在展开后会完美抵消(一正一负化为零)。
代码映射: 在 C++ 源码中,这段优美的数学化简被直接翻译为无除法、无分支的纯复数乘加指令:
// 提取 X1 (对应源码中的 z_rx0 和 z_rx1 合并)
const Complex32 z_rx0 = csub(cmul(cconj(h00), y0), cmul(h01_next, cconj(y0_next)));
// 提取 X2
const Complex32 z1_rx0 = cadd(cmul(cconj(h01), y0), cmul(h00_next, cconj(y0_next)));- 注入 MMSE 底色:等效信噪比计算 虽然上述的 MRC 完美解耦了信号,但在低信噪比环境下,如果不考虑背景噪声,会导致后续译码器(Viterbi)的软比特(LLR)权重失真。 为了达到 MMSE 级别的性能,代码中计算了等效信道能量 E 并在分母中强行注入了信道估计模块传来的噪声方差 (\sigma^2 ): 最终,我们不仅能计算出归一化后的纯净软符号 \hat{X} :
还能顺便输出该符号的后验信噪比 (Post-SINR \gamma ):
- 架构优势总结 在 MMSE_CPP 项目中,将 PDCCH 的发射分集(Transmit Diversity)与 PDSCH 的普通 MMSE 拆分为两个独立的执行路径(run_pdcch_td vs run_channel)带来了巨大的工程红利:
- 计算复杂度断崖式下降:省去了所有克莱姆法则展开、行列式计算和牛顿迭代除法。对于动辄占用上千个 RE 的控制区,节省了海量的 CPU/GPU 寄存器与时钟周期。
- 极佳的数值稳定性:正交合并避免了病态矩阵求逆时出现的浮点数溢出问题。
- 完美对接控制面:该模块输出的带有 SINR 权重的 PdcchTdEqualizePair,使得后级的 LLR 生成极度线性化,为 Viterbi 盲检提供了最纯净的输入源。
🗺️ Wiki Navigation: 🏠 Home (主页) | ⬆️ Back to Top (回到顶部)
🔗 Project Links: 💻 GitHub Repository | 🐛 Report an Issue | 🛡️ Security Policy
MMSE_CPP is a high-performance LTE PHY baseband engine optimized for AVX2 and CUDA. > Released under the open-source license. Contributions are welcome!