☰
EXIT图原理与Turbo迭代译码收敛性分析:从软信息到误码平台
2026/10/5 3:57:27 网站建设 项目流程

简介:面向无线通信与信道编码研究者的Turbo码EXIT迭代分析工具包,围绕EXIT图与迭代译码展开,提供从编码器搭建、软信息生成到互信息度量、迭代轨迹追踪的完整MATLAB仿真环境。压缩包共43个文件,以15个m脚本和14个mat数据文件为主,另含10篇相关经典PDF文献与4个fig性能图,整体大小3.89MB。代码涵盖RSC编码、交织、BCJR/Log-MAP译码、LLR生成及EXIT曲线绘制等核心模块,适用于理解Turbo码交织器设计、迭代译码原理以及不同信噪比和码率下的收敛行为。包内fig图展示了典型生成多项式下的性能结果,PDF文献为理论推导提供支撑;MAT文件保存了不同参数组合下的仿真数据,便于对比分析。资源目前已有253人学习,适合通信工程专业学生、科研人员以及希望借助仿真实验优化Turbo码设计的工程师使用。通过运行主程序并复现文献结果,可快速掌握EXIT图在迭代处理中的应用方法。

1. EXIT 图与 Turbo 迭代:一个被 .rar 名字耽误的收敛性分析工具

很多同学手里都有一份EXIT_TURBO.rar,里面装的大半是画 EXIT 图的 MATLAB 脚本。这里的 EXIT 是 Extrinsic Information Transfer(外部信息转移)的缩写,不是进程退出函数exit(),也不是路由器固件里的什么 exit 选项——它是分析 Turbo 码迭代译码行为的一整套可视化方法。Turbo 码靠两个分量译码器互相交换软信息,每轮迭代误码率都在掉,但掉到第几轮就不动了、为什么会出现误码平台、该换哪种分量码,这些问题用 BER 仿真只能试出来,用 EXIT 图一眼就能看懂。这篇笔记把原理、手写脚本的步骤、参数设定和坑位一次讲完,适合刚接触 Turbo 迭代译码、想把“能跑通”变成“能看懂收敛”的研究生和做信道编码的工程师。

2. Turbo 迭代译码的软信息交换:EXIT 图要分析的对象

Turbo 码的本质是两个分量译码器通过交织器接成一个反馈环路。发端把信息序列送进两个并联的递归系统卷积码(RSC)编码器,一个直接编码,另一个交织后编码;收端则在两个分量译码器之间来回传递软信息。这里的“软信息”指对数似然比(LLR),不是 0/1 硬判决。硬判决在交换时会丢掉译码器对每个比特的置信度,迭代就没有增量可言;只有 LLR 能保留完整的后验分布,让下一轮译码器知道“上一轮已经确认了什么、还剩什么不确定”。EXIT 图的全部目的,就是定量描述这种软信息在每一轮迭代中到底增加了多少。

2.1 两个分量译码器交换的不是判决,是软信息

一轮迭代的动作是固定的:分量译码器 1 读入两路输入——信道对系统位和校验位的观测 LLR,以及来自分量译码器 2 的先验 LLR(第一轮置零),输出外部 LLR;这个外部 LLR 经过交织器,变成分量译码器 2 的先验输入;分量译码器 2 用同样的流程输出自己的外部 LLR,解交织后回给分量译码器 1,如此往复。所谓“外部信息”,在 Log-MAP 译码器里的定义是:

L_ext = L_posterior − L_a − L_ch

其中 L_posterior 是后验 LLR,L_a 是来自另一个译码器的先验 LLR,L_ch 是信道对系统位的观测 LLR。为什么要做这个减法?因为后验里已经包含了上一轮传过来的信息和信道本身的观测,直接把它传给下一个译码器等于让同一个猜测被反复强调,信息被重复使用,误码平台反而下不去。真正值得传递的只有减掉旧信息之后的那部分“新增信息”。

