最近在调一套 UWB 测角,遇到件很别扭的事:设备规格写着 ±90°,可实际把标签移到 70° 附近,读数就开始飘;再往外挪,干脆给你一串整整齐齐的 90°——不报错、不打标,看起来完全正常。
后来把阵列的天线间距和那张相位差-角度校准表摊开重算了一遍,才发现问题不在算法,而在「±90°」这个数字本身的地基上。
这篇文章把一张真实的 21 点 AOA 校准表逐行算给你看,拆出三个天花板:有效间距为什么不是 PCB 上量出来的那个、灵敏度塌陷怎么把角度误差放大 4~17 倍、以及表本身的噪声怎么被线性插值固化进每一个结果里。最后给一套「三步反推自己设备边界」的方法——不需要厂商告诉你,导出表就能做。
一、一个「±90°」的承诺,是怎么来的
先说清楚 PDOA(到达相位差)在测什么。
两根天线,间距 d,中间隔了一小段距离。一个平面波以入射角 θ 斜着打过来,它到达两根天线的路程是不一样的:
Δl = d · sinθ
这个路程差对应一个时间差。举个例子:d 取 20 mm,θ 取 60°,Δl ≈ 17.3 mm,换算成时间大约是 58 ps。皮秒级,直接测时间差基本没戏。
但同样的路程差,折算到载波相位上就好测得多:
Δφ = (2πd / λ) · sinθ
θ = arcsin(Δφ · λ / 2πd)
λ 是波长。6.5 GHz 附近大概是 46 mm,9 GHz 附近大概是 33 mm。d 只要能做到 λ/2 左右,θ 从 −90° 走到 +90°,Δφ 就正好从 −π 走到 +π,一一对应,完美。
UWB 之所以能拿到这个相位,是因为它压根不是在测正弦波的瞬时相位。芯片会算出信道冲激响应 CIR,拿到一串 I/Q 复数样本;两根天线各自找到首径的位置,取共轭相乘,幅值和相位差就都有了。加上 UWB 那 500 MHz 以上的带宽能比较好地把多径分开、锁住直射那条径,这个相位差才站得住。
到这里为止,教科书都是对的。问题出在下一句:当 d ≤ λ/2 时。
这句话是整个「±90°」承诺的全部地基。它要求 θ 从 −90° 扫到 +90° 时,Δφ 恰好从 −π 走到 +π,不早不晚。而现实是,只要 有效间距比 λ/2 大一点这个承诺就打折,比 λ/2 小一点呢——倒是不模糊了,但每一度对应的相位变化也跟着变小,灵敏度白白浪费。所谓 λ/2,本质上是在「不模糊」和「够灵敏」之间取的一个刚好卡满的点。
它是设计目标,不是出厂事实。
图1:PDOA 测什么——一段程差,折算成载波相位差。
二、没有表的时候,角度是算出来的
没做校准的设备,通常走一条叫 ArcSin 的路。
固件里埋着一个换算常数,形态大致是 2¹⁴/π/k,这里的 k 是「天线间距 ÷ 半波长」。测到 Δφ,乘上这个常数,归一化成一个落在 [−1, 1] 里的 sin 值,丢给硬件的 arcsin 加速单元,直接出角度。
这条路很省事,但它有两处会让误差沉默地消失。
一是那个常数里的 k。它假设了间距是设计值,而且不随角度变。前面说的「有效相位中心会漂」,它完全不打算处理。
二是钳位。乘出来的值一旦超出 ±1,固件会直接把角度钉死在 ±90°,不报错、不打标。
第二点我想多说一句,因为它在调试现场特别阴。你在数据里看到一串整整齐齐的 90°,第一反应是「信号从正侧面过来了」或者「标签就在那个方向上」。实际上那可能是公式在告诉你「这个角度我算不出来了,但我懒得跟你说」。它和上层的软件之间没有告警通道,所有的失败都被伪装成了一个合理的读数。
图2:算不出角度时,ArcSin 路径会把结果钉在 ±90° 且毫无告警——失败被伪装成合理读数。
所以第二条路才是量产的常态:查表。
三、有表的时候,角度是查出来的
所谓有表,就是认了「Δφ 和 θ 之间那条 arcsin 曲线我信不过」这件事,改用转台上真的摆一遍。
这台设备的方位角表,从 −100° 到 +100°,10° 一格,21 个点,每个角度对应一个实测出来的 Δφ。运行时测到 Δφ,二分法定位它落在哪两格之间,再做一次线性插值,出角度。
多出来的这两(线性插值 + 二分)看起来很朴素,但它换到的东西很关键:表里可以同时装下有效间距偏移、天线方向图不对称、结构件的遮挡、甚至装配公差带来的那点歪斜。这些都是没法写进公式的东西,但它们全都实实在在影响了相位差,查表把它们一次性全吸收了。
代价当然是标定工时——这张表要一个点一个点打出来。所以格子取多密,永远是一场交易:10° 一格是常见的折中,意味着格内那 10° 全靠线性插值去猜。后面会看到,这个「猜」在边缘地带会付出多大代价。
顺带说一句容易被忽略的:这套机制有个隐含前提——表能覆盖到真实来波的角度。超出表两端的部分,常见的处理是直接取边界索引、不再插值。也就是说,超出之后它不会报错,只会给你一个看起来很克制的边界值。第四节和第五节会分别把「模糊先到」和「饱和先到」这两种情况拆开讲。
为什么要这么麻烦?因为第二节那两个假设,在这台设备上一个都不成立。
四、天花板一:有效间距不是 PCB 上量出来的那个
我们把这张表归一化——把 π 记成 1.0,然后看它们长什么样。
盯着最后一行看:θ = 90° 的时候,Δφ 不是 1.0,是1.232。
代回 Δφ = (2d/λ) · sinθ,θ = 90° 时 sinθ = 1,于是:
2d/λ = 1.232 →d ≈ 0.616 λ
设计目标是 0.5λ。实际大了约 23%。
PCB 上的物理间距没画错。超的是有效相位中心——天线的有效入射点不是 SMD 封装的几何中心,而且它会随着来波方向漂移。这就是为什么前面说「d ≤ λ/2」是个假设:你按几何中心设计,系统按有效中心工作,中间隔着这 23%。
一旦 d > λ/2,θ 走到某个角度时 Δφ 就会先撞到 π,然后开始绕圈——同一个相位差,开始对应多个角度。
这张表的缠绕点在哪:
- 正侧:+65.50°(+60° 和 +70° 之间插值)
- 负侧:−63.46°(−70° 和 −60° 之间插值)
四分之一的视野,是不存在的。标称 ±90°,实际能用 ±65°。
图3:把这张表归一化后画出来——理想 d=λ/2 该是平滑 sin 曲线(灰虚线),实测(蓝)在 ±65° 前后就撞上 ±π 开始绕圈,两端彻底饱和。
这件事在布点的时候会咬人。很多人心里默认一个单锚点 AOA 能覆盖一个半平面——装在墙上,正前方 180° 都能管。按这两边的缠绕点算,它其实只能管一个大约130° 的扇形。要是现场图省事按 180° 排布,边上那 50° 就是一片没人认领的盲区:不报错,照样出数,只是那个数是错的。
这也是我一直觉得 AOA 应该先谈视野、再谈精度的原因。精度的事还能靠滤波、靠多锚点冗余去补,视野补不了。
图4:标称 ±90°(覆盖 180° 半平面)是幻觉。按缠绕点算,单锚点实际只管一个约 130° 的扇形,边上 50° 是没人认领的盲区——不报错,照样出数,只是数是错的。
五、天花板二:灵敏度塌陷,误差被放大 4 到 17 倍
就算你规规矩矩待在不模糊的范围内,事情也还没完。
真正决定精度上限的不是「能不能算出角度」,而是「相位噪声换算到角度时,会被放大多少倍」。放大倍数就是灵敏度 dΔφ/dθ 的倒数——每个角度变化 1°,Δφ 变化越小,同样的相位抖动就越容易顶出一堆角度误差。
我把这张表逐段算了一遍灵敏度,以 0°→10° 段为基准 1.000:
先看首尾两行——0.000。表的两个端点 −100°/−90° 和 +90°/+100°,Δφ 是同一个值。超出了,相位差不再变化,角度彻底不可分辨。注意这里的坏消息不是「误差大」,而是「误差不增长」:你已经丧失了对这个自由度的观测能力,但系统照旧每秒给你报一个看起来很正常的度数。
再看中间:+60° 到 +70° 这一段,灵敏度只剩中心区的四分之一。同一个硬件、同一份相位噪声,在这里换算出来的角度误差是 0° 附近的 4 倍。
灵敏度为什么会随角度掉?有两股力量在往同一个方向拉。
第一股是几何本身。Δφ 是 sinθ 的形状,它的导数就是 cosθ——θ 往两边走,cos 天然变小,这是任何一套 PDOA 都躲不掉的。光这一条,60° 处的灵敏度就该掉到 0° 处的一半左右。
第二股是逼近缠绕。一旦 Δφ 逼近 ±π,这条曲线不只是变平,它马上要回头了——回头意味着多值,多值意味着分母意义上的归零。这股力量把衰减拉得比单纯的 cosθ 更陡。
这就是「角度一到大角度就崩」的量化答案。不是玄学,是分子变小了。
图5:把逐段灵敏度连成曲线——几何的 cosθ 让它平缓下滑,但逼近缠绕时曲线要回头,塌得比纯 cosθ 更陡。
图6:同一份相位噪声,在不同角度换算成的角度误差放大倍数。最差的 −40°→−30° 段放大 16.8×,+60°→+70° 段 4.08×。
理想情况下这个衰减是 cosθ 的形状,平缓、对称、可预测。但实测数据不是这样——这就引出第三个天花板。
六、天花板三:你的表,本身就带着噪声
把第五节的灵敏度排成一列连着看,会发现一件很不舒服的事:
0.363→0.060→0.201
这是 −50°→−40°、−40°→−30°、−30°→−20° 三段。中间那一段突然掉到邻居的六分之一,然后又弹回来。
理想曲线不会这样。sin 的导数是平滑的,不该在某一段突然塌陷再跳起来。这一段就是这个角度区间的标定本身有噪声——转台上的那几个点,采样不够、环境有扰动、或者恰好赶上一次多径。
而运行时的查表逻辑是线性插值。它不知道哪一段是噪声,它只会忠实地在你的落点两侧取值、加权、输出。于是标定误差就被一个不落地插进了每一个结果里。
你的 LUT 质量,就是你的测角上限。
这条我想强调一下,因为它是三个天花板里最容易被忽略的一个。前两个至少还有概念的容身之处——「总线长」「视角」,选型会上总有人聊。第三个纯粹是你自己干活干得细不细,而它恰恰最容易被当成「已经做完了」:表不是写进去了吗?能出角度啊。
能出角度和出准角度之间,隔着的就是这张表怎么来的。几个真会体现在成品上的选择:
- 每格 ROM 密度:10° 一格意味着格内全靠线性插值去猜。曲线在中心区接近直线这没问题,但边缘本来就是曲率最大的地方,格子反而该密。
- 每个点重复测几次:单次采样省下的那点标定工时,会变成逐台之间的一致性差异,最后落到你的 CDF 尾巴上。
- 要不要先拟合再写表:实测点带着噪声,直接原样写表等于把噪声固化进产品。用一条平滑曲线先过一遍,代价是牺牲一点点真实非线性,换来的通常是更稳的插值行为。典型的偏差换方差交易,没有标准答案,但你得知道自己选了哪一边。
这些都是会直接体现在量产一致性上的东西,但它们从来不出现在规格书里。
七、那个被一句话带过的数:PDOA offset
关于 PDOA offset,通常的说法是「标定让 0° 上报 0,这样所有芯片能共用一张查表」。对,但只对了一半。
回到第四节那张表,看 0° 那一行:Δφ/π = −0.197,不是 0。
这意味着这张表的相位预算是偏的。−π 到 +π 这条对称的通道,被一个残留偏移推向了一边,结果就是两侧的缠绕点不对称:+65.50° 对 −63.46°。
所以 offset 不只是「显示上好不好看」。它决定了 ±π 的相位预算怎么分配。对不齐,就单边丢视野。
图7:offset 没对齐,±π 的预算就偏给一边,两侧缠绕点不对称(65.5° vs 63.5°)——单边丢视野。
共用一张查表的量产意义在另一边:只有把 0° 对齐了,同一张表才能套到所有芯片上,产线才不用每台设备都去跑一遍完整标定。它是成本问题,也是能力边界问题。
八、3D 更难,而且难在三处没人提的地方
做到三维(方位角 + 俯仰角),上面所有困难都在,还多三样。
一是相位噪声天生更大。一种压噪的做法是用不同 STS 段位组合分别算 PDOA 再求平均,组数越多越好。我见过的实现里,2D 是 3 组平均,而 3D 因为要把段位分给两个维度,每个角只剩 2 组。同样的环境,3D 的相位噪声先天就比 2D 高一档。
二是理想校准点多到做不起。3D 表是二维的,方位 × 俯仰。按 20° 步进、覆盖 ±180°,就是 19 × 19 =361 个校准点。真一个一个打过去,工时直接爆炸。所以实际落地经常退而求其次——用理论线性映射生成一张表,等于回到了第二节那条 ArcSin 的路,前面说的「有效间距不是几何间距」那个坑,原样又踩一遍。
三是查表本身也有假设。现在常见的 3D 实现里,方位角的表和俯仰角的表是分开查的,各自只依赖自己的相位差。可从物理上说,3D 天线阵两个维度的响应应该是耦合的。把它拆成两次一维查表,是工程妥协,不是物理事实。
图8:3D 表是方位×俯仰的 19×19 网格(361 点),运行时对两个维度各做一次线性插值。理想该逐点实测,实际常退化为理论线性表——又回到第二节那条 ArcSin 的路。
九、你可以自己算一遍:三步反推这套东西的边界
上面这些数不需要厂商告诉你,只要能把当前在用的那张 LUT 导出来,十分钟就能复现。
第一步,定基准。找到 π 在你们系统里对应的那个相位差值——通常LUT的设计文档或头文件里会写明。把它记作 1.0,把整张表都除过去,换成无量纲的相对值。这样各家不同量纲的表也能放一起比。
第二步,反推有效间距。取 θ = 90°(或者你这张表能到的最大正角度)那一行的值,它就是 2d/λ。除以 2 得到 d/λ,再和 0.5 比一下。凡是超过 0.5 的,你手上这套东西一定有相位模糊,剩下只是「模糊从第几度开始」的问题。
第三步,找缠绕点。顺着表从上往下扫,|Δφ/π| 第一次越过 1.0 的那两格之间,线性插一下,就是你这侧的缠绕角。正负两侧各做一次。如果两侧结果差得比较多(像我这张表那样差了 2 度),回去查 PDOA offset 是不是没对干净。
顺手还可以做的第四件事:把相邻两行的 Δφ 相减再除以步长,得到每一段的灵敏度,然后把这个序列连起来看趋势。理想情况下它应该大致是 cos 的形状,平缓地往下走。要是你看到某一段突然塌陷又弹回来,那一段的标定就有问题——去找当天转台的原始记录,通常能当场对上。
这套动作的全部成本,就是一次导出加一张电子表格。但它回答的是选型阶段最贵的那几个问题:这套东西的视野到底多大、边缘掉得多快、标定有没有偷工减料。这些答案不在规格书里,在表里。
十、收敛:如果要选型、要验收,问这五句
- 你的有效间距是多少?不是 PCB 图上量的那个,是从 θ = 90° 的 Δφ 反推的那个。
- 你的无模糊范围到几度?拿表说话,别拿 λ/2 说话。
- 60° 处的角度误差,是 0° 处的几倍?拿不出这条曲线,等于不知道自己的边缘在哪。
- 你的 LUT 是逐点实测的,还是理论算的?多少个点?每个点重复测了几次?有没有平滑处理?
- PDOA offset 对齐了吗?两侧的缠绕点,对称吗?
最后一句。
我们都习惯把「±XX°」当成一个可以直接引用的参数。但真到了现场,角度不是一个数,它是一条随 θ 剧烈变化的曲线,尽头还立着一堵硬墙。
最好的做法是把它当成视野问题,而不是精度问题来谈——因为精度的坑还能靠滤波、靠冗余、靠多锚点补,视野这块没人补得了。