算法原理说明:基于相关峰检测的信号定时同步器
1. 概述
本模块 corr_sync_top 用于在接收链路中检测已知前导序列(Preamble)的到达时刻,输出一个单周期定时同步脉冲 m_axis_sync_pulse,标记帧边界。核心方法是滑动窗互相关 + 能量峰值判决 + 多径保护窗抑制。
适用场景:突发通信帧同步、BPSK/QPSK 前导捕获、雷达/声呐脉冲对齐、扩频码同步等需要"在噪声中找到已知模板出现位置"的定时恢复问题。
2. 算法数学模型
2.1 互相关
设接收复信号为 r(n)=rI(n)+j rQ(n)r(n) = r_I(n) + j\,r_Q(n)r(n)=rI(n)+jrQ(n),本地已知前导序列为 c(k), k=0,1,...,N−1c(k),\ k=0,1,\dots,N-1c(k), k=0,1,...,N−1。滑动窗互相关定义为:
R(n)=∑k=0N−1c(k)⋅r(n−k) R(n) = \sum_{k=0}^{N-1} c(k)\cdot r(n-k) R(n)=k=0∑N−1c(k)⋅r(n−k)
当接收窗内的数据与本地前导对齐时,R(n)R(n)R(n) 出现显著峰值。本设计前导为 BPSK 码,即 c(k)∈{+1,−1}c(k)\in\{+1,-1\}c(k)∈{+1,−1},因此乘法退化为条件加减:
R(n)=∑k=0N−1 c(k)=1 ? +r(n−k) : −r(n−k) R(n) = \sum_{k=0}^{N-1}\big\\,c(k)=1\\ ?\\ +r(n-k)\\ :\\ -r(n-k)\\,\\big R(n)=k=0∑N−1c(k)=1 ? +r(n−k) : −r(n−k)
这一退化是硬件实现的关键------省去了 NNN 个通用乘法器,只保留符号选择的加减树。
2.2 相关能量
对复相关结果取模平方,得到与相位无关的能量指标:
P(n)=∣R(n)∣2=RI2(n)+RQ2(n) P(n) = |R(n)|^2 = R_I^2(n) + R_Q^2(n) P(n)=∣R(n)∣2=RI2(n)+RQ2(n)
用能量而非幅度,是为了对载波相位偏移不敏感------只要码型对齐,无论初相如何,能量都会出现峰值。这是抗频偏/相偏的基础。
2.3 判决准则
同时满足以下三条才判定为有效同步点:
{P(nc)>T超过门限P(nc)≥P(nc+1) 且 P(nc)>P(nc−1)局部极大保护窗空闲非多径副瓣 \begin{cases} P(n_c) > T & \text{超过门限} \\ P(n_c) \ge P(n_c{+}1)\ \text{且}\ P(n_c) > P(n_c{-}1) & \text{局部极大} \\ \text{保护窗空闲} & \text{非多径副瓣} \end{cases} ⎩ ⎨ ⎧P(nc)>TP(nc)≥P(nc+1) 且 P(nc)>P(nc−1)保护窗空闲超过门限局部极大非多径副瓣
其中 ncn_cnc 是 3 点滑窗的中心点,TTT 为可配门限。局部极大值判定用于精确定位峰尖,避免在峰的上升/下降沿误触发。
3. 关键设计决策与本质
很多人以为同步器就是"算个相关再比大小",但真正决定上板稳定性的是三个底层问题:长路径时序、DSP 对齐、多径虚警。逐一说明。
3.1 为什么用树形流水加法,而不是直接累加
N=16N=16N=16 点直接串联累加会形成 15 级加法器的组合长路径,最高频率 FmaxF_{max}Fmax 被这条路径压死在百兆以下。
解决方式是把累加拆成 2 级二叉树 + 1 级归约,每级插寄存器:
16点 --Stage1--> 8点 --Stage2--> 4点 --Stage3--> 1点
(17bit) (18bit) (20bit)
本质:用寄存器面积换关键路径长度。每级只有 1~2 个加法器的延迟,FmaxF_{max}Fmax 可拉到 300MHz+。位宽逐级 +1 是为了防止累加溢出(每加一次最多进位 1 位)。
3.2 为什么显式写 DSP48 对齐寄存器
I2+Q2I^2+Q^2I2+Q2 的平方用 DSP48 硬核实现。DSP48 内部有 AREG/BREG(输入寄存器)和 PREG(乘积寄存器)。如果不在 RTL 里显式打拍,综合工具可能不把寄存器推进 DSP,导致布线延迟大、时序难收敛。
本设计显式写了两级寄存:a/b(对应 AREG/BREG)→ mult(对应 PREG),确保 100% 映射进 DSP 硬核流水,不依赖工具猜测。
3.3 为什么需要多径保护窗
真实无线信道存在多径:主径之后会有延迟、衰减的回波。回波同样是前导码的副本,也会产生一个(较弱的)相关峰。如果不处理,一帧会触发多个同步脉冲,造成帧定位混乱。
解决方式是命中后启动保护窗 protect_cnt = PROTECT_LEN(建议取 2N2N2N),在窗内屏蔽一切新的判决,逐拍递减到 0 才解除。本质是"抓住第一个强主径,吞掉后续所有副瓣"。
4. 定点化设计
| 节点 | 位宽 | 说明 |
|---|---|---|
| 输入 I/Q | 16-bit signed | 接收采样量化 |
| Stage1 | 17-bit | 2 点加减,进位 +1 |
| Stage2 | 18-bit | 再 +1 |
| Stage3 (相关值) | 20-bit | 16 点累加,log2(16)=4 位余量 |
| 乘积 mult | 40-bit | 20×20 |
| 能量截断 | 取 39:8 | 右移 8 位,映射到 32-bit 比较空间 |
| 能量求和 | 33-bit → 饱和 32-bit | 防 I²+Q² 相加回绕 |
能量截断的取舍 :取高位段 [39:8] 相当于右移 8 位,丢弃低位精度换取比较器位宽可控。峰值理论值可由此推算,例如满幅前导 ∣R∣=16×1000=16000|R|=16\times1000=16000∣R∣=16×1000=16000,则 P=2×160002/256≈2 000 000P=2\times16000^2/256\approx2\,000\,000P=2×160002/256≈2000000,门限即据此设定。
5. 流水线时延
从有效输入到能量输出,pipe_valid[0..6] 共 7 级:
Stage1(1) → Stage2(1) → Stage3(1) → AREG/BREG(1) → PREG(1) → 能量求和(1) → 判决(1)
即 s_axis_din_valid 拉高后约 7 个时钟周期,对应的 m_axis_corr_power 才输出。做时序对齐或与其他链路合并时须计入这个固定延迟。
6. 接口与握手
采用 AXI-Stream valid-ready 双向握手:
- 上游:
s_axis_din_valid/s_axis_din_ready,本设计内部无阻塞,ready恒高;若后续加 FIFO 反压,握手协议天然支持挂起。 - 下游:
m_axis_sync_pulse(单周期脉冲)、m_axis_corr_power(实时能量)、m_axis_peak_power(峰值锁存,供 SNR 估计)。
跨时钟域注意 :m_axis_sync_pulse 是单周期脉冲,若下游位于异步时钟域,必须外接脉冲同步器(cdc_pulse_sync),禁止直接跨域连接,否则会丢脉冲或产生亚稳态。
7. 参数配置
| 参数 | 默认 | 含义 |
|---|---|---|
N |
16 | 前导序列长度 |
PROTECT_LEN |
32 | 多径保护窗长度,建议 2N |
PREAMBLE_PATTERN |
16'b1011_0101_0000_1111 | 本地前导码(1=正,0=负),换协议改此处 |
TH_MIN / TH_MAX |
1e4 / 5e7 | 门限上下限钳位,防配 0 全虚警或超大全漏警 |
8. 性能与局限
适用:静态或慢变信道、码型已知、SNR 中等以上的突发同步。
局限:
- 大频偏下 R(n)R(n)R(n) 会因码内相位旋转而衰减,若频偏超过约 1/(N⋅Ts)1/(N\cdot T_s)1/(N⋅Ts) 量级,需先做频偏预估或改用差分相关。
- 门限 TTT 为静态配置,强时变噪声下建议改用基于滑动噪声功率的动态门限(归一化相关)。
- 保护窗为固定长度,若多径时延扩展超过
PROTECT_LEN,仍可能漏抑;需按信道最大时延调PROTECT_LEN。
9. 参考对照
- 相关峰检测:Van Trees, Detection, Estimation, and Modulation Theory
- 前导同步经典:Schmidl & Cox 定时同步算法(OFDM 场景可延展)
- DSP48 流水结构:Xilinx UG579《UltraScale DSP48E2 用户指南》
沉淀的资产
- 一份可复用的相关峰同步算法数学模型(互相关 → 能量 → 三准则判决)
- "树形流水 + DSP 显式对齐 + 多径保护窗"三大工程决策的本质说明,可迁移到其他相关类模块
- 完整定点位宽表与峰值理论值推导,直接指导门限设定