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

系统具有以下约束:


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

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


但是,当我在现实生活中将期望信号与接收信号互相关时,我得到的通常是这样的-


蓝色是与扬声器1信号的互相关,红色是与扬声器2信号的互相关。由于麦克风的定向增益,回声似乎很明显,并且不幸的是,通常比直接路径信号要强。成为直接路径。这种方法对我用来确定何时出现信号的阈值非常敏感,因此根本不可靠。信号-即直接路径信号的到达时间。也许某种形式的信道估计和反卷积?如果是这样,那将如何工作?

数据/代码:我想明确地说,我不希望任何人分析数据或检查我的代码。我已经提供了它们,以备您需要。我对创意最感兴趣。

我提供了原始接收信号和已调制预期信号供下载。它们均以44.1 kHz采样。将接收到的信号与预期信号相关联会产生与上图类似但不同的东西,因为在将接收到的信号与预期信号相关之前,我将接收到的信号移至基带并进行了抽取。

接收信号
1号预期信号
2号预期信号

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

评论

是否可以共享rx1,rx2和模板数据?

@ user4619我今晚将尝试这样做。

真快:我收到了您的数据,并制作了对比度增强的STFT-PSD。我猜想底部的那5个斑点是您的两个信号,以频率分开。您的信号似乎可以正常传输,但我不认为回声或多径是您的问题。如您所见,至少在开始时,脉冲之间存在很多间歇性(宽带)噪声。如果您需要复杂的频带移动,下采样,将其与巴克序列相关联并查看包络,您会看到什么?

好的,有两件事:I)您是否考虑过使用线性-而不是像这样的编码波形?它们给您更大的灵活性,并且所涉及的运动部件大大减少。 II)您的带宽限制是什么(如果有)?例如,您的模板似乎大约1 KHz宽,这是什么原因?你可以更高吗?使用线性chi,这很容易。 III)虽然我怀疑您的解调器有什么问题,但提出来会有所帮助。这样,就可以省去编写代码的麻烦!

关于位注释,有一个误解:让我们将巴克代码的13个状态中的每个状态称为“芯片”。因此,如果我传送一点,我将传送13个芯片。如果我传输2位,我正在传输26个芯片,等等。所以我的问题是,您要传输多少位?我假设您只是传输1位,所以我说您也可以考虑传输更多位,以增强编码增益。这有意义吗?

#1 楼

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

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


Barker代码的长度上限为$ 13 $。但是,我们可以制作任意长度的PN序列码,以获得更大的编码增益。
在传输中仅使用$ 1 $位。我们可以对要传输的许多比特的整个前同步码进行编码,从而进一步增强对多径的适应性。

使用PN序列:

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

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];


序列的圆形和线性自相关如下所示。它们显然会产生白色光谱,但不仅如此,我们不再局限于$ 13 $的芯片长度。实际上,最后一个代码PN_127产生的编码增益为$ 10 \ log [\ frac {127} {13}] \约占巴克序列的10 dB dB增益,同时保证了白色光谱。



发送前同步码:

在您的特定应用程序中,您提到您仅发送一位。如果可以帮助您,则应尽量避免这种情况,并尽可能多地发送应用程序允许的位,以获取更多的编码增益。

这通常是在通信协议上完成以与数据包的开头对齐的方式。传输由许多位组成的(已知)前同步码。每一位由许多芯片组成。 (在我们的示例中,使用上述任何PN码的$ 31 $,$ 61 $或$ 127 $芯片)。最后,该位序列本身可以由另一个PN序列组成,或者,如果您愿意,可以发送组成巴克模式的$ 13 $位,每个位都由上述PN序列之一组成。


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

评论


$ \ begingroup $
是的,我计划尝试更长的序列。我不知道pn序列的循环自相关是如此有趣。不幸的是,对于我的应用而言,重要的是线性自相关。关于前导,就某种意义而言,整个序列在某种意义上是“前导”,从某种意义上说,使前导有用的是它是已知的数据模式。我的整个信号是先验的。
$ \ endgroup $
–吉姆·克莱(Jim Clay)
14年5月13日在20:28

$ \ begingroup $
我决定通过使用10 lfsr(1023芯片)的命令来证明或排除通过延长信号可以解决该问题,从而在信号长度上有点过大。我将发布发生的情况。
$ \ endgroup $
–吉姆·克莱(Jim Clay)
14年5月13日在20:29

$ \ begingroup $
@JimClay很高兴听到这个消息。我很想知道收到的xcorrs /信号现在是什么样子。那太好了。
$ \ endgroup $
– Tarin Ziyaee
2014年5月16日14:54

$ \ begingroup $
@endolith是的,多普勒问题。我通过多次关联来处理此问题,每次将接收信号的频率偏移不同的量。如果您在频域中进行关联,这很容易做到。
$ \ endgroup $
–吉姆·克莱(Jim Clay)
2014年5月17日下午4:04

$ \ begingroup $
@endolith正如Jim Clay描述他的方法时,他基本上是在计算所谓的歧义函数。即,产生交叉校正,第二维对应于基本频率。然后,它将显示峰值,因此,由于我们知道原始频率,因此得知其多普勒度。
$ \ endgroup $
– Tarin Ziyaee
2014年5月17日下午16:51