交换方式每轮携带的信息迭代后的典型表现
硬判决只有符号,置信度信息清零两三轮后停滞,误码平台很高
软信息 LLR后验分布的全部信息十轮以上误码率仍在下降
外部 LLR扣除先验与信道后的新信息迭代增益最干净,收敛轨迹可预测

从这张表能看出,EXIT 图量测的对象必须是外部 LLR,而不是后验 LLR。这是后面所有仿真代码里最容易出错、又最不容易被发现的一步,后文会单独讲。

2.2 迭代增益为什么会饱和:从互信息角度看误码平台

一个很自然的疑问是:两个译码器来回传信息,为什么不无限迭代下去?答案是每轮新增的外部信息量在衰减。用互信息的语言说,第一轮迭代把译码器对信息位的知识从 Ia≈0 推到 Ie≈0.6~0.8,第二轮从 0.6 推到 0.9,再往后每轮增量越来越小,最后趋近某个上限。如果两条 EXIT 曲线在 Ie=0.82 处相交,迭代就卡在交点附近,BER 曲线出现一段平坦的“误码平台”,这是 Turbo 码工程化时最头疼的现象之一。

EXIT 图的价值就在于:它把这种“迭代到哪一步推不动了”的空间结构画出来。两条分量译码器的曲线之间如果有开口(隧道),迭代轨迹就能沿着阶梯一路爬到顶部;如果两条曲线相交,轨迹就停在交点,对应的就是误码平台。你不用跑满 100 帧 BER 仿真,光看曲线交不交就能判断这个码在某个信噪比下能不能收敛。

2.3 为什么分量码必须用递归系统卷积码

Turbo 码的分量码几乎总是选递归系统卷积码(RSC),而不是普通的前馈卷积码。原因可以直接从 EXIT 曲线看懂:非递归卷积码的 EXIT 曲线在先验互信息很低时输出也很低,曲线起点贴着横轴,两条曲线之间几乎没有开口;而 RSC 因为内部有反馈寄存器,即便先验质量很差,也能借助记忆结构输出相当的外部信息,曲线起点明显抬高,尾部也更陡。

常用的 4 状态 RSC 生成多项式是八进制的 5/7,即反馈多项式 1+D+D²、前向多项式 1+D²。块长方面,EXIT 仿真的帧长至少要 5000 比特起步,短了先验 LLR 的高斯近似崩掉,曲线毛刺会大到看不出交点。这两个约束在第三章会反复出现。

3. EXIT 曲线的核心定义:先验互信息 Ia、外部互信息 Ie 与 J 函数

EXIT 曲线要回答的问题是:给定一个质量为 Ia 的先验软信息,分量译码器能输出质量为多少的外部软信息 Ie。这里的“质量”不是信噪比,而是软信息与发送比特之间的互信息。定量手段是假设先验 LLR 服从对称高斯分布,再用 J 函数在互信息和分布参数之间换算。这一章把这三个概念讲透,因为后面所有代码都是在实现它们。

3.1 用互信息给软信息“称重”:Ia 和 Ie 的定义

对任意一个软信息序列 L 和对应的发送比特 b∈{±1},软信息携带的信息量定义为互信息 I(b; L)。I=0 表示软信息与发送比特无关,I=1 表示完全确定。EXIT 曲线就是把这个互信息画成一条转移曲线:横轴是先验 LLR 的互信息 Ia = I(b; L_a),纵轴是外部 LLR 的互信息 Ie = I(b; L_e)。

仿真的难点在于:真实的先验 LLR 来自另一个译码器,它的统计特性随迭代轮次不断变化,没法直接采样。EXIT 方法做了一个工程上非常好用的替换——人工生成先验 LLR,让它服从对称高斯分布,并用 Ia 控制它的质量。对称高斯分布的含义是:给定 b=+1 时 L_a 服从 N(μ, σ²),给定 b=−1 时服从 N(−μ, σ²),且 μ=σ²/2。这个关系叫一致性条件,它保证 LLR 的统计特性和真实译码器输出的软信息在分布形状上匹配。

