最近在调试一个基于反馈环路的并行解调代码(VHDL in FPGA),主要工作是添加对16QAM的支持(之前只有QPSK)。调试过程颇有些波折,也浪费了不少时间,总结原因于本文结尾。
并行解调代码指的是采用并行多路信号处理架构,以实现信号吞吐率提升,应用于高速无线通信
下面步入正题,列举基本的调试步骤
确保星座图收敛完好
星座图收敛后汇聚于比较小的点,并且无相位偏差和抖动。例如下图所示为16QAM均衡器输出星座图(好吧我承认有点差~)
如果星座图比较发散,需要寻找原因并解决。比较常用的方法是将实际采样信号送给仿真程序(例如matlab),观察仿真程序输出星座图。
好的星座图(不加噪声时)是好的误码性能的基础
确定并行处理的线序
星座图收敛完好并不能保证最终输出的数据时正确的,并行解调算法需要重点关注并行线序的一致性。任何一个模块的线序反向都会造成错误。
代码编写阶段注意约定好线序。如果没有约定,需要明确注释说明接口线序(Big Endian 还是 Little Endian,有符号还是无符号等)。否则后患无穷。
如果出现线序错误需要定位问题,可以发送特定短序列,检查解调输出是否匹配。特定短序列的选取需要能够保证时钟环路的收敛。如果只是随意选取,在16QAM模式下很难保证时钟环收敛。一种简单可行的方式是只发送16QAM外侧的4个点,例如按照4个象限顺时针发送,这样既可保证时钟环路收敛,又可简单有效分析。当然有时候需要更加复杂一点的发送图案。
消除相位模糊度
消除相位模糊度的传统方法是采用差分编码。还有一种方式是周期性插入特定字段,接收端需要查找该特定字段并确认其周期性,如果查找失败就将相位旋转90度,直到查找成功,相位模糊度消除。
本代码采用第二种方式,因为发送端采用了LDPC编码,每个编码块之前都插入了帧头,该帧头可用作消除相位模糊度的特定字段。
加噪声测试性能
以上步骤完成后,可以加噪声测试误码性能。先测试无编码情况下误码特性,与理论值进行对比。可以观察加噪后的解调星座图,是否存在相位旋转、溢出等问题。
先测试无编码情况下误码特性,与理论值进行对比
如果性能较差,可能性比较大的原因有:
- 滤波器不合适(模拟滤波器、数字滤波器)
- 信号运算过程有溢出
- 星座点解映射阈值设置(QPSK无此烦恼)
检测环路收敛的健壮性
避免环路进入错误的锁定状态,是需要重点考虑的问题。即要求环路具有自我检测和重启机制。
对于时钟环和载波环,一种有效的策略是检测环路滤波器的输出是否超出阈值。对于自适应均衡环路,可以采用上面提到的周期性插入特定字段的方式来检测收敛正确性。
调试问题总结
- 并行代码的线序不一致问题(这个下回注意可避免)
- 缺少冷静分析(需要跳出来思考)
- 代码调试迭代周期较长
- 写代码时考虑不够周全,导致错误和隐藏错误
- 低估了代码难度
好的程序员应该写代码,而不是改代码