一条序列就是一个向量
先把雷达放到一边。一条长度 N 的四相序列,就是一个 N 维复向量:每一位取 1、i、-1、-i 之一,写成 i 的幂就是 i⁰、i¹、i²、i³,提交时就写作 0、1、2、3。这四个符号不是四个互不相干的类别,而是同一个单位圆上的四个角度,可以做差、可以相乘,这一点是后面所有内容的基础。
一个码本是五个这样的向量。题目要的不是随便五个,而是五个彼此「指向不同方向」的向量,并且这个要求还要对它们的每一个平移版本都成立。
内积就是「这两个方向有多像」
两个复向量的内积是 ⟨y, x⟩ = Σ yₜ · conj(xₜ)。每一项 yₜ·conj(xₜ) 是两个单位复数的商,也就是这一位上的相位差。
如果两个向量本来就指着同一个方向,每一位的相位差都相同,求和时全部同相叠加,模会很大,最大就是 N。如果它们指着不同方向,相位差散落在单位圆各处,求和时互相抵消,模接近零。
所以内积不是一个相似度评分,它是在回答一个是非题:这两段是不是同一个信号。大就是「是」,接近零就是「否」。这个判据本身很好用,接收器正是靠它把回波认出来的。
整道题的难处不在这个判据,而在于接收器要在上千个组合上问同一个问题,其中只应该有一个回答「是」。任何一个不该匹配的组合也给出大内积,接收器就会把两件不同的事认成同一件。压低那些内积,不是目的本身,是为了让那唯一的「是」成为唯一。
看的是模而不是方向,因为一次反射会给整段信号加上一个未知的整体相位。整体旋转会转动内积,却不改变它的模。
每一个错位就是一个距离
这是理解这道题的关键一步。回波要花时间才回来,接收器事先不知道花了多久,所以它把候选序列依次错开 0 位、1 位、2 位……逐个去算内积。错位 k 不是一个抽象参数,它就是一个距离假设:「目标在这个距离上吗」。
于是接收器不是在问一个问题,而是在问一整张表的问题:五个通道 × 每一个可能的距离。它对每个问题的回答,就是那个内积的模有多大。
这一整张表里,应该只有一个格子给出响亮的「是」:正确的通道,正确的距离。其余每一格都必须接近零。这就是整道题。
错位 |k| 重叠长度 这个内积在问什么 0 N 两条完整向量像不像 1 N-1 错开一位以后还像不像 2 N-2 错开两位以后还像不像 ... ... N-1 1 只剩一位重叠
每条序列和自己有 N−1 个非零错位(正负错位的模相同,只数一半),每两条不同序列之间有 2N−1 个错位,五条里有 10 对。加起来是 5(N−1) + 10(2N−1) = 25N − 15 个格子。N = 37 时是 910 个,N = 73 时是 1810 个。
所以要的是:全部错误组合都近似正交
把上面两节合起来,这道题可以一句话说完:
设计五个只用四种相位的复向量,使它们连同全部平移版本组成的集合,在每一个不应匹配的组合上都尽可能接近正交。
唯一不需要压低的是 a = b、k = 0,也就是一条序列和自己正确对齐。那一项必然等于 N,它是真检测峰,不参与计分。除它以外的每一个内积都要小。
正交和不正交长什么样
取两条长度 4 的序列。A 是常相位,四位都是 0°;B 每一步转四分之一圈,是 0°、90°、180°、270°。写成向量就是 A = (1, 1, 1, 1),B = (1, i, -1, -i)。
不错位时 ⟨A, B⟩ = 1 − i − 1 + i = 0。它们正交:接收器收到 B 却拿 A 去检测,理想情况下响应为零。而 ⟨B, B⟩ = 4,正确的候选给出满响应。
但这只说明了一个格子。A 和自己的错位版本就很糟:错开一位模是 3,两位是 2,三位是 1。也就是说,A 会在几乎每一个距离上都报「有目标」。一条常相位序列在这道题里是最坏的答案,不是因为它和别人不正交,而是因为它和自己的每一个平移都太像。
A = (1, 1, 1, 1) B = (1, i, -1, -i) ⟨A, B⟩ 错位 0 = 0 正交,好 ⟨B, B⟩ 错位 0 = 4 真检测峰,不计分 ⟨A, A⟩ 错位 1 模 3 A 在这个距离上报了假目标 ⟨A, A⟩ 错位 2 模 2 ⟨A, A⟩ 错位 3 模 1
怎么手算一个内积
0、1、2、3 不是四个标签,是指数:符号 p 表示 i^p。于是每一项 i^p · conj(i^q) = i^(p−q),一次复数乘法退化成一次模 4 的减法。整个内积因此不需要任何复数运算。
三步就算完。第一步,把两行错开对齐,逐位算上面的符号减下面的符号,模 4。第二步,数一数结果里 0、1、2、3 各出现了几次,记作 n₀、n₁、n₂、n₃。第三步,实部是 n₀ − n₂,虚部是 n₁ − n₃,模平方就是两者的平方和。
这三步为什么对:结果 0 的那些项每一项是 +1,结果 2 的是 −1,两者在实轴上相消;结果 1 的是 +i,结果 3 的是 −i,在虚轴上相消。所以内积就是四个计数的两个差。
A = 0 0 1 3 B = 0 2 3 1
逐位差 n₀/n₁/n₂/n₃ re = n₀−n₂ im = n₁−n₃ 模平方
错位 0 0 2 2 2 1/0/3/0 -2 0 4
错位 1 0 3 0 2/0/0/1 2 -1 5
错位 2 1 1 0/2/0/0 0 2 4这和验证器算出来的完全一样。它也说明了要追求什么:四个计数越平均,两个差就越接近零。一个内积之所以大,就是因为某一种相位差压倒性地多,也就是两行在这个错位上确实像。
两种错误各自意味着什么
同一条序列和自己的非零错位内积过大,意味着一个真实目标会在错误的距离上再出现一次。不同序列之间的内积过大,意味着一个通道的回波跑进了另一个通道的检测结果,出现一个从来没照过它的方向上的目标。
分数只看最坏的那一个。原因是接收器分不清「一个强目标的错误响应」和「另一处一个弱目标的正确响应」,所以真检测峰和最大错误峰之比,直接决定了一个目标最多能比另一个弱多少还看得见。
本站发出的两份长度 73 的码本正好演示了这个比值。两份的真检测峰都是 73。
真检测峰 最大错误峰 比值 常量码本(基线) 73 73 1.00 倍 = 0.0 dB 已审计的那份 73 11.18 6.53 倍 = 16.3 dB
常量码本的比值是 1.00:错误峰和真峰一样高,什么都分辨不出来。它是本站的基线,因为它是任何人都能一句话写出来的最差答案,而本站不替自己的题目求解。
计分:三个整数
每一位都是 1、i、-1、-i,所以每个内积都是高斯整数,实部虚部都是整数。分数用模平方 re² + im²,不必开方,验证器用整数精确算完,没有任何浮点或容差。
最终分数是三个整数,按优先级依次比较:全部错误组合里最大的模平方;达到这个最大值的组合有几个;全部错误组合的模平方之和。页面显示为「峰值模平方 · 并列数 · 总能量」,中间的点不是乘号。
要三级是因为主分数是个很小的整数,上千个组合里并列会非常频繁。只按它排名,纪录会归于最先提交的人而不是码本更好的人。第一次读这道题可以先忘掉后两项,只记住:让所有错误匹配里最严重的那一个尽可能低。
下界方面,长度 73 上 Welch 型不等式给出的实数下界是 22.21。但模平方是两个整数的平方和,而 23 和 24 都写不成两个平方数之和,25 = 3² + 4² 可以,所以严格下界是 25。目前没有找到这组参数下可下载并逐一验算的公开码本,所以本站不设 known best,区间是敞开的。
为什么只有四个相位,以及这有多大
相位如果能连续取值,找低相关波形会容易得多,文献里也有很接近理想的连续解。但真实发射机要求每个脉冲等幅、相位只能取有限档、且能被数字调制器直接产生。四相调制正好满足这三条,那些连续解发不出去。
固定每条首相位之后,候选数是 4^(5(N−1))。N = 37 时约是 10^108,穷举没有意义。更麻烦的是耦合:改动一个位置会同时改变这条序列的许多自相关值,以及它和另外四条的许多互相关值,把当前最坏的那个峰压下去,常常让另一个错位变成新的最坏峰。这是一个高度耦合的离散极小极大问题。
现实里这是什么问题
多输入多输出的雷达或声呐让多个通道同时发射,接收到的是所有回波的叠加。接收器靠上面那张表把它们拆开:回波来自哪个通道,延迟了多久,对应目标在什么距离。错误匹配上的高峰在屏幕上就是假目标、错误距离和通道串扰。
所以低自相关旁瓣、低互相关的有限相位码本是一个实际的波形设计问题,文献里有成熟的方法。P70 取了它一个简化到可以精确验证的模型:固定五个通道,只允许四种相位,要求所有错误匹配里最坏的那个峰尽可能低。