3.2 蒙特卡洛量测外部互信息:一个公式和一种验证方法

当外部 LLR 的分布满足对称性时,互信息有一个非常简洁的蒙特卡洛估计式:

Ie ≈ 1 − (1/N) Σ log2(1 + exp(−b_i · L_e,i))

其中 b_i 是发送比特(±1),L_e,i 是第 i 个比特的外部 LLR。这个式子不需要先估计分布再积分,O(N) 扫一遍就能算出 Ie,是画 EXIT 曲线最常用的量测方法。但它对分布对称性的要求很高,如果这个假设破裂,估计值会系统性偏大或偏小。

验证方法我一般用直方图交叉验证:把 L_e 按照 b=+1 和 b=−1 分成两组,分别画条件直方图,检查两条直方图是否关于原点镜像对称;再用直方图的数值积分重算一遍互信息,和上面的公式对比。两者差距超过 0.05 就说明分布假设有问题,要么帧长不够,要么交织器引入了相关性。

3.3 J 函数:在互信息 Ia 和高斯分布参数 σ 之间换算

生成指定 Ia 的先验 LLR 需要知道对应的 σ,这就是 J 函数的用武之地。J 函数定义为对称高斯分布下互信息与 σ 的关系:I = J(σ)。反过来,给一个目标 Ia,用逆 J 函数 J^{-1}(Ia) 就能得到 σ,再按 μ=σ²/2 生成先验 LLR。J 函数本身没有闭式解,工程上有两种做法:一是用数值积分直接算,二是用查表加插值。手写脚本时用二分法加数值积分最稳,后面直接给出代码。

两条 EXIT 曲线画在一张图里时,第二个分量译码器的曲线要把坐标轴对调:以 Ie2 为横轴、Ia2 为纵轴绘制。因为第二个译码器的输入是第一个译码器的输出,画在同一个坐标平面里正好构成迭代轨迹的“左右墙”。轨迹从 (0, Ie1(0)) 出发,水平移到第二译码器的曲线,再垂直移到第一译码器的曲线,每走一个台阶相当于一轮迭代。台阶能爬到 Ie≈1,译码收敛;台阶在中途撞上两线交点,就对应误码平台。两条曲线之间的最小竖直间隙,俗称“隧道宽度”,是判断收敛门限的直接指标。

4. 手写一份 EXIT_TURBO 脚本:J 函数、先验 LLR 与 Log-MAP 三块积木

有了前面的理论,画 EXIT 图只剩三块积木:J 函数及其逆、人工先验 LLR 生成器、能输出外部 LLR 的 Log-MAP 译码器。下面的代码用 Python 实现一个最小可用框架,帧长 4000 起步,分量码用 RSC(1, 5/7)。教学版故意把 4 状态转移展开写,方便对照教材公式。

4.1 J 函数和它的逆:控制先验互信息 Ia

import numpy as np from scipy.integrate import quad from scipy.special import logsumexp def j_func(sigma): # J(sigma) = I(b; L),L 服从对称高斯分布,mu = sigma^2 / 2 if sigma < 1e-6: return 0.0 mu = 0.5 * sigma * sigma # 用蒙特卡洛积分的期望形式:I = 1 - E[log2(1 + exp(-b*L))],取 b=+1 f = lambda x: np.log2(1.0 + np.exp(-x)) * np.exp(-(x - mu)**2 / (2.0 * sigma * sigma)) val, _ = quad(f, -60.0, 60.0, limit=200) return 1.0 - val / (np.sqrt(2.0 * np.pi) * sigma) def inv_j_func(ia): # 二分搜索求 sigma = J^{-1}(ia),ia 在 (0, 1) 区间 lo, hi = 1e-4, 40.0 for _ in range(80): mid = 0.5 * (lo + hi) if j_func(mid) < ia: lo = mid else: hi = mid return 0.5 * (lo + hi)

