3. LDPC编码与速率匹配:WiFi6中的LDPC编码矩阵选择与打孔算法

各位同学,今天我们来聊聊WiFi6里一个绕不开的话题——LDPC编码。说实话,我刚接触LDPC的时候,看着那些校验矩阵和打孔规则,头都大了。但做多了你会发现,这东西其实有章可循。

WiFi6为什么选LDPC?说白了,就是因为它逼近香农极限。相比传统BCC(二进制卷积码),LDPC在高码率下能多出1-2dB的增益。嗯,这在信号弱的时候,可能就是能不能连上WiFi的区别。

3.1 LDPC编码矩阵的选择策略

WiFi6标准里定义了三种码率的LDPC矩阵:1/2、2/3、3/4和5/6。你可能要问,为什么是这几个码率?我个人的理解是,这是性能和复杂度的折中。

每种码率对应一个基矩阵(Base Graph),WiFi6用的是BG1和BG2两种基图。BG1适用于码长较长的情况(比如1944比特),BG2则用于短码(比如648比特)。

核心要点:实际项目中,我建议根据信道条件动态选择码率。信道好时用5/6,信道差时用1/2。别死脑筋一直用一种。

举个例子,假设你的接收端SNR是15dB,用5/6码率完全没问题。但如果SNR掉到5dB以下,赶紧切到1/2码率,不然误码率会飙升。

3.2 打孔算法详解

打孔(Puncturing)是速率匹配的关键。WiFi6的LDPC编码器输出的是系统位+校验位,但实际传输的比特数可能比编码后的比特数少。这时候就需要打孔——扔掉一部分校验位。

打孔的原则是什么?我总结了两条:

  • 优先打掉校验位:系统位是信息位,打掉就丢信息了,所以尽量保留。
  • 均匀打孔:别集中打掉某一块,否则解码器会"饿死"。

WiFi6的打孔算法其实挺巧妙的。它用了一个循环缓冲器(Circular Buffer),把编码后的比特按顺序写入,然后根据目标码率从缓冲器中读取。读的时候跳过一些位置,就实现了打孔。

避坑指南:我曾经在项目中犯过一个错误——打孔太密集,导致解码器迭代时收敛不了。后来发现,打孔后的校验节点度数分布要尽量均匀。这个经验值钱啊,兄弟们。

3.3 速率匹配的硬件实现

速率匹配在硬件上怎么实现?我给大家画个流程图:

LDPC编码 循环缓冲器 打孔/重复 码率控制 调制映射 系统位+校验位 按顺序写入 根据码率读取 速率匹配流程说明: 1. LDPC编码器输出固定长度的码字(系统位+校验位) 2. 循环缓冲器按顺序存储所有编码比特 3. 根据目标码率,从缓冲器中均匀读取所需比特数 4. 读取时跳过部分校验位(打孔)或重复部分比特(重复)

你看这个流程,其实不复杂。编码器输出后,先存到循环缓冲器里。然后根据目标码率,决定读多少比特、跳过多少比特。

3.4 实际项目中的经验

我在做WiFi6芯片的时候,遇到过一个问题:打孔后的LDPC码性能比预期的差。排查了很久,发现是打孔位置和校验矩阵的结构冲突了。

具体来说,LDPC解码器依赖校验节点和变量节点之间的消息传递。如果打孔集中在某些校验节点上,这些节点就收不到足够的消息,解码就会失败。

警告:打孔时一定要考虑校验矩阵的列重分布。列重小的列(比如列重为1或2)尽量别打孔,否则解码器会"断粮"。

后来我总结了一套打孔优先级规则:

优先级 打孔位置 说明
1(优先打) 列重≥3的校验位 这些节点连接多个校验方程,冗余度高
2 列重=2的校验位 有一定冗余,但打孔后影响中等
3(尽量不打) 列重=1的校验位 打掉后对应校验方程直接失效
禁止打孔 系统位 打掉系统位等于丢信息

嗯,这个表格是我在实际项目中反复调试后总结出来的。你拿去用,基本不会出大问题。

3.5 小结

LDPC编码和速率匹配,说白了就是两件事:选对矩阵、打好孔。矩阵选错了,性能上不去;孔打错了,解码器罢工。

我个人建议,做WiFi6芯片的同学,一定要把校验矩阵的结构吃透。别只看标准文档,要动手仿真一下不同打孔方案的性能差异。我记得有一次,我为了验证一个打孔方案,跑了整整三天的仿真,最后发现一个参数设错了...那种感觉,嗯,你们懂的。

好了,这一章就到这里。记住,LDPC这东西,实践出真知。


公众号:蓝海资料掘金营,微信deep3321