发射机链路(一):CRC添加与码块分段、Turbo编码基本原理、速率匹配与HARQ初传
各位同学,欢迎来到发射机链路的第一讲。今天我们要啃的这块骨头,是4G LTE物理层发射机最核心的三个环节:CRC添加与码块分段、Turbo编码,以及速率匹配与HARQ初传。说实话,这三个模块是LTE链路中“承上启下”的关键,搞懂了它们,你基本就掌握了发射机一半的灵魂。
我个人习惯把发射机链路比作一个“信息打包流水线”。原始数据进来,先贴个标签(CRC),然后切块(码块分段),再塞进一个复杂的编码器(Turbo),最后根据信道条件裁剪成合适的尺寸发出去(速率匹配)。嗯,咱们一步步来。
1. CRC添加与码块分段
先说说CRC。CRC的全称是循环冗余校验,说白了就是给数据加个“防伪标签”。接收端收到数据后,用同样的算法算一遍,如果标签对不上,就知道数据在传输过程中被篡改了。
在LTE里,CRC有两种应用场景:传输块(TB)级别的CRC和码块(CB)级别的CRC。传输块CRC是24位的,生成多项式是gCRC24A(D) = D24 + D23 + D18 + D17 + D14 + D11 + D10 + D7 + D6 + D5 + D4 + D3 + D + 1。码块CRC也是24位的,但多项式不同,用的是gCRC24B(D)。
为什么要分两种?我遇到过的一个坑是:传输块CRC用于整体检错,而码块CRC用于Turbo译码后的早期终止。你想想看,如果每个码块都能独立检错,那译码器就可以提前停下来,省电又省时间。
关键点: 当传输块大于6144比特时,必须进行码块分段。每个码块最大6144比特,加上24位CRC后,实际送入Turbo编码器的信息位长度是6144+24=6168比特。
码块分段的规则其实不复杂:
- 如果传输块长度(包括TB CRC)≤ 6144,不分段,直接加CB CRC(如果TB CRC已存在,则CB CRC可省略)。
- 如果传输块长度 > 6144,需要分成C个码块,每个码块大小尽量相等。
- 码块大小需要满足Turbo编码的交织器尺寸要求,即必须是40到6144之间的某些特定值(3GPP TS 36.212表5.1.3-3)。
这里有个小技巧:实际分段时,我们会先计算需要的码块数C = ceil(B / (6144-24)),其中B是传输块加TB CRC后的总长度。然后每个码块的信息位长度K = ceil(B / C),再向上取整到最接近的合法交织器尺寸。
避坑指南: 我曾经在实现分段时,直接用了K = ceil(B/C),结果发现K不是合法的Turbo交织器尺寸,导致编码器报错。正确的做法是先查表找到大于等于K的最小合法尺寸,然后用填充比特补齐。
2. Turbo编码基本原理
Turbo编码是LTE的“王牌”信道编码方案。它的核心思想是:用两个递归系统卷积码(RSC)编码器并行工作,中间通过一个交织器打乱顺序,让两个编码器看到不同的信息序列。
为什么叫Turbo?因为译码时两个译码器会互相交换“软信息”,像涡轮增压一样迭代提升性能。嗯,这个名字起得挺形象。
LTE的Turbo编码器结构如下:
- 两个8状态RSC编码器,生成多项式为:前向反馈多项式G0 = 1 + D + D3,反馈多项式G1 = 1 + D2 + D3。
- 内部交织器采用QPP(二次置换多项式)交织器,公式为:Π(i) = (f1·i + f2·i2) mod K。
- 编码输出包括:系统位(信息位本身)、第一校验位(来自第一个RSC)、第二校验位(来自第二个RSC)。
我记得刚开始学Turbo时,最困惑的是QPP交织器的参数f1和f2。这些参数是3GPP协议直接给出的,对于每个合法的K值,都有对应的(f1, f2)对。你不需要自己推导,直接查表就行。
编码速率: 基本Turbo编码的母码速率是1/3。也就是说,每输入1个信息比特,输出3个编码比特(1个系统位+2个校验位)。但别忘了,编码前还有尾比特(trellis termination),每个RSC编码器需要3个尾比特来把状态归零,所以实际输出会多出12个尾比特(6个系统位+6个校验位)。
代码实现时,我建议用查表法实现QPP交织器,而不是每次计算。因为f1和f2是固定的,预计算好交织地址表可以大幅提升仿真速度。
# Python示例:QPP交织器地址生成
def qpp_interleaver(K, f1, f2):
interleaver = [0] * K
for i in range(K):
interleaver[i] = (f1 * i + f2 * i * i) % K
return interleaver
# 示例:K=40时,f1=3, f2=10
K = 40
f1, f2 = 3, 10
addr = qpp_interleaver(K, f1, f2)
print(addr[:10]) # 输出前10个交织地址
3. 速率匹配与HARQ初传
速率匹配是发射机链路的“最后一公里”。它的任务是把Turbo编码后的比特流,裁剪成与物理资源匹配的尺寸。说白了,就是“有多少资源,发多少比特”。
LTE的速率匹配采用循环缓冲器(Circular Buffer)方案,包含三个步骤:
- 子块交织: 对系统位、第一校验位、第二校验位分别进行块交织。
- 比特收集: 将交织后的系统位放在循环缓冲器的前半部分,两个校验位交替填充后半部分。
- 比特选择与修剪: 从循环缓冲器中按顺序取出所需长度的比特。如果取到末尾还没够,就循环回到开头继续取。
HARQ初传时,冗余版本(RV)通常设为0。这意味着我们从循环缓冲器的起始位置开始取比特。如果初传失败,重传时会使用不同的RV值(1、2、3),从不同的起始位置取比特,实现增量冗余。
注意: 循环缓冲器的长度是3×KΠ,其中KΠ是子块交织后的长度。对于系统位,KΠ = K(信息位长度);对于校验位,KΠ = K + 4(因为尾比特)。所以总长度 = K + (K+4) + (K+4) = 3K + 8。
我曾经在实现速率匹配时,犯过一个低级错误:忘记考虑尾比特对校验位长度的影响,导致循环缓冲器长度算错,取出的比特序列完全不对。后来花了整整一天调试,才发现是KΠ没加4。嗯,细节决定成败。
速率匹配的另一个关键点是:填充比特的处理。如果码块分段时用了填充比特,这些填充比特在速率匹配时会被打掉(不发送)。接收端需要知道填充比特的位置,才能正确译码。
个人经验: 在仿真中,我习惯把速率匹配和HARQ初传放在一起实现。因为初传的RV=0,起始位置就是0,取出的比特数等于分配的物理资源大小。这样代码更简洁,也更容易调试。
最后,咱们用一张图来总结本章的知识体系:
这张图把今天讲的五个核心模块串起来了。从CRC添加开始,经过码块分段、Turbo编码、速率匹配,最后到HARQ初传,每个环节都有明确的输入输出和参数约束。你想想看,整个发射机链路就像一条流水线,每个工位都有固定的任务和标准。
好了,今天的内容就到这里。记住,CRC是检错的基础,码块分段是并行处理的前提,Turbo编码是性能的保证,速率匹配是资源适配的关键。把这四个环节吃透了,你就能理解LTE发射机为什么能高效可靠地传输数据。