逻辑说明:j_func计算的是一致性条件下的互信息,积分范围取 ±60 倍标准差,quad自适应积分足够精确。inv_j_func利用 J 函数单调递增的性质做二分,80 次迭代后 σ 的误差在 1e-4 量级,完全够用。这里有个易错点:σ 不是信噪比,它只是先验 LLR 条件分布的标准差;σ 越大 Ie 越接近 1,但 σ=0 时 J(σ)=0,σ→∞ 时 J(σ)→1。拿到代码后先打印j_func([0.2, 0.5, 1.0, 2.0, 4.0])验证曲线形状,再继续往下写。

4.2 人工先验 LLR 与 4 状态 RSC 编码器

def gen_prior_llr(bits, ia): # 按目标互信息 ia 生成先验 LLR,bits 是 ±1 序列 sigma = inv_j_func(ia) mu = sigma * sigma / 2.0 return mu * bits + sigma * np.random.randn(len(bits)) def rsc_encode_57(bits): # 4 状态 RSC(1, 5/7),八进制 5/7,LLR 约定 log(P(0)/P(1)) # 状态 s = d1*2 + d0,d1 是高位寄存器 n = len(bits) par = np.zeros(n) d1 = d0 = 0 for k in range(n): u = 1 if bits[k] > 0 else 0 fb = u ^ d1 ^ d0 # 反馈多项式 1 + D + D^2 p = fb ^ d0 # 前向多项式 1 + D^2 par[k] = 1.0 if p == 0 else -1.0 d1, d0 = fb, d1 # 移位 return bits.copy(), par

逻辑说明:gen_prior_llr先把目标 Ia 换算成 σ,再用一致性条件 μ=σ²/2 构造均值,最后叠加高斯噪声。这个 μ 和 σ 的关系不能随意改,改成 μ=σ 会破坏一致性条件,导致 EXIT 曲线和真实迭代轨迹对不上。编码器的反馈和前向多项式由八进制 5/7 展开得到,反馈位 fb 进入移位寄存器,校验位取 fb 与最右寄存器 d0 的异或。注意这里的 bits 以 ±1 表示,LLR 正方向约定为比特 0。

4.3 Log-MAP 取出外部 LLR,蒙特卡洛量测 Ie

def logmap_s4(sys_llr, par_llr, la): # 4 状态 Log-MAP,RSC(1, 5/7),返回外部 LLR = 后验 - 先验 - 系统信道 LLR n = len(sys_llr) alpha = np.full((n + 1, 4), -np.inf); alpha[0, 0] = 0.0 beta = np.full((n + 1, 4), -np.inf); beta[n, 0] = 0.0 gamma = np.zeros((n, 2, 4)) for k in range(n): hs = 0.5 * (la[k] + sys_llr[k]) for s in range(4): d1 = s >> 1; d0 = s & 1 for u in (0, 1): fb = u ^ d1 ^ d0 p = 1.0 if (fb ^ d0) == 0 else -1.0 # u=0 对应发送 +1,分支度量取 +hs;u=1 取 -hs gamma[k, u, s] = (hs if u == 0 else -hs) + 0.5 * p * par_llr[k] for k in range(n): for ns in range(4): vals = [] for s in range(4): d1 = s >> 1; d0 = s & 1 for u in (0, 1): fb = u ^ d1 ^ d0 if ((fb << 1) | d1) == ns: vals.append(alpha[k, s] + gamma[k, u, s]) alpha[k + 1, ns] = logsumexp(np.array(vals)) for k in range(n - 1, -1, -1): for s in range(4): d1 = s >> 1; d0 = s & 1 vals = [] for u in (0, 1): fb = u ^ d1 ^ d0 ns = (fb << 1) | d1 if beta[k + 1, ns] > -np.inf: vals.append(gamma[k, u, s] + beta[k + 1, ns]) beta[k, s] = logsumexp(np.array(vals)) Lp = np.zeros(n) for k in range(n): num, den = [], [] for s in range(4): d1 = s >> 1; d0 = s & 1 for u in (0, 1): fb = u ^ d1 ^ d0 ns = (fb << 1) | d1 v = alpha[k, s] + gamma[k, u, s] + beta[k + 1, ns] (num if u == 0 else den).append(v) Lp[k] = logsumexp(np.array(num)) - logsumexp(np.array(den)) return Lp - la - sys_llr

