详解

把五条序列排成互不相像的方向

一条序列就是一个向量,它的每一个平移是另一个向量,而平移量就是距离。读完这一篇,P70 的题面里不会再有需要猜的东西。

一条序列就是一个向量

先把雷达放到一边。一条长度 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 取了它一个简化到可以精确验证的模型:固定五个通道,只允许四种相位,要求所有错误匹配里最坏的那个峰尽可能低。