超声波信号检测

信息处理 信号检测 多路径 超声波
2022-01-16 17:25:39

我创建了一个相当简单的 TDOA 系统,它使用从两个扬声器发出的超声波信号来定位(相对于扬声器)手机。这两个信号按频率分开。

该系统具有以下约束:

  • 信号必须是听不见的。为此,我们坚持使用 17 kHz 以上的频率。少数人仍然可以听到,但大多数人听不到。
  • 采样率为 44.1 kHz。
  • 音乐通常会播放,因此在较低频率会有很多干扰。
  • 我们无法控制扬声器和麦克风在高频下的工作情况,因此我们将上限保持在 20 kHz 左右。

我使用的特定信号是 BPSK 调制的 13 位巴克码,因为它们具有良好的自相关特性。自相关如下所示 - 信号自相关

但是,当我将预期信号与现实生活中接收到的信号进行互相关时,我得到的通常是这样的—— 典型的互相关

蓝色是与扬声器 1 信号的互相关,红色是与扬声器 2 信号的互相关。回声似乎很重要,不幸的是,由于麦克风的方向增益,回声通常比直接路径信号强。

我尝试简单地检测信号的最早出现,因为这可能是直接路径。这种方法对我用来决定信号何时出现的阈值非常敏感,因此根本不可靠。

我想要一种可靠的方法来确定信号的“真实”到达时间——即直接路径信号的到达时间。也许某种形式的信道估计和反卷积?如果是这样,那将如何运作?

数据/代码:我想明确表示我不希望任何人分析数据或检查我的代码。我已将它们提供给您,以备不时之需。我最感兴趣的是想法。

我使原始接收信号和调制的预期信号可供下载。它们都以 44.1 kHz 采样。将接收到的信号与预期信号相关会产生与上图相似但不完全相同的结果,因为我将接收到的信号移动到基带并在与预期信号相关之前进行抽取。

接收信号

预期信号 #1

预期信号 #2

Matlab 脚本 Matlab 脚本具有信号生成脚本 (genLocationSig.m) 和我的接收/处理脚本 (calcTimingOffset.m)。

1个回答

这些不是您要查找的代码...

正如我在评论中提到的,有很多方法可以实现稳健的 TDOA。(与线性啁啾、指数啁啾和CDMA类型方法的互相关)。您已经使用代码构建了一个 TDOA 系统(如果您需要对多普勒的鲁棒性,这确实是线性啁啾的一个不错的选择),但是您以两种方式人为地限制了自己:

  • 巴克代码最多只能达到的长度。然而,我们可以制作任意长度的 PN 序列码以获得更多的编码增益。13
  • 在您的传输中仅使用位。我们可以对包含许多比特的整个前导码进行编码以进行传输,从而获得对多路径的进一步弹性。1

使用 PN 序列:

因此,非常简单,通过以下方式更改用于调制载波的代码: 改用 PN 序列。PN 生成的代码可以是(几乎)任意长度,并且可以通过LFSR生成。(在某些文本中,它们也被称为“增白剂”)。这是三个长度的 PN 序列。3161127

PN_31 = [ 1  1 -1 -1  1  1 -1  1 -1 -1  1 -1 -1 -1 -1  1 -1  1 -1  1  1  1 -1  1  1 -1 -1 -1  1  1  1];

PN_61 = [ 1  1  1 -1  1  1 -1  1 -1 -1  1 -1 -1  1  1  1 -1 -1 -1  1 -1  1  1  1  1 -1 -1  1 ...
     -1  1 -1 -1 -1  1  1 -1 -1 -1 -1  1 -1 -1 -1 -1 -1  1  1  1  1  1  1 -1  1 -1  1 -1 ...
      1  1 -1 -1  1  1 -1];

PN_127 = [-1     1     1     1    -1     1    -1    -1     1    -1     1     1    -1    -1    -1     1     1    -1     1     1     1     1    -1     1     1    -1     1    -1 ...
       1     1    -1     1     1    -1    -1     1    -1    -1     1    -1    -1    -1     1     1     1    -1    -1    -1    -1     1    -1     1     1     1     1     1 ...
      -1    -1     1    -1     1    -1     1     1     1    -1    -1     1     1    -1     1    -1    -1    -1     1    -1    -1     1     1     1     1    -1    -1    -1 ...
       1    -1     1    -1    -1    -1    -1     1     1    -1    -1    -1    -1    -1     1    -1    -1    -1    -1    -1    -1     1     1     1     1     1     1     1 ...
      -1     1    -1     1    -1     1    -1    -1     1     1    -1    -1     1     1     1];

序列的循环和线性自相关如下所示。它们显然会产生白色光谱,但更重要的是,我们不再局限于芯片长度。事实上,最后一个代码 PN_127 在巴克序列上产生了 dB 的编码增益,同时保证了白色频谱。1310 log[12713]10

在此处输入图像描述

发送序言:

在您的特定应用程序中,您提到您只传输一位。如果你能提供帮助,你应该尽量避免这种情况,并尽可能多地传输应用程序允许的位,以获得进一步的编码增益。

这通常在通信协议上执行以与数据包的开头对齐。发送一个(已知的)前导码,由许多位组成。每个位,由许多芯片组成。(在我们的示例中,31、61127具有上述 PN 码之一)。最后,比特序列本身可以由另一个 PN 序列组成,或者如果你愿意,你可以发送比特组成一个巴克模式,每个比特由上述 PN 序列中的任何一个组成。316112713


尝试其中一种或两种解决方案,并提出您的结果。我希望会有切实的改进,然后我们可以进行迭代。(脉冲整形、不同/更长的 PN 序列等)。