逻辑说明:这是最核心的一段。gamma[k, u, s]表示从状态 s 出发、输入比特 u 的分支度量,其中hs = 0.5*(la + sys_llr)只在 u=0 时取正号,这是由 LLR=log(P(0)/P(1)) 的约定决定的。符号一旦取反,外部 LLR 会变成负相关,画出来的 Ie 几乎为 0。前向和后向递推用logsumexp实现,避免了数值溢出。最后一行Lp - la - sys_llr就是外部 LLR 的标准提取式:后验减去先验、减去系统位信道 LLR。

这个教学版用 Python 直接跑会偏慢,帧长 4000、9 个 Ia 点、每点 16 帧,大概要等几分钟。工程上我会把状态转移表预计算成两个数组,前向和后向用 numpy 向量化,或者直接换成 Max-Log-MAP 提速——但注意那会带来近似损失,避坑章节再讲。

4.4 扫 Ia 画两条 EXIT 曲线和迭代轨迹

def measure_I(bits, Le): # 外部 LLR 的互信息量测,要求分布满足对称性 return 1.0 - np.mean(np.log2(1.0 + np.exp(-bits * Le))) def scan_exit(sigma_n, n=4000, frames=16, ia_grid=None): # sigma_n 是 AWGN 噪声标准差,BPSK 单位能量 ia_grid = ia_grid if ia_grid is not None else np.linspace(0.0, 0.95, 9) rng = np.random.RandomState(7) inter = rng.permutation(n) # 固定交织器,保证两曲线可比 c1, c2 = [], [] for ia in ia_grid: E1 = E2 = 0.0 for _ in range(frames): bits = np.random.choice([1.0, -1.0], size=n) bits_i = bits[inter] _, par1 = rsc_encode_57(bits) _, par2 = rsc_encode_57(bits_i) ys = bits + sigma_n * np.random.randn(n) yp1 = par1 + sigma_n * np.random.randn(n) yp2 = par2 + sigma_n * np.random.randn(n) lsys = 2.0 * ys / (sigma_n ** 2) lpar1 = 2.0 * yp1 / (sigma_n ** 2) lpar2 = 2.0 * yp2 / (sigma_n ** 2) la1 = gen_prior_llr(bits, ia) Le1 = logmap_s4(lsys, lpar1, la1) E1 += measure_I(bits, Le1) la2 = gen_prior_llr(bits_i, ia) Le2 = logmap_s4(lsys[inter], lpar2, la2) E2 += measure_I(bits_i, Le2) c1.append(E1 / frames) c2.append(E2 / frames) return ia_grid, np.array(c1), np.array(c2)

逻辑说明:每一帧都重新抽信息比特、编码、过 AWGN 信道,然后把译码器 1 和译码器 2 的 EXIT 点分别测出来。交织器固定一次,避免因交织器不同导致两条曲线没有可比性。信道 LLR 按 BPSK 公式 2y/σ_n² 计算;如果换成 QPSK 或更高阶调制,要相应地改 LLR 映射。参数上,sigma_n越小曲线越高,两条曲线的交点位置也随之移动,这是后面找收敛门限的旋钮。

