1. 项目概述与核心挑战
在物联网、无线传感网这些对功耗和成本极度敏感的应用场景里,扩频通信技术因其出色的抗干扰和隐蔽性,一直是个香饽饽。但好东西往往有个“通病”——实现起来太“费劲”。这个“劲”在接收端,就体现在那个负责从噪声里“捞”出有用信号的匹配滤波器相关器上。传统的实现方式,我们称之为“暴力匹配”,简单粗暴:把接收到的信号样本和本地生成的、已知的扩频码序列(也就是匹配滤波器的系数)一个点一个点地做复数乘法再累加。对于采用非重复、任意相位扩频码(比如基于混沌序列的扩频)的突发模式通信系统来说,这个“暴力”程度会指数级上升。因为每个数据包的前导码(用于同步)都可能不一样,接收机每次都得重新加载一套全新的、可能长达上千个点的复数系数,然后进行海量的复数乘法运算。在FPGA上,这意味着要消耗大量的嵌入式乘法器(DSP Block)和逻辑资源(ALM/ALUT),功耗和成本一下子就上去了,跟物联网设备“抠门”的设计哲学背道而驰。
我最近在复现和优化一篇关于“直通相关器”的经典论文时,就深刻体会到了这种矛盾。论文的核心思想非常巧妙:既然“暴力计算”吃不消,那我们就想办法“偷懒”,而且是要有技巧地“偷懒”,在性能和资源之间找到一个绝佳的平衡点。他们提出了系数截断、动态剪枝和折叠结构等一系列优化技术,目标是在检测性能损失可控的前提下,把硬件资源(尤其是宝贵的DSP Block)给“砍”下来。这听起来很美好,但真要把论文里的公式和框图变成可综合的RTL代码,并在实际的FPGA上跑通、测出性能,里面门道可多了。比如,1比特截断到底会引入多少信噪比损失?动态剪枝的阈值λ怎么选才最划算?折叠结构带来的虚警率上升又该如何抑制?这些都不是纸上谈兵能解决的,必须动手做。
这篇文章,我就结合自己的FPGA开发经验,把这套“直通相关器优化技术”从理论到实践掰开揉碎了讲清楚。我会重点分享在Intel Arria 10 FPGA上实现和测试这些优化技术时,遇到的坑、踩过的雷,以及最终如何权衡利弊,做出适合低功耗物联网设备的设计选择。无论你是正在研究低功耗通信的工程师,还是对FPGA信号处理感兴趣的开发者,相信这些一手经验都能给你带来实实在在的参考。
2. 直通相关器:从“暴力匹配”到“精打细算”
2.1 传统匹配滤波器相关器的计算瓶颈
在深入优化之前,我们得先搞清楚对手长什么样。传统的匹配滤波器相关器,其数学模型就是一个滑动窗内的点积运算。对于长度为N的复数前导码序列,每个时钟周期,我们需要计算:
Z[n] = Σ (x[n-i] * conj(y[i])), 其中 i 从 0 到 N-1。
这里,x是接收到的复信号样本(I/Q两路),y是本地复现的前导码系数(也是复数),conj()表示取共轭。一次复数乘法需要4次实数乘法,优化后(利用(a+jb)(c-jd)的特性)可以降到3次。所以,对于一个N点的相关器,每个时钟周期需要进行3N次实数乘法。如果N=1400(论文中的例子),那就是4200次乘法!即便FPGA的DSP Block运行频率很高,直接实例化4200个乘法器也是不可想象的,通常需要通过时分复用来实现,但这又会拉高时钟频率和功耗。
更麻烦的是,对于任意相位扩频(如HOPS),系数y是复数,且精度较高(比如8比特以上)。这意味着每个系数需要两个RAM来存储I路和Q路,乘法器也需要是完整的精度乘法器。这种“全精度、全计算”的模式,是低功耗设计的大敌。
2.2 直通相关器的核心思想与结构
“直通相关器”这个名字很形象。如图1所示,它的结构非常类似于一个直接形式的FIR滤波器。接收信号样本x像流水一样依次通过一个移位寄存器链(延迟线)。在每个抽头(tap)处,当前的x值与预先加载好的对应系数y进行相关运算(复数乘加)。所有抽头的结果在同一时钟周期内被累加,产生一个相关的输出Z[n]。
它的“直通”特性体现在:系数y是可以按突发(burst)动态加载的。在下一个数据包到来前,新的前导码系数被提前写入系数寄存器组。当第一个样本进入延迟线时,相关计算就立即基于这套新系数开始工作。这种结构避免了为每个突发重新配置滤波器系数带来的延迟,实现了“直通”式的快速同步捕获。
然而,这个结构的计算复杂度与传统方法无异。优化的突破口,就在于对系数y和计算过程本身“动刀子”。
2.3 优化路径总览:三大降耗利器
论文提出了三条主要的优化路径,它们可以组合使用,实现资源消耗的阶梯式下降:
- 系数截断:降低系数
y的精度,从多比特(如8比特)直接降到极端情况下的1比特(符号位)。这能将复杂的乘法器简化为条件取反操作。 - 动态剪枝:对于复数系数
y = yI + j*yQ,如果其中一个分量(I或Q)的幅度很小,就忽略它,只用一个实数乘法来代替复数乘法。这进一步减少了加法器的数量。 - 折叠结构:将长延迟线在时间上“折叠”起来,复用同一套物理抽头来计算原本属于不同时间段的相关系数。这能大幅减少移位寄存器的长度,从而节约大量的寄存器和组合逻辑。
接下来,我们就逐一拆解这三项技术,看看它们是如何在FPGA里落地,以及需要付出什么代价。
3. 核心优化技术详解与FPGA实现
3.1 系数截断:从乘法器到选择器的蜕变
原理与权衡系数截断的核心思想是牺牲系数的幅度精度来换取硬件资源的极大节约。对于任意相位扩频,其系数本质是单位圆上的点。将系数yI和yQ从多比特截断到1比特(即只保留符号位:+1或-1),意味着我们用一个位于正方形四个顶点(1,1), (1,-1), (-1,1), (-1,-1)的点,来近似单位圆上的点。
这必然会引入失真。失真主要来自两方面:
- 幅度失真:正方形顶点到原点的距离是√2,而非1。
- 相位失真:原来精细的相位角被近似到四个象限的轴向上(0°, 90°, 180°, 270°)。
FPGA实现技巧在硬件上,1比特系数相关运算发生了质变。复数乘法z = y * conj(x)简化为:
- 根据
yI和yQ的符号位(0为正,1为负),对xI和xQ进行条件取反(即异或操作)。 - 然后执行两次加法(实际上是加/减)即可得到
zI和zQ。
具体来说,原本需要3个乘法器的运算:
zI = yI*xI + yQ*xQ zQ = -yI*xQ + yQ*xI在1比特系数下,yI和yQ属于{+1, -1}。因此:
- 如果
yI=+1,则yI*xI = xI;如果yI=-1,则等于-xI。这等价于xI与yI的符号位进行异或(假设补码表示,取反加一,但对于符号处理,更高效的是直接使用条件取反电路)。 - 同理适用于
yQ。
因此,每个抽头只需要:
- 两个条件取反单元(对于
xI和xQ,由yI控制)。 - 两个条件取反单元(对于
xI和xQ,由yQ控制,注意zQ中xI和xQ的角色互换)。 - 两个加法器。
注意事项与校准
注意:1比特截断后,相关输出的幅度会增大。因为理论上,如果
x也是单位幅度,完美匹配时,z的幅度应该是N(点数)。但现在y的幅度是√2,所以输出幅度��变成约N * √2。同时,由于相位量化,即使x和y完全同相,输出也可能不是纯实数,会引入正交分量噪声。
因此,后级检测门限必须重新校准。论文中提到,可以通过除以一个理论期望值E[|xI| + |xQ|] = 4/π来进行幅度校正。在实际工程中,我通常采用更稳健的方法:在已知信道条件下,通过仿真或实测,统计出1比特相关器输出峰值的分布,然后基于此分布设置一个固定的缩放因子和检测门限。绝对不要直接沿用全精度系数时的门限值,否则会导致检测概率急剧下降或虚警率飙升。
3.2 动态剪枝:化繁为简的智慧
原理与阈值选择动态剪枝是在系数截断基础上的进一步优化。观察1比特系数(yI, yQ),它只有四种可能:(1,1), (1,-1), (-1,1), (-1,-1)。但在单位圆上,一个复数点的I路和Q路幅度很少会正好相等(即相位正好是45°的奇数倍)。动态剪枝问了一个问题:当|yI|和|yQ|不相等时,我们能不能忽略那个较小的分量,只用较大的分量来做相关?
这相当于把复数乘法进一步简化为实数乘法。例如,如果|yI| > |yQ|,我们近似认为y ≈ yI + j*0,那么:
zI ≈ yI * xI zQ ≈ -yI * xQ这样,一个复数乘法就变成了一个实数乘法(同样可简化为条件取反)加上一个路由选择。
关键就在于这个“不相等”的判断阈值λ。论文图3的仿真曲线给出了明确的指导:选择λ = √2/2 ≈ 0.707作为阈值,带来的检测性能损失中值约为0.87 dB。这是一个非常划算的买卖。为什么是0.707?因为当|yI| = |yQ|时,两个分量对相关结果的贡献是相等的,此时忽略任何一个都会带来3 dB的损失(能量减半)。而选择λ=√2/2,确保了被剪枝的分量其能量不超过总能量的一半,从而将最坏情况损失控制在3 dB以内,且平均损失更小。
FPGA实现架构在RTL设计时,动态剪枝相关器抽头的结构如下:
- 比较器:比较
|yI|和|yQ|的大小。对于1比特系数,|yI|和|yQ|非0即1,比较器极其简单。 - 选择器:根据比较结果,选择
xI或xQ作为被操作数,并选择yI或yQ的符号作为控制信号。 - 取反与加法单元:结构比单纯的1比特相关器更简单,因为现在每个抽头只需要处理一个数据流(
xI或xQ)和一个符号控制信号,生成zI和zQ的对应分量。
避坑指南
实操心得:实现动态剪枝时,一个容易忽略的细节是“相等情况”的处理。当
|yI| == |yQ|(在1比特情况下,就是yI和yQ同号且非零?不对,1比特下幅度都是1,相等是常态)。实际上,对于1比特系数,|yI|和|yQ|总是等于1,因此总是“相等”。这里论文的剪枝概念是针对更一般的多比特系数提出的。在1比特特化实现中,我们实际上放弃了动态剪枝的判断,而是采用了一种静态的、预先定义的规则:例如,我们规定当系数为(1,1)或(-1,-1)时,我们默认选择I路(或Q路)进行计算。这相当于在系数生成阶段就人为地将所有点“旋转”了一下,避开了|yI|=|yQ|的相位点。在代码中,这体现为一个固定的选择逻辑,无需动态比较,进一步简化了硬件。
3.3 折叠结构:时间换空间的经典策略
原理与工作流程折叠结构是减少硬件资源消耗的“大招”,尤其针对长延迟线消耗的大量寄存器。其思想是将长度为N的延迟线,在物理上只实现N/M长度,通过时间复用来计算M个不同的相关段。
以4倍折叠(M=4)为例(如图4所示):
- 物理延迟线长度变为
L = N/4 = 350。 - 本地前导码系数也被分为4段:
Seg_A = y[0:349],Seg_B = y[350:699],Seg_C = y[700:1049],Seg_D = y[1050:1399]。 - 工作流程:
- 初始状态,相关器使用
Seg_A的系数与物理延迟线中的信号进行相关运算。 - 每个时钟周期,新的样本移入延迟线,相关结果
Z输出。同时,一个控制状态机在监视着相关输出。 - 当
Z超过某个子门限(sub-threshold),状态机认为可能检测到了Seg_A对应的那段前导码。此时,它并不立即宣布捕获,而是将系数切换到Seg_B。 - 在接下来的时钟周期,它用
Seg_B的系数继续与延迟线中新移入的信号(这些信号在时间上对应原前导码的Seg_B部分)进行相关。 - 如果
Seg_B也超过子门限,则再切换到Seg_C,依此类推。 - 只有当
Seg_A, B, C, D在连续的、正确的时间窗内都依次超过子门限,状态机才最终判定捕获成功,并输出精确的定时信息。
- 初始状态,相关器使用
设计难点与解决方案折叠结构最大的挑战在于虚警率的控制和定时精度的保持。
- 虚警率:由于每个子段(350点)的相关峰远不如全长(1400点)的尖锐,噪声或干扰更容易触发子门限。因此,子门限的设置非常关键。设得太低,虚警率高;设得太高,会漏掉真正的信号。我的经验是,需要通过蒙特卡洛仿真,针对不同的信噪比,绘制子段相关值的统计分布图,根据系统可容忍的虚警概率,来确定子门限。通常,这个门限会比全长相关器的门限低不少。
- 定时精度:折叠后,捕获定时信息的分辨率会下降吗?不会。最终的精确定时是在四个子段都确认后,通过回溯第一个子段触发时的样本索引来确定的。由于控制状态机是严格按样本时钟推进的,只要状态机逻辑正确,最终定时的精度与未折叠时相同,仍然是单个样本的精度。
- 状态机设计:这是折叠结构可靠性的核心。状态机必须能处理各种边缘情况,比如:
- 某个子段检测失败后,如何快速复位并重新开始搜索?
- 如何防止因噪声尖峰导致的错误序列触发(例如,误触发了B段,然后又误触发了D段)?通常需要加入“必须按A->B->C->D顺序连续触发”的约束,并且在一个序列未完成前,忽略其他段的触发。
- 在低信噪比下,子段相关峰可能很宽,如何避免同一个子段被重复判定为多次触发?需要设计一个“静默期”或使用峰值检测逻辑。
资源节省分析折叠结构节省的资源主要体现在:
- 寄存器:延迟线寄存器减少到原来的1/M。对于N=1400,M=4,寄存器从约1400组(每组I/Q两路)减少到350组,节省了75%。
- 组合逻辑:每个抽头的相关运算逻辑(取反、加法等)也减少到原来的1/M。因为物理抽头数减少了。
- 系数存储器:系数仍然需要存储全部的N个,但访问系数存储器的端口和逻辑可以简化,因为同一时刻只使用其中一段。
代价是:
- 增加了控制状态机:这部分逻辑虽然不复杂,但需要精心设计。
- 捕获时间可能变长:在最坏情况下,信号可能刚好在某个子段的相关窗末尾出现,需要等到下一个完整周期才能开始捕获流程。平均捕获时间略有增加。
- 检测性能损失:如图7所示,会有约2.1 dB的损失。这是因为子段检测比全长检测更容易受噪声影响,且四个子段必须全部正确检测,任何一个失误都会导致整个��获失败。
4. FPGA原型实现与性能实测
4.1 硬件平台与设计版本
为了验证上述理论,我在Intel Arria 10 SoC FPGA开发板上构建了硬件原型系统。目标波形是HOPS任意相位扩频信号,前导码长度8个符号,扩频比175,因此总相关长度N=1400。我实现了四个版本的设计进行对比:
- 版本1:暴力匹配。作为性能基准。由于Arria 10的DSP Block数量有限(3374个),无法直接实例化4200个乘法器,因此采用了计算单元时分复用的架构,以更高的时钟频率来完成计算。
- 版本2:1比特截断。系数精度降至1比特,复数乘法器被条件取反和加法器树替代。
- 版本3:1比特截断 + 动态剪枝。在版本2基础上,采用
λ=√2/2的剪枝规则,进一步简化计算单元。 - 版本4:1比特截断 + 动态剪枝 + 4倍折叠。在版本3基础上,应用折叠结构,将物理相关器长度降至350。
所有版本共享相同的输入输出接口、时钟管理、以及后续的相位/频偏估计模块,确保对比的公平性。
4.2 资源利用率对比分析
下表是Quartus编译拟合后的资源利用率报告摘要,这直接反映了硬件成本:
| 设计版本 | ALMs (自适应逻辑模块) | 专用寄存器 | DSP Blocks (18x19乘法器) | 关键变化与说明 |
|---|---|---|---|---|
| 1. 暴力匹配 | ~79,000 | ~2,800 | 4,200 (时分复用) | 基准。消耗大量DSP和逻辑。 |
| 2. 1比特截断 | ~72,801 | ~2,600 | 0 | 最大亮点:DSP归零。逻辑略有减少。 |
| 3. 截断+剪枝 | ~60,500 (较版本2↓17%) | ~2,200 | 0 | 剪枝节省了约17%的组合逻辑(ALUT)。 |
| 4. 截断+剪枝+折叠 | ~18,200 (较版本3↓70%) | ~460 (较版本3↓79%) | 0 | 资源消耗断崖式下降,逻辑资源降至接近1/4。 |
结果解读与工程选择:
- DSP Block的消除是1比特截断带来的最革命性优势。DSP Block是FPGA上的稀缺战略资源,通常用于高性能滤波、FFT等。将其释放出来,意味着系统可以集成更复杂的基带处理或应用层功能。
- 动态剪枝带来了可观的逻辑资源节省(17%)。这对于追求极致面积优化的ASIC设计可能意义更大,在FPGA上,其收益相对于折叠结构来说不那么震撼,但仍然是正向优化。
- 4倍折叠结构是资源削减的“杀手锏”,将ALM和寄存器消耗降低了70%以上。这对于成本敏感、逻辑容量有限的低端FPGA或IoT专用芯片而言,是决定性的。
实操心得:在综合实现时,要特别注意时序收敛。尤其是版本4的折叠结构,其中控制状态机的路径可能成为关键路径。建议将状态机与数据路径(相关器计算)用寄存器隔开,采用流水线设计。另外,相关器输出的峰值检测和门限比较电路,也要做好流水,避免形成长组合逻辑链,影响系统最高时钟频率。
4.3 检测性能实测与损失评估
资源省了,性能到底掉了多少?这是工程权衡的核心。我们通过注入高斯白噪声,测量了不同信噪比(SNR)下的检测概率(PD)。
- 图5趋势:所有优化版本的检测曲线都向右移动(需要更高SNR才能达到相同PD),这是预期的性能损失。但曲线形状保持相似,说明优化没有破坏相关器的基本功能。
- 定量损失(在PD=0.9处测量):
- 版本2 (1比特截断):相比暴力匹配,损失约5.49 dB。这是代价最大的一步,因为它引入了幅度和相位量化噪声。
- 版本3 (截断+剪枝):损失降低到约2.06 dB。动态剪枝不仅没增加损失,反而挽回了不少性能!这是因为剪枝过程实际上丢弃了那个幅度较小的、信噪比更差的分量,相当于进行了一次简单的“噪声选择”,反而提升了输出信号的质量。
- 版本4 (折叠):最终损失约为2.10 dB。与版本3相比,仅增加了约0.04 dB的额外损失!这意味着,折叠结构在节省了70%以上逻辑资源的同时,对检测性能的负面影响微乎其微。这主要归功于子段相关仍然积累了足够的信号能量,而控制状态机有效地整合了四个子段的结果。
性能损失的工程补偿: 2 dB左右的损失在低功耗物联网系统中是否可接受?这取决于链路预算。如果无法接受,可以通过以下方式补偿:
- 增加前导码长度:这是最直接的方法,用更长的积分时间来换取处理增益,抵消相关器损失。但会增加开销,降低有效数据速率。
- 后级累积:论文提到,可以在检测到峰值后,将存储的原始信号样本(或未截断的系数)重新进行一轮全精度的、但长度较短的相干累积,以提升信噪比估计和相位估计的精度。这需要增加一个高精度乘加器和一些存储资源,是性能与资源的再次权衡。
- 优化门限算法:采用自适应门限,而非固定门限,可以在低信噪比下提升检测概率。
4.4 相位与频偏估计的影响
优化后的相关器,其输出峰值的相位信息是“粗糙”的。1比特截断和剪枝严重量化了相位。因此,直接使用优化相关器输出的相位来进行载波同步,误差会很大。
解决方案:
- 粗同步与精同步分离:优化相关器只用于粗捕获(判定信号有无和大致定时)。一旦捕获成功,利用捕获到的定时信息,从原始信号缓冲区中提取出一小段信号,使用一个小型的、全精度的相关器或鉴相器来进行精细的相位和频偏估计。这个小型相关器可以复用,硬件开销很小。
- 使用导频符号:在数据载荷中插入已知的导频符号,在解扩后利用导频进行更精确的信道估计和相位跟踪。
在我的实现中,我采用了第一种方案。优化相关器输出触发信号和粗略的定时戳,然后启动一个后续的精同步模块,该模块使用存储的、未截断的前导码系数副本,与对应的信号样本进行一段短时间的全精度相关,从而得到精确的相位和频偏估计值。这种两级同步架构,既享受了低功耗捕获的好处,又保证了后续解调的性能。
5. 扩展应用与设计考量
5.1 低功耗异步接收
直通相关器的低复杂度特性使其非常适合用于异步接收场景,即接收机在不清楚信号确切到达时间的情况下持续监听。传统高复杂度相关器持续运行功耗巨大。而优化后的相关器,特别是折叠版本,逻辑门数少,静态功耗和动态功耗都显著降低。可以设计一个“唤醒无线电”系统:主处理器休眠,由这个低功耗相关器持续监视信道。只有当相关器输出超过门限,产生一个中断信号时,主处理器和接收链的其他高功耗模块(如高速ADC、精密锁相环)才被唤醒。这能极大延长电池供电设备的寿命。
5.2 物理层水印与安全认证
基于混沌序列的非重复扩频码本身具有很好的保密性。优化相关器可以作为一种轻量级的物理层防火墙或水印验证器。发送端在信号中嵌入一个只有合法接收机知道的、特定的短序列(水印)。接收机的优化相关器并行配置多套系数,其中一套对应这个水印序列。只有水印验证通过,才允许信号进入后续的解调和解码流程。非法设备即使截获信号,由于不知道水印序列和其对应的系数,也无法通过这道“物理层关卡”。优化相关器的低成本使得在资源受限的设备上实现这种安全功能成为可能。
5.3 接收机分配CDMA
在物联网的多节点接入中,RA-CDMA是一种让接收机为发送机分配签名码的方案,可以简化网络管理。每个物联网设备都需要能够快速与不同的签名码进行相关运算。使用传统相关器,要么为每个可能的码准备一套硬件(面积爆炸),要么用一套硬件时分复用(延迟高)。优化后的直通相关器,由于其系数可快速动态加载,且硬件成本低,非常适合这种场景。接收机可以快���切换系数,以极低的功耗和延迟,扫描或匹配多个不同的签名码,从而实现灵活高效的随机接入。
5.4 设计选型决策树
面对一个具体的物联网通信项目,如何选择相关器方案?可以参考以下决策流程:
- 明确约束:首先确定核心约束是功耗、成本(逻辑面积)还是极致性能。
- 评估链路预算:计算系统可容忍的检测性能损失。如果链路余量充足(> 3 dB),可以大胆考虑优化方案。
- 选择优化组合:
- 如果DSP资源极度紧张:首选1比特截断,这是消除乘法器的必选项。
- 如果逻辑面积也紧张:在1比特截断基础上,加入折叠结构。M的选择(2倍、4倍、8倍)取决于你对捕获时间和性能损失的进一步权衡。
- 如果追求最佳能效比:采用“1比特截断 + 动态剪枝”组合。它在性能和资源之间取得了很好的平衡,实现也相对折叠结构更简单。
- 如果对性能损失非常敏感:考虑使用2比特或3比特截断作为折中,这能减少量化损失,但会重新引入一些乘法逻辑(可以用查找表LUT实现小位宽乘法)。
- 系统级联调:优化相关器的门限、后级精同步模块的参数,需要与整个接收机的自动增益控制、信道估计等模块联合调试,以达到整体最优。
最后,分享一个我在调试折叠结构时踩过的坑:最初,我的子段检测门限设置得过于宽松,导致在噪声环境下,经常错误地触发A->B->C序列,但在D段失败,浪费了大量时间在虚假的捕获尝试上,平均捕获时间反而变长了。后来,我通过大量仿真,优化了子门限,并在状态机中加入了“超时重置”机制——如果一个捕获序列在预期时间内没有完成,就强制复位状态机,重新开始搜索。这个简单的机制极大地提升了在低信噪比下的搜索效率。记住,在低功耗设计中,避免无谓的运算和等待,本身就是省电的关键。