1. 项目概述用手机“听不见”的声音传递数据你有没有想过你口袋里的智能手机除了打电话、放音乐、录音还能像对讲机一样在几米甚至十几米的距离内和另一台手机“悄悄”地交换数据不是用蓝牙也不是用Wi-Fi而是用你几乎听不见的“声音”。这听起来像是科幻电影里的情节但早在2018年Google Research的团队就已经在IEEE Transactions on Multimedia上发表了一篇论文详细阐述了他们如何利用智能手机的普通扬声器和麦克风实现了一套基于直接序列扩频DSSS的近超声波通信协议。这套协议的核心目标非常明确在室内环境中实现设备间快速、可靠、且基于物理空间约束的“共现”发现。简单来说就是让两台或多台设备能“感知”到彼此在同一个房间里并安全地交换一个简短的令牌比如一个配对码或身份标识。它的工作频段选在了18.5 kHz到20 kHz这个频率对于大多数成年人来说已经接近或超出了听觉上限因此通信过程是静默的、无感的。更关键的是高频声波几乎无法穿透墙壁这意味着通信被天然地限定在了一个物理空间内——“在听力所及范围内”这为许多基于位置的交互应用提供了理想的基础。我最初接触到这个想法时觉得非常巧妙。它避开了蓝牙配对繁琐、Wi-Fi配置复杂的痛点利用了每台手机都有的、最基础的音频硬件实现了一种“零配置”的邻近感知。作为一名长期关注嵌入式通信和信号处理的开发者我立刻被其工程实现的简洁与优雅所吸引。本文将带你深入拆解这套协议从核心原理、设计权衡到具体的实现细节和避坑经验手把手还原如何利用DSSS技术让智能手机的音频硬件变身为一套可靠的短距离数据链路。2. 核心原理为什么是DSSS和近超声波在深入代码和公式之前我们必须先理解两个最根本的设计选择为什么是直接序列扩频DSSS以及为什么是18.5-20 kHz的近超声波这两个选择共同决定了这套协议在复杂室内环境下的生存能力。2.1 直面室内声学环境的挑战在室内用声音通信听起来简单实则困难重重。想象一下你在一个普通的客厅或办公室多径效应与混响声音不仅沿直线传播还会在墙壁、天花板、家具上发生反射。接收端会收到来自不同路径、不同延迟的多个信号副本它们相互叠加甚至抵消导致信号严重失真。这就是所谓的“多径衰落”。论文中提到普通办公室在1-4 kHz的混响时间RT60可达500-2000毫秒虽然超声波频段混响会短一些但反射依然强烈石膏板对高频声波的反射率超过95%。多普勒频移如果设备比如被人拿在手里在相对运动接收到的声音频率会发生偏移。以1米/秒的步行速度计算在18.5 kHz载波上会产生约54 Hz的频移。对于窄带调制方式如FSK这足以导致解调失败。环境噪声与硬件限制室内存在各种背景噪声空调、人声、设备运行声。同时手机扬声器在高频如20 kHz的输出声压级会急剧下降麦克风的灵敏度也会衰减。这意味着信号本身就很弱。传统的调制方式如频移键控FSK或幅移键控ASK在这些挑战面前显得力不从心。FSK需要很长的符号时间来对抗混响引起的码间干扰导致数据速率极低同时对多普勒频移非常敏感。2.2 DSSS从抗干扰到高精度测距直接序列扩频DSSS技术最初用于军事通信目的是抗干扰和低截获率其核心思想是“用带宽换鲁棒性”。扩频过程你想发送一个数据比特“1”。不是简单地用某个频率的正弦波表示它而是用一个更长的、高速率的伪随机码序列称为“码片”Chip来代表它。比如用序列[1, -1, -1, 1, 1, 1, -1, -1]来表示“1”用其反码表示“0”。这个伪随机码序列的速率码片率远高于原始数据速率。抗干扰与多径分辨经过扩频原始窄带信号的能量被“涂抹”到一个很宽的频带上功率谱密度变得很低像背景噪声一样不易被察觉和干扰。更重要的是在接收端通过用相同的伪随机码进行“解扩”只有与本地码同步的正确信号能量会被重新收集到窄带内恢复出原始数据。而多径信号、窄带噪声或干扰由于与本地码不相关在解扩后仍然保持宽频特性大部分会被后续的滤波器滤除。高精度时间同步DSSS信号的伪随机码具有尖锐的自相关特性。只有在码序列完全对齐时相关运算才会产生一个很高的峰值即使错开一个码片相关值也会变得非常小。这使得接收机能够以极高的精度可达一个码片时间论文中是333微秒确定信号的到达时间从而有效区分来自不同路径的信号。一个生活化的类比想象在一个嘈杂的鸡尾酒会上多径、噪声环境。如果你用正常音量对朋友说一个词FSK他可能听不清。但如果你和他约定好一段特殊的、快速的“暗语”伪随机码即使周围很吵他只要专注识别这段“暗语”就能准确获取信息。DSSS就是这个原理。2.3 频段选择在听不见与做得到之间权衡选择18.5-20 kHz这个频段是另一个精妙的平衡人耳听不见大多数成年人对18 kHz以上声音的听阈很高。论文实测Nexus 6手机以最大音量播放18 kHz单音在10厘米处声压级为74 dB SPL而大多数人在18 kHz的听阈高于86 dB SPL。因此通信过程对人来说是静默的。消费级硬件支持这个频段刚好落在绝大多数智能手机扬声器和麦克风的可用频率响应范围内。虽然高频响应会衰减但仍在可用的工程区间内。空间约束高频声波波长短穿透力弱遇到墙壁等障碍物时大部分能量被反射。这天然地将通信范围限制在了一个房间内实现了基于物理空间的隐私和安全边界。设计要点载波频率fc被精确设定为783 / Ts ≈ 18496 Hz确保每个符号帧内包含整数个载波周期这简化了接收端的数字下变频处理。3. 系统模型与信号设计从比特到声波理解了“为什么”之后我们来看“是什么”。这套协议如何将一个个数据符号Symbol变成空气中传播的声波下图清晰地展示了编码端的完整流程原始数据比特 - 符号映射 - 数据波形dk(t) - (1 pedestal) - 与扩频码c(t)相乘 - 载波调制 - 单边带滤波 - 声波发射3.1 扩频码系统的“指纹”扩频码c[n]是整个系统的基石。论文选用了一个周期N 127的最大长度序列m序列由线性反馈移位寄存器LFSR生成。其递归关系为b[n] b[n-4] XOR b[n-5] XOR b[n-6] XOR b[n-7]初始状态全为1。 然后将生成的0/1序列映射为1/-1值c[n] 2*b[n] - 1。为什么是127这是一个权衡。更长的码周期能提供更好的处理增益和抗噪性但会增加接收端同步时的计算量需要计算更长的相关运算。m序列的长度必须是2^k - 11272^7 - 1是一个在性能和复杂度之间取得良好平衡的实用选择。这个序列有一个近乎理想的自相关特性除了零偏移时相关值为N127其他任何非零偏移的相关值都是-1。这意味着它和自己高度相似但和自身的任何时移版本都几乎不相关。关键实现细节在连续时间域码序列通过 sinc 插值生成连续波形c(t)。选择 sinc 插值而非零阶保持是为了将信号严格限制在带宽|f| 1/(2Tc) 1.5 kHz内这是实现高效单边带滤波和避免频谱泄漏的前提。3.2 数据编码与“基座”的奥秘每个长度为Ts ≈ 42.3 ms的“帧”传输一个数据符号。符号值k取自集合{0, 1, ..., K-1}其中K16因此每个符号携带log2(16)4比特信息。原始数据比特率 4 bits / 42.3 ms ≈ 94.5 bps。数据符号k被调制到一个正交的正弦数据波形上dk(t) sin( 2π * (4 k) * t / Ts ),t ∈ [0, Ts]这些波形在[0, Ts]内是正交的。选择最小4个周期是为了让数据波形与信道衰落、自动增益控制AGC引起的缓慢幅度变化更容易区分。最具争议也最巧妙的设计基座Pedestal发射信号构造如下x(t) sin(2π fc t) * c(t) * [ d(t) 1 ]注意这里的1。这个常数“1”就是基座。从信息论角度看这非常“浪费”——超过一半的信号能量被用于传输这个不携带任何数据信息的恒定分量。那么为什么还要加它答案是为了极致的同步性能和解耦。简化同步接收端要解调数据首先必须精确知道每个符号帧的开始时间时间同步并补偿多普勒频移频率同步。如果没有基座接收端需要为每一个可能的数据符号计算相关值然后看哪个相关值最大这计算量巨大。有了基座后接收信号与本地扩频码c(t)进行相关运算时基座部分会产生一个巨大的、稳定的相关峰因为c(t)与c(t)*1相关就是c(t)的自相关而数据部分c(t)*d(t)与c(t)的相关值则很小因为d(t)均值为零且与码不相关。这样接收机可以仅通过寻找扩频码的自相关峰来完成同步完全独立于当前发送的是什么数据。这大大降低了同步的复杂度和延迟。鲁棒性即使在极低信噪比下这个由基座产生的相关峰也相对容易检测为数据解调提供了稳定的时间基准。设计权衡用超过一半的发射功率换取快速、鲁棒的同步和解调计算简化。在需要低延迟启动如设备发现的应用中这是一个非常值得的 trade-off。3.3 单边带调制与发射x(t)是一个双边带信号。为了节省带宽并将能量集中在目标频段18.5-20 kHz需要进行单边带SSB滤波只保留上边带x_SSB(t) (h_SSB * x)(t), 其中H_SSB(f) 1 (当 |f| fc), 否则为 0。 在实现中这是通过对一个完整令牌重复周期的信号做FFT然后将频率低于fc的分量置零再IFFT回来完成的。最终发射的信号频谱集中在[fc, fc 1/(2Tc)]即大约[18496, 184961500] Hz ≈ [18.5, 20] kHz。4. 接收端核心同步与解码的工程实现发射信号在空中传播经过多径、衰减、噪声污染后被接收端的麦克风捕获。接收机的任务是从嘈杂的录音y(t)中准确地恢复出原始数据令牌。这是整个系统中最具挑战性的部分其流程如下图所示接收声波y(t) - 下变频至基带 - 带通滤波 - 时间/频率同步搜索相关峰- 解扩 - 相位估计 - 与数据波形内积 - 符号判决 - 令牌组装4.1 下变频与滤波从射频到基带接收到的实信号y(t)首先通过数字下变频转换到复基带b_raw(t) y(t) * exp(-i*2π*fc*t)这一步在数字域通过乘法实现将信号频谱从载频fc附近搬移到零频附近。由于y(t)是实信号下变频后会在负频率[-fc - B, -fc]产生一个镜像频谱B为信号带宽。在48 kHz采样率下这个镜像会混叠到[9.5, 11] kHz附近。因此需要用一个复带通滤波器h_band进行滤波b(t) (h_band * b_raw)(t)该滤波器的设计目标是在[0, 1/(2Tc)]即[0, 1500] Hz通带内增益为1并强烈抑制负频率成分和f 1/(2Tc)的高频噪声。论文使用了一个11抽头的复FIR滤波器来实现。实操心得滤波器的设计至关重要。过于陡峭的过渡带会增加计算量和群延迟过于平缓则无法有效抑制镜像和带外噪声影响后续同步和解码性能。在实际实现中可能需要根据具体设备的频率响应进行微调。4.2 同步在时间和频率的二维网格中暴力搜索这是协议的核心创新点之一。为了达到低延迟这是交互式应用的关键接收机没有采用传统的“锁定-跟踪”环路而是对时间和频率偏移进行了一次穷举的暴力搜索。同步问题模型接收信号可以建模为y(t) ≈ sin( 2π*(fc - δ0)*(t - τ0) ) * c(t - τ0)其中τ0是未知的时间偏移信号何时开始δ0是未知的多普勒频偏。我们的目标就是找到这对(τ0, δ0)。定义“捕获分数”a_raw(τ, δ) | (1/Ts) ∫_0^Ts exp(i*2π*δ*s) * c(s) * b(τs) ds |^2这个分数衡量了在假设帧起始时间为τ、多普勒频偏为δ时本地码c(t)与接收基带信号b(t)的匹配程度。当(τ, δ)接近真实的(τ0, δ0)时a_raw会呈现一个尖锐的峰值。搜索空间与近似计算时间τ以基带采样率Fb 12 kHz进行离散搜索。频率δ在一个固定的离散集合Δ中搜索。论文假设最大相对运动速度为 ±1 m/s对应的最大多普勒频偏约为 ±54 Hz。他们以0.3/Ts ≈ 7.1 Hz为间隔在[-2.4/Ts, 2.4/Ts]范围内选取了17个测试频率点。直接计算a_raw(τ, δ)对于每个(τ, δ)组合都需要一个完整的相关积分计算量巨大。论文采用了一个巧妙的分段常数近似来加速 将积分区间[0, Ts]分成Np16个“面板”Panel。在每个面板内将复指数因子exp(i*2πδt)近似为一个常数取面板中点的相位值。这样相关运算可以先在每个面板内对c(s)*b(τs)进行积分与δ无关然后再与不同δ对应的复常数进行加权求和。计算量从O(Ms * |Δ|)降低到O(Ms Np * |Δ|)其中Ms是每帧的采样点数。经分析这种近似在最大多普勒频偏下相关峰值的损失小于4%在可接受范围内。4.3 归一化与“捕获图像”在多径中找出主路真实环境中的噪声通常是非平稳的。为了消除噪声水平变化的影响需要对原始的捕获分数进行归一化a(τ, δ) a_raw(τ, δ) / μ(τ)其中μ(τ)是a_raw(τ, δ)在时间上的局部平均值估计。论文使用了一个中心在τ的加权移动平均滤波器一个负二项分布的脉冲响应来估计局部噪声功率。归一化后信号路径的相关峰能够从变化的背景噪声中凸显出来。由于信号是周期性的周期Ts一个更直观的表示是将时间t分解为帧索引ρ和帧内相位φA(ρ, φ) a(ρ*Ts φ)这形成了一个二维的“捕获图像”。图像的每一行对应一个帧内相位φ每一列对应帧ρ。多径分辨的魔法在这个图像中每一条水平方向的亮带就对应着一条从发射端到接收端的信号传播路径因为对于同一条物理路径信号在每个周期性的帧内其到达时间相位φ是相对固定的。DSSS码尖锐的自相关特性使得每条路径的峰值在相位维度上非常窄约一个码片宽度333微秒。因此即使存在强烈的多径干扰接收机也能在捕获图像中清晰地分辨出多条路径并选择最强的一条或进行合并进行解码。这是DSSS相对于FSK等方案的最大优势。4.4 解码从同步信号到数据比特一旦通过捕获图像确定了主导路径的帧起始时间τ和多普勒频偏估计δ就可以对每一帧进行解码解扩将同步好的基带信号帧与本地码相乘q(t) c(t) * b(τ t)。理想情况下这会抵消掉扩频码得到q(t) ≈ [dk(t) 1] * exp(i*ψ0)其中exp(i*ψ0)是未知的载波相位。相位估计由于[dk(t) 1]是非负的实数可以通过计算q(t)在一个帧内的平均相位来估计ψ0ψ angle( ∫_0^Ts q(t) dt )。符号判决计算解旋相位补偿后的信号与所有可能的数据波形dk(t)的内积相关sk Re{exp(-iψ)*q(t)}, dk(t) 。选择内积值sk最大的那个k作为解码出的符号。5. 协议层与令牌传输底层符号级的通信之上需要定义上层协议来传输有意义的数据块——令牌Token。5.1 帧结构设计一个完整的令牌传输由多次重复的“令牌重复”单元构成。每个令牌重复包含间隔符Spacer第一个符号固定为保留值kK即16。用于标记令牌数据的开始解决接收机中途开始监听时的循环模糊问题。数据载荷将原始数据如64位随机数按 base-KK16编码为符号序列k[1], ..., k[L]。奇偶校验符号最后一个符号k[L1]是一个校验和使得整个令牌重复内所有符号值之和模K等于零。这是一种简单的错误检测机制。为什么重复发送重复发送同一个令牌信号为接收机提供了多次机会。接收机可能因为启动慢、或被其他任务中断 duty-cycled 而只捕获到部分传输。只要至少能完整收到一个令牌重复就有可能成功解码。重复也提供了一种极其简单的“时间分集”如果某个符号在某一轮被噪声严重破坏可能在另一轮是好的。5.2 解码与合并接收端会为每个可能的符号位置0到L1和每个可能的符号值0到K-1维护一个分数表。当接收到信号时对于每个解码出的符号将其分数加到分数表对应的位置和符号值上。由于令牌被重复发送相同位置模L2的分数会被累加。解码时寻找一条贯穿整个令牌长度、满足间隔符和奇偶校验约束、且累加分数最高的路径。这实际上是一种简化的最大似然序列检测。6. 性能评估与实战经验论文提供了详实的实验结果这里结合我的理解和实践经验进行解读。6.1 真实环境可靠性在安静的办公室环境中使用Nexus 6作为发射机Nexus 5/5X作为接收机进行测试2米以内传输成功率高达94%以上。这是协议设计的“甜蜜点”。10米左右传输仍然经常成功。这证明了DSSS对抗多径和衰减的能力。非单调性有趣的是成功率随距离的增加并非严格单调下降。在某个距离如6-7米可能比更近的距离如4米成功率更高。这很可能是因为室内复杂的多径干涉模式造成的在某些位置多条路径的信号可能恰好同相叠加增强了接收信号。环境敏感性协议对环境非常敏感。铺有地毯、布满软家具的房间对高频声波吸收严重通信距离会大幅缩短。而在空旷、硬表面多的房间如会议室通信距离可能更远。背景噪声如空调高频噪音、显示器啸叫如果落在18.5-20 kHz频带内也会严重影响性能。6.2 抗噪性与抗干扰能力通过仿真测试了协议对不同噪声的鲁棒性加性高斯白噪声AWGN协议表现出色在较低信噪比下仍能工作。重复发送令牌能显著提升成功率。脉冲噪声模拟现实中的碰撞、点击声。由于令牌重复和简单的奇偶校验协议对偶发的脉冲噪声有较好的容忍度。一个符号在某一轮被破坏仍有机会在其他轮被正确解码。6.3 运动容限协议明确考虑了多普勒频移。测试表明使用默认的频偏搜索集Δ对应 ±1 m/s在速度不超过 ±1 m/s 时传输几乎总能成功。当速度超过设计容限如 ±1.2 m/s成功率急剧下降。如果完全不考虑多普勒Δ0 {0}只能容忍非常慢的运动 0.2 m/s。重要提示协议将运动建模为单纯的载波频偏而忽略了时间尺度拉伸多普勒压缩。在更高速度下这种近似会带来误差这也是为什么即使扩大频偏搜索范围Δ2对更高速度的容忍度提升也有限的原因。6.4 量化鲁棒性测试了信号在经历16-bit ADC量化后的性能。结果显示只要输入信号电平高于-90.3 dBFS即振幅大于1个量化步长量化对性能几乎没有影响。即使信号低于此值由于噪声的“抖动”效应解码仍有可能成功。这说明协议对接收信号幅度的动态范围要求并不苛刻。7. 实现要点与避坑指南如果你打算在自己的项目中实现或借鉴这个协议以下是一些关键的工程实践和容易踩坑的地方7.1 采样率与同步发射采样率必须足够高以满足奈奎斯特采样定理 40 kHz通常使用44.1 kHz或48 kHz。接收采样率下变频和滤波后信号被重采样到Fb 12 kHz的基带采样率。这个值的选择与码片率1/Tc 3 kHz有关需要满足基带信号带宽1.5 kHz的重采样要求同时兼顾计算量。同步精度时间同步的精度取决于码片时长Tc 333 μs和基带采样间隔1/Fb ≈ 83.3 μs。理论上通过插值可以获取亚采样精度。论文中的暴力搜索网格需要足够精细以确保能捕捉到相关峰。7.2 计算优化穷举搜索是计算密集型的。除了前述的分段常数近似还有以下优化点SIMD指令集大量使用点积和相关运算非常适合用SIMD如NEON on ARM, SSE/AVX on x86进行加速。论文中使用了Eigen线性代数库。流式处理接收机以100毫秒的块为单位进行流式处理这平衡了实时性和延迟。提前终止在实际应用中一旦成功解码令牌就可以停止搜索节省电量。7.3 硬件差异与校准不同手机型号的扬声器和麦克风频率响应差异巨大。特别是20 kHz附近的频响有些设备衰减非常严重。发射端预均衡可以考虑在发射信号前施加一个简单的预均衡滤波器稍微提升一下高频成分的能量以补偿特定设备扬声器的高频衰减。但要注意不能引入可闻失真或损坏扬声器。接收端自适应增益环境噪声水平变化大需要自动增益控制AGC。但AGC的响应时间如果太慢可能会在信号起始部分造成失真。论文中通过归一化捕获分数部分解决了幅度变化问题。载波频率微调如果设备晶振有微小偏差可能导致实际载波频率偏移。接收端的频偏搜索集Δ需要能覆盖这个硬件偏差加多普勒频移。7.4 常见问题与排查完全无法同步检查硬件确认扬声器和麦克风能录制和播放18-20 kHz的声音。可以用音频生成软件和频谱分析软件验证。检查音量发射音量是否足够接收端AGC是否将信号压得太低检查环境噪声用频谱分析工具查看18-20 kHz频段是否有强噪声如旧CRT显示器、开关电源啸叫。验证下变频和滤波录制一段发射信号在代码中打印出基带信号的频谱看能量是否集中在0-1.5 kHz。同步不稳定时好时坏多径干扰观察“捕获图像”看是否有多条强路径。尝试改变设备位置或朝向。运动影响确保设备相对静止或确认你的多普勒搜索范围Δ设置正确。归一化参数调整局部噪声功率估计滤波器h_normalize的时间常数。如果环境噪声变化快需要更短的时间常数。同步成功但解码错误率高相位估计错误检查q(t)在一个帧内的平均相位估计是否稳定。在低信噪比下这个估计可能不准。可以考虑更鲁棒的相位估计方法或采用差分编码避免绝对相位依赖。符号间干扰虽然DSSS抗多径能力强但在极端长的混响环境中前一个符号的拖尾可能干扰后一个符号。确保帧长度Ts远大于房间的混响时间。数据波形正交性破坏如果多普勒补偿不准确会导致数据波形频率偏移破坏正交性。确保频率同步足够精确。通信距离极短高频衰减这是最大的限制因素。尝试稍微降低载波频率如到17-18 kHz但要注意可能进入部分人的可听范围。发射功率手机扬声器有输出功率限制且系统音量可能被系统或应用限制。确保以最大系统音量播放但要注意避免削波失真。接收灵敏度不同手机麦克风的高频灵敏度差异很大。这是硬性限制。8. 扩展思考与应用前景虽然论文中的协议数据速率很低~94.5 bps但其设计思想为许多创新应用打开了大门。速率提升的可能性更高的码片率在手机音频硬件带宽允许的范围内比如扩展到17-22 kHz可以提高码片率从而在相同扩频增益下提升数据速率。更高阶调制在解扩后的符号判决中可以使用QPSK等更高阶的调制方式每个符号携带更多比特。但这会对相位估计的精度提出更高要求。减少基座能量这是最直接的提升效率的方法。可以研究更复杂的同步算法减少或不使用基座将更多能量用于数据传输。但这会牺牲同步速度和鲁棒性。超越设备发现的应用室内精确实时定位利用DSSS的高精度测时能力结合多个接收器可以实现厘米级的室内声学定位。无电池设备通信近超声波能量可以被小型传感器收集用于为无源设备供电并同时进行数据传输。跨介质通信声波可以在不同介质中传播。这个协议经过调整可以用于水下通信或通过固体材料如桌面进行设备间通信。增强现实AR锚点在特定物理位置部署超声波信标AR设备通过接收信标信号可以实现更稳定、不受视觉遮挡影响的定位与场景绑定。个人体会实现这个协议的过程是一次对通信系统底层原理的深刻重温。从伪随机码生成、插值滤波到同步搜索、符号判决每一个环节都充满了工程上的权衡。最大的收获是认识到一个在实验室仿真中表现完美的算法放到真实、复杂的物理世界嘈杂、多径、硬件非理想中会面临如此多的挑战。而解决这些挑战的方法往往不是更复杂的数学而是更巧妙的工程洞察比如那个“浪费”能量的基座。它用一种看似低效的方式换取了整个系统在现实世界中的可行性与低延迟这正是工程设计的艺术所在。