参数建议取值作用
n4000~10000帧长;决定高斯近似和曲线平滑度,短于 2000 会出毛刺
frames16~50每个 Ia 点的平均帧数,越大曲线越稳定
sigma_n0.5~0.9信道噪声标准差,直接控制曲线高低和交点位置
ia_grid0~0.95,步长 0.1扫描分辨率;找交点时加密到 0.02

迭代轨迹可以在拿到两条曲线后单独画,不需要重新跑译码:

def trace_iteration(ia_grid, c1, c2, max_iter=15): pts = [] ia1 = 0.0 for _ in range(max_iter): ie1 = np.interp(ia1, ia_grid, c1) pts.append((ie1, ia1)) # 垂直段起点 ia2 = ie1 ie2 = np.interp(ia2, ia_grid, c2) pts.append((ia1, ia2)) # 水平段(在反转坐标系里) ia1 = ie2 pts.append((ia1, ia1)) if ia1 > 0.999: break return pts

轨迹的画法是:先从第二译码器的曲线水平读出输出,再垂直映射回第一译码器的曲线,每一次“水平+垂直”对应一轮 turbo 迭代。如果轨迹在某个中间值绕圈,说明两条曲线在那里相交,这就是误码平台的位置。np.interp只在ia_grid范围内可靠,扫描上限设 0.95 就够了,逼近 1.0 的区域数值上不稳定。

5. EXIT 图的常见翻车现场:外部信息算错、分布假设破裂与轨迹失真

EXIT 图画不出来、画出来不对,九成问题不在绘图代码,而在上游的仿真设置。这里列出我踩过和帮别人排查过的五个高频坑,每一条都按现象、原因、解决写清楚。

5.1 把后验 LLR 当成外部 LLR,曲线虚高

现象:EXIT 曲线开口特别大,预测“这个码在很低信噪比下就能收敛”,但实际 BER 仿真在同样的信噪比下出现明显平台,理论和实测对不上。原因:代码里直接把译码器输出的后验 LLR 交给下一个分量译码器,没有做Lp - la - sys_llr的减法。后验里含着本轮先验和信道信息,信息被重复统计,Ie 自然虚高,隧道看起来永远敞开。解决:严格按外部 LLR 的定义提取,并用一个自检判断——给定相同的先验质量,Ie 应该比后验的互信息低一截;如果两者几乎相等,说明减法没做。

5.2 先验 LLR 生成时破坏了一致性条件

现象:EXIT 曲线和真实迭代轨迹对不上——轨迹在某几轮跳跃明显偏离曲线,或者轨迹卡住的位置和曲线交点不一致。原因:生成先验 LLR 时图省事,直接用sigma * randn生成零均值噪声,或者均值取了sigma而不是sigma^2/2。破坏一致性条件后,人工先验的统计特性和真实译码器输出的软信息不一样,EXIT 曲线测的就不是实际系统要经历的路径。解决:严格使用 μ=σ²/2,并像 3.2 节那样做直方图对称性验证。这个坑特别隐蔽,因为零均值高斯先验画出来的曲线也有模有样,只有和轨迹对比才会露馅。

5.3 帧长太短或平均帧数不够,曲线毛刺大到无法判断交点

现象:同一组参数多跑几次,曲线来回抖动,两条曲线的交点在 0.1~0.2 的范围内漂移。原因:块长只有几百比特时,LLR 分布不满足高斯近似;每点只跑几帧时,蒙特卡洛估计量的方差太大。解决:帧长提到 5000 以上、每点 16 帧以上。判断曲线是否够稳,可以把同一个ia点的Ie重复测三次,看标准差是否小于 0.01。教学脚本用 4000 帧长加 16 帧平均能看趋势,发论文或做工程判断建议 10000 帧长加 50 帧平均。

5.4 Max-Log-MAP 近似让 EXIT 曲线整体偏低

