4. 速率匹配与HARQ:速率匹配算法、HARQ重传机制、软合并技术
各位同学,今天我们来聊聊物理层里一个非常关键、也特别有意思的话题——速率匹配与HARQ。说实话,我刚入行那会儿,觉得这玩意儿就是个简单的“打孔”和“重传”,后来在项目里被坑了几次,才真正明白它的分量。
速率匹配解决什么问题?说白了,就是让编码后的数据能塞进物理资源里。而HARQ呢,是保证数据传错了还能救回来。这两者配合得好,系统性能才能上去。我见过不少方案,速率匹配没做好,HARQ增益直接打对折。
4.1 速率匹配算法
速率匹配的核心思想很简单:把编码后的比特流,调整到与可用物理资源匹配的比特数。5G NR里用的是基于循环缓冲区的速率匹配,我特别喜欢这个设计,因为它天然支持HARQ。
具体怎么做呢?分三步走:
- 比特收集:把LDPC编码后的系统位、校验位1、校验位2,按顺序写入一个循环缓冲区。
- 比特选择:根据目标码率,从缓冲区里选出一段比特。码率高就多选校验位,码率低就少选。
- 比特交织:把选出来的比特重新排列,抵抗突发错误。
这里有个细节,我当年踩过坑——循环缓冲区的起始位置。5G NR里,每次HARQ重传,起始位置都不一样。这个偏移量叫RV(Redundancy Version),取值0、1、2、3。RV不同,选出来的比特就不同,相当于每次重传都带了一部分新冗余。
关键点:速率匹配不是简单的“删掉一些比特”,而是有策略地选择哪些比特保留、哪些比特丢弃。好的速率匹配算法,能让HARQ的软合并效果最大化。
我建议你在实现时,把循环缓冲区设计成环形数组,这样RV切换时只需要移动指针,效率很高。我曾经在一个FPGA项目里,用双端口RAM实现循环缓冲区,读写可以同时进行,吞吐量直接翻倍。
4.2 HARQ重传机制
HARQ,全称是Hybrid Automatic Repeat reQuest。说白了,就是自动重传请求的升级版。普通ARQ只重传,HARQ还带纠错能力。
5G NR用的是异步自适应HARQ。什么意思呢?
- 异步:重传可以在任意时刻发生,不固定时间点。这给了调度器很大的灵活性。
- 自适应:每次重传的MCS、资源分配都可以变化。比如第一次传用了16QAM,重传时信道变差了,可以降到QPSK。
我记得有一次做外场测试,UE在小区边缘,信道变化特别快。如果用了同步HARQ,重传时机固定,经常撞上信道深衰落。换成异步HARQ后,调度器可以等信道变好再重传,BLER直接降了5个点。
HARQ的流程是这样的:
- 发送端发初传数据,带上HARQ进程ID和NDI(New Data Indicator)。
- 接收端解码,如果成功,反馈ACK;失败,反馈NACK。
- 发送端收到NACK后,根据RV配置,从循环缓冲区选新的比特组合,发起重传。
- 接收端把初传和重传的软比特合并,再解码。
- 重复直到成功或达到最大重传次数。
小技巧:NDI翻转表示新数据,不翻转表示重传。这个标志位一定要仔细处理,我见过有人把NDI搞反了,导致接收端一直以为在传新数据,软合并全乱了。
4.3 软合并技术
软合并是HARQ的精髓。没有软合并,HARQ就是普通的ARQ,性能差一大截。
软合并有两种方式:
| 合并方式 | 原理 | 适用场景 |
|---|---|---|
| Chase合并(CC) | 每次重传发送相同的比特,接收端把多次接收的LLR直接相加 | 码率不变,信噪比叠加 |
| 增量冗余(IR) | 每次重传发送不同的冗余比特,接收端拼接后获得更低码率的码字 | 码率逐步降低,编码增益提升 |
5G NR主要用IR。为什么?因为IR的增益更大。你想想看,Chase合并只是把信号能量叠加了,但IR相当于每次重传都给你新的校验信息,编码增益是实打实的。
具体实现时,接收端需要维护一个软比特缓冲区。每次收到重传,根据RV找到对应的位置,把LLR值叠加进去。这里要注意:
- LLR的量化精度要够,我一般用6-8比特。太少了会损失软信息,太多了浪费存储。
- 缓冲区大小要按最大码率来设计。5G NR里,UE的软比特缓冲区大小是协议规定的,但基站侧可以灵活配置。
- 合并时要注意LLR的缩放。不同重传的信道质量可能不同,需要做归一化处理。
避坑指南:我曾经在实现IR合并时,忘记考虑不同RV的比特位置映射关系。结果初传和重传的LLR叠加到了错误的位置,解码性能比不合并还差。后来我加了一个查找表,把RV和比特位置的对应关系固化下来,问题才解决。
软合并的增益有多大?我给你们一个参考数据:在AWGN信道下,1次重传用IR,相比Chase合并,大约有1-2dB的增益。在衰落信道下,这个差距更大,因为IR能更好地利用信道的频率分集。
嗯,这里还要提一下HARQ进程管理。5G NR支持最多16个HARQ进程,每个进程独立工作。进程数太少,会导致发送端等待ACK/NACK的时间变长,吞吐量下降。进程数太多,缓冲区压力大。我一般建议根据RTT(往返时间)来配置,保证在等待反馈期间,发送端有足够的进程继续发数据。
最后总结一句:速率匹配和HARQ是物理层实现里最考验细节的地方。算法本身不难,但边界条件多、状态机复杂。我建议你在写代码之前,先把状态转移图画清楚,把每个RV的比特选择逻辑验证一遍。这样后面调试会省很多时间。
好,这一章就到这里。下一章我们讲信道估计与均衡,那是另一个有意思的话题。