简介:本资源是一份面向通信工程专业本科生及无线通信入门学习者的Alamouti空时编码仿真实践材料,聚焦MIMO系统中经典的2发1收、2发2收等典型场景,帮助读者理解分集增益原理与编码矩阵设计逻辑。压缩包共8个文件,含5个MATLAB源码文件(.m)与3张关键仿真结果图(.jpg),其中Alamoudi_RUN.m为主运行脚本,rey.m实现瑞利信道建模,Alamoudi_2T1R.m与Alamoudi_2T2R.m分别对应不同天线配置的编解码流程,配套图片直观展示误码率曲线与信号星座图,便于验证理论性能。资源体积仅69KB,轻量易部署,代码结构清晰、注释完整,涵盖信道建模、符号映射、Alamouti编码矩阵构造、最大比合并(MRC)解码等核心环节,可直接运行复现经典文献结论。目前已有180人学习下载,适合课堂实验、课程设计或自学巩固空时编码基础概念。
1. Alamouti 编码不是“加个天线就抗衰落”——它用确定性正交结构在2×1 MIMO中实现满分分集增益
很多人第一次看到 Alamouti 编码,以为只是“两根发射天线发不同信号”,甚至误以为它靠功率叠加提升信噪比。实际上,Alamouti 的核心价值在于:在不增加接收天线、不牺牲带宽、不依赖信道估计的前提下,仅靠发射端的符号配对与时间-空间正交映射,就让单接收天线系统获得满分(2阶)分集增益。这意味着,在瑞利衰落信道下,误码率随 SNR 的下降速度比 SISO 快一倍(斜率翻倍),且解码复杂度仅为线性——不需要矩阵求逆,连 MMSE 都不用。本资源包正是用 MATLAB 实现了这一经典方案的全链路验证:从 QPSK 符号生成、Alamouti 矩阵构造、AWGN 信道建模,到接收端的共轭转置合并与硬判决,全部可运行、可调试、可修改调制阶数或天线配置。适合通信原理课设、MIMO 入门实验、或作为 OFDM 系统中空时编码模块的 baseline 参考。
2. 为什么 Alamouti 能用 2T1R 实现满分分集?从正交设计到接收合并的数学闭环
2.1 Alamouti 矩阵的构造逻辑:时间-空间正交性是分集增益的唯一来源
Alamouti 编码的本质,是将两个复数符号 $s_1$ 和 $s_2$ 映射为一个 $2 \times 2$ 的发射矩阵:
$$ \mathbf{X} = \begin{bmatrix} s_1 & s_2 \ -s_2^* & s_1^* \end{bmatrix} $$
该矩阵满足关键性质:$\mathbf{X}^H \mathbf{X} = (|s_1|^2 + |s_2|^2) \mathbf{I}_2$,即列向量严格正交且能量守恒。这意味着:
- 第1时刻,天线1发 $s_1$,天线2发 $s_2$;
- 第2时刻,天线1发 $-s_2^$,天线2发 $s_1^$。
这种设计使两个符号在接收端被“天然分离”——即使信道系数 $h_1, h_2$ 完全未知且随时间变化,只要在两个时刻内保持不变(块衰落假设),就能通过共轭转置操作消除符号间干扰。
提示:
Alamoudi_2T1R.m中第 32–35 行正是该矩阵的 MATLAB 实现,注意conj()的使用位置和负号方向,错一位就会破坏正交性,导致分集增益归零。
2.2 接收端合并:无需信道估计的线性处理,直接还原符号能量
设接收信号为 $\mathbf{y} = [y_1, y_2]^T$,其中:
- $y_1 = h_1 s_1 + h_2 s_2 + n_1$ (时刻1)
- $y_2 = -h_1 s_2^* + h_2 s_1^* + n_2$ (时刻2)
接收端构造合并向量: $$ \tilde{\mathbf{y}} = \begin{bmatrix} h_1^* & h_2 \ -h_2^* & h_1 \end{bmatrix} \begin{bmatrix} y_1 \ y_2 \end{bmatrix}
(|h_1|^2 + |h_2|^2) \begin{bmatrix} s_1 \ s_2 \end{bmatrix} + \begin{bmatrix} h_1^* n_1 + h_2 n_2 \ -h_2^* n_1 + h_1 n_2 \end{bmatrix} $$
可见,$s_1$ 和 $s_2$ 被独立放大 $(|h_1|^2 + |h_2|^2)$ 倍,而噪声项仍为高斯白噪声,等效 SNR 提升为原信道增益之和。这正是满分分集增益的数学体现:错误概率 $P_e \propto \left( \frac{1}{\text{SNR}} \right)^2$。
2.2.1 MATLAB 中的合并实现:rey.m的关键三步
打开rey.m,定位到第 48–52 行,其核心逻辑如下:
% 假设 h1, h2 为已知信道(仿真中可设为随机复数) y1 = h1 * s1 + h2 * s2 + noise1; y2 = -conj(h2) * s1 + conj(h1) * s2 + noise2; % 注意:此处是标准接收模型,与发射矩阵共轭转置匹配 % 合并:构造合并矩阵并应用 y_tilde1 = conj(h1) * y1 + h2 * y2; y_tilde2 = -conj(h2) * y1 + h1 * y2; % 硬判决(QPSK) s1_hat = sign(real(y_tilde1)) + 1i * sign(imag(y_tilde1)); s2_hat = sign(real(y_tilde2)) + 1i * sign(imag(y_tilde2));这段代码的关键在于:
y2的构造必须与 Alamouti 发射矩阵严格对应(-conj(h2)和conj(h1)),否则合并后无法消除干扰项;- 合并系数不是任意选的,而是发射矩阵 $\mathbf{X}$ 的共轭转置 $\mathbf{X}^H$;
sign()函数仅适用于 BPSK/QPSK 等星座点位于单位圆上的调制,若改用 16-QAM,此处需替换为最近邻判决(min(abs(y_tilde - constellation), [], 2))。
2.3 仿真参数表:控制变量法验证分集阶数
为确认是否真达到 2 阶分集,需固定其他参数,仅改变 SNR 并统计误码率。下表为Alamoudi_RUN.m中推荐的基准配置(可直接复制修改):
| 参数名 | 默认值 | 说明 | 修改建议 |
|---|---|---|---|
M | 4 | QPSK 调制阶数(sqrt(M)为每维电平数) | 改为2测试 BPSK,观察斜率是否一致 |
N | 10000 | 总发送符号数 | ≥5000 才能稳定统计 $10^{-3}$ 量级误码率 |
SNR_dB | 0:2:20 | SNR 扫描范围(dB) | 必须覆盖 10–20 dB 区间以观察斜率拐点 |
h1,h2 | randn+1i*randn | 瑞利信道系数(复高斯) | 每次循环重新生成,模拟快衰落 |
noise_var | 10^(-SNR_dB/10) | AWGN 方差 | 由 SNR 自动计算,勿手动赋值 |
注意:
Alamouti_T2R1.jpg和Alamouti_T2R2.jpg是该配置下生成的 BER 曲线图,横轴为 SNR,纵轴为 log10(BER)。你会发现 2T1R 曲线斜率明显陡于 SISO(对比图中虚线),而 2T2R 斜率更陡——这正是分集阶数 $L = N_t \times N_r$ 的直观体现。
3. 四种典型场景的代码复现:从单接收起步,逐步扩展至双收双发
3.1 2T1R 基础版:Alamoudi_2T1R.m的逐行执行与断点调试
这是理解 Alamouti 最小可行单元。运行前请确保工作路径包含该文件,并在命令行输入:
>> Alamoudi_2T1R程序将自动执行以下流程:
- 生成 $10^4$ 个 QPSK 符号(
s = randsrc(1, N, [1+1i,1-1i,-1+1i,-1-1i])); - 按 Alamouti 规则分组(每2个符号构成1个 $2\times2$ 块);
- 加入瑞利信道与 AWGN;
- 接收端合并并判决;
- 绘制 BER-SNR 曲线(保存为
Alamouti_T2R1.jpg)。
3.1.1 关键断点设置建议(提升调试效率)
- 在第 28 行
X = [s1, s2; -conj(s2), conj(s1)];处设断点,检查X是否为 2×2 复矩阵,且满足 $\det(\mathbf{X}) = |s_1|^2 + |s_2|^2$; - 在第 45 行
y_tilde1 = conj(h1)*y1 + h2*y2;处查看y_tilde1实部/虚部分布,应近似为原始s1的缩放+噪声; - 若 BER 高于理论值(如 10 dB 时 BER > 1e-3),立即检查
noise_var是否按10^(-SNR/10)计算,而非10^(SNR/10)(常见笔误)。
3.2 2T2R 扩展版:Alamoudi_2T2R.m中的信道矩阵与合并权重升级
当接收端有2根天线时,系统变为 2×2 MIMO,信道变为 $2\times2$ 矩阵 $\mathbf{H} = [h_{11}, h_{12}; h_{21}, h_{22}]$。此时 Alamouti 合并需对每个接收天线单独进行,再能量叠加:
% 对接收天线1做合并 y1_tilde1 = conj(h11)*y1_1 + h12*y2_1; % y1_1, y2_1 为天线1在两时刻的接收 y1_tilde2 = -conj(h12)*y1_1 + h11*y2_1; % 对接收天线2做合并 y2_tilde1 = conj(h21)*y1_2 + h22*y2_2; y2_tilde2 = -conj(h22)*y1_2 + h21*y2_2; % 能量合并(最大比合并 MRC) s1_hat = y1_tilde1 + y2_tilde1; s2_hat = y1_tilde2 + y2_tilde2;Alamoudi_2T2R.m第 67–75 行即为此逻辑。注意:
y1_1表示天线1在时刻1的接收,y1_2表示天线1在时刻2的接收(命名易混淆,需对照注释);- 合并后不再直接
sign(),因能量叠加使幅度增大,需先归一化:s1_hat = s1_hat / (abs(h11)^2 + abs(h12)^2 + abs(h21)^2 + abs(h22)^2); - 该配置下理论分集阶数为 $2 \times 2 = 4$,BER 曲线斜率应为 2T1R 的两倍(见
Alamouti_T2R1_T2R2.jpg中实线 vs 虚线)。
3.3 多天线配置统一框架:Refresh.m的模块化重构思路
Refresh.m并非独立仿真脚本,而是提供了一套可配置的 Alamouti 封装函数。其核心价值在于:将发射天线数Nt、接收天线数Nr、调制方式mod_type抽象为输入参数,避免重复写矩阵构造逻辑。例如:
% 构造 Alamouti 码字(支持 Nt=2 固定) function X = alamouti_encode(s1, s2, Nt) if Nt == 2 X = [s1, s2; -conj(s2), conj(s1)]; else error('Alamouti only supports 2 transmit antennas'); end end % 通用接收合并(支持任意 Nr) function [s1_hat, s2_hat] = alamouti_decode(y, H, Nr) s1_hat = zeros(1, size(y,2)); s2_hat = zeros(1, size(y,2)); for i = 1:Nr h1 = H(i,1); h2 = H(i,2); y1 = y(i,1); y2 = y(i,2); s1_hat(i) = conj(h1)*y1 + h2*y2; s2_hat(i) = -conj(h2)*y1 + h1*y2; end s1_hat = sum(s1_hat); s2_hat = sum(s2_hat); % MRC 合并 end提示:若需扩展至 4T1R,不能直接套用 Alamouti(它仅定义于 2T),应切换至空时格码(STTC)或空频编码(SFC),
Refresh.m中未实现,但其函数接口设计已预留扩展槽位(如encode_method参数)。
3.4 信道建模进阶:从理想瑞利到实际相关信道的替换路径
当前所有.m文件默认使用独立同分布瑞利信道:h = (randn + 1i*randn)/sqrt(2)。但在实际部署中,天线间距过小会导致信道相关。要模拟相关信道,只需替换h1,h2的生成方式:
% 引入相关系数 rho = 0.7(强相关) rho = 0.7; h_corr = sqrt(rho) * h1 + sqrt(1-rho) * (randn + 1i*randn)/sqrt(2); % 此时 h1 与 h_corr 相关系数 ≈ rho在Alamoudi_RUN.m中,将第 38 行h1 = ...和第 39 行h2 = ...替换为上述逻辑,重新运行即可观察相关性对分集增益的削弱效应——BER 曲线斜率将趋近于 1 阶(类似 SISO)。
4. 误码率曲线验证与参数敏感性分析:识别真实分集阶数的三步法
4.1 对数坐标下的斜率提取:用最小二乘拟合确认分集阶数
理论分集阶数 $L$ 体现在 BER 曲线的渐近斜率上:$\log_{10} \text{BER} \approx -L \cdot \log_{10} \text{SNR} + C$。要实证是否达到满分 $L=2$,需在高 SNR 区间(≥15 dB)提取斜率:
% 假设 snr_db 和 ber 为已知向量(来自 Alamoudi_RUN.m 输出) idx = snr_db >= 15; % 取高 SNR 区间 X = [ones(sum(idx),1), log10(10.^(snr_db(idx)/10))]; % 设计矩阵 [1, log10(SNR)] coeff = X \ log10(ber(idx)); % 最小二乘拟合 L_est = -coeff(2); % 斜率即为估计分集阶数 fprintf('Estimated diversity order: %.2f\n', L_est);运行此段代码于Alamouti_T2R1.jpg对应数据,输出应接近2.00;若为1.2,则说明存在实现错误(如噪声方差计算错误或合并系数符号颠倒)。
4.2 关键参数敏感性表格:哪些改动会直接杀死分集增益?
| 参数 | 错误设置示例 | 对 BER 的影响 | 诊断方法 |
|---|---|---|---|
| 发射矩阵负号 | X = [s1, s2; conj(s2), conj(s1)](漏负号) | 分集增益消失,BER 与 SISO 重合 | 检查det(X)是否恒等于abs(s1)^2 + abs(s2)^2 |
| 接收合并共轭位置 | y_tilde1 = h1*y1 + h2*y2(未共轭 h1) | 合并后残留干扰项,BER 下降缓慢 | 观察y_tilde1的实部分布是否围绕real(s1)集中 |
| 噪声方差 | noise_var = 10^(SNR_dB/10)(指数符号反) | 所有 SNR 点 BER 偏高 10–100 倍 | 对比var(noise)与noise_var数值是否相等 |
| 符号分组长度 | s1 = s(1:2:end); s2 = s(2:2:end)(未按块分组) | 符号配对错位,完全失效 | 在X构造前disp([s1(1:3); s2(1:3)])查看是否成对 |
4.3 一个实用技巧:用Alamouti_T2R1_T2R2.jpg快速定位性能瓶颈
该图同时绘制了 2T1R(蓝线)与 2T2R(红线)的 BER 曲线。若你修改代码后发现:
- 蓝线变平缓,但红线仍陡峭→ 问题出在 2T1R 的接收合并逻辑(如
rey.m中h1,h2赋值错误); - 两条线同步变平缓→ 问题出在公共模块(如符号生成、噪声添加、判决方式);
- 蓝线正常,红线异常→ 问题出在 2T2R 的信道矩阵应用或 MRC 合并(如
Alamoudi_2T2R.m第 72 行未对y2_tilde1归一化)。
提示:直接双击
Alamouti_T2R1_T2R2.jpg查看图像,MATLAB 会自动打开 figure 窗口。右键点击曲线 → “Data Cursor”,可精确读取任意 SNR 点的 BER 值,与理论值 $0.5 \cdot \text{erfc}(\sqrt{\text{SNR}})$(2T1R)或 $0.5 \cdot \text{erfc}(\sqrt{2 \cdot \text{SNR}})$(2T2R)比对,误差 > 0.5 dB 即需排查。
本文还有配套的精品资源,点击获取