现象:用 Max-Log-MAP 实现的译码器画出的 EXIT 曲线,比 Log-MAP 曲线矮一截,收敛门限预测值比实际仿真差 0.3~0.5 dB。原因:Max-Log-MAP 用 max 代替 logsumexp,丢失了校正项,输出 LLR 偏小,外部互信息被系统性低估。解决:做门限预测时用 Log-MAP;如果工程实现就是 Max-Log-MAP,EXIT 仿真也要用同样的算法,保持仿真与实现的自洽。最忌讳的是用 Log-MAP 画曲线、用 Max-Log-MAP 做产品,最后留的余量完全靠猜。

5.5 交织器长度不足或随机性差,轨迹在曲线下方打转

现象:两条 EXIT 曲线明明有开口,迭代轨迹却走不上去,或者轨迹比曲线预测的收敛速度慢很多。原因:交织器太短(几百比特)时,两个分量译码器的外部信息没有完全去相关,违反了 EXIT 图的独立假设;某些劣质交织器还会引入结构化相关性,让轨迹偏离理想曲线。解决:用随机交织器或 S-random 交织器,块长不低于 2000;更严格的做法是把交织器固定下来,在同一个交织器上同时跑 EXIT 和 BER 验证,看轨迹是否贴着曲线走。

6. 拿 EXIT 图当设计工具:收敛门限搜索与分量码参数验证

EXIT 图不只是用来“看看收敛”,工程上最实用的动作是用它来找收敛门限、对比分量码多项式。找门限的做法是:固定帧长和交织器,逐个 Eb/N0 扫描,对每个点算出两条 EXIT 曲线,求两线之间的最小竖直间隙(隧道宽度);间隙刚好大于零的那个 Eb/N0 就是 EXIT 预测的收敛门限。这个过程可以完全数值化,不用人眼盯着图猜交点。

def tunnel_width(ia_grid, c1, c2): # 两条曲线在反转坐标系里的最小竖直间隙 width = np.inf for i, x in enumerate(ia_grid): y1 = np.interp(x, ia_grid, c1) # 第一译码器曲线 y2 = np.interp(y1, ia_grid, c2) # 第二译码器在 Ia2=y1 时的输出 width = min(width, y1 - np.interp(y1, np.flip(ia_grid), np.flip(c2))) return width

实际的隧道宽度算法可以更精细,在两条曲线之间做逐点插值后取全程最小间隙;间隙大于 0 则“有隧道”,间隙小于 0 则在对应位置相交。有了这个数值,换分量码生成多项式就变得很快:把 RSC(1, 5/7) 换成 (1, 7/5)、甚至 8 状态的 (1, 13/15),重新跑一遍扫描,对比三个指标——曲线起点高度、隧道宽度、以及高 Ia 区域的尾部走向。

选多项式的经验法则是:曲线起点越高,低信噪比下第一轮迭代的增益越大;尾部越陡,高互信息区域收敛越快;中间腰部越宽,越不容易在中途被交点卡住。这三个指标往往互相牵制,没有一条曲线在所有指标上都最好,所以最终要用 BER 仿真验证:在 EXIT 预测的门限附近跑瀑布曲线,如果实际误码率开始断崖式下降的 Eb/N0 与预测偏差在 0.2~0.3 dB 以内,说明 EXIT 模型和实现是自洽的;偏差过大,回头检查 5.1 和 5.2 两个坑。

我做这类分析时吃过一次亏:第一次画曲线把后验 LLR 当外部信息,预测某个迭代译码方案在 0.4 dB 就能收敛,BER 仿真却卡在 0.9 dB 的平台下不去。后来把外部信息提取修正、重新画图,两条曲线的交点位置正好落在 0.85 dB,和仿真完全吻合。那次之后我养成了一个习惯:拿到任何 EXIT_TURBO 脚本,先检查返回的到底是后验还是外部 LLR,再谈曲线形状和门限。这个检查几分钟就能完成,能省掉后面一整天的排错——希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询