Detecção de sinal ultrassônico

9

Eu criei um sistema TDOA bastante simples que usa sinais ultrassônicos emitidos por dois alto-falantes para geolocalizar (em relação aos alto-falantes) os telefones celulares. Os dois sinais são separados por frequência.

O sistema possui as seguintes restrições:

  • Os sinais devem ser inaudíveis. Para esse fim, mantemos frequências acima de 17 kHz. Algumas pessoas ainda conseguem ouvir isso, mas a maioria não consegue.
  • A taxa de amostragem é 44,1 kHz.
  • A música normalmente está tocando, portanto, há muita interferência nas frequências mais baixas.
  • Não temos controle sobre o quão bem os alto-falantes e microfones funcionam nas frequências superiores, por isso mantivemos nosso limite superior em torno de 20 kHz.

O sinal específico que estou usando são os códigos Barker de 13 bits modulados por BPSK devido às suas boas propriedades de autocorrelação. A autocorrelação se parece com o seguinte: Autocorrelação de sinal

Porém, quando eu correlaciono o sinal esperado com o sinal recebido na vida real, o que recebo normalmente se parece com isso- Correlação cruzada típica

O azul é a correlação cruzada com o sinal do alto-falante 1 e o vermelho é a correlação cruzada com o sinal do alto-falante 2. Parece que os ecos são significativos e, infelizmente, muitas vezes mais fortes que o sinal do caminho direto devido ao ganho direcional do microfone.

Tentei simplesmente detectar a primeira aparência do sinal, pois esse provavelmente é o caminho direto. Essa abordagem é muito sensível ao limite que eu uso para decidir quando o sinal está presente e, portanto, não é robusto.

Eu gostaria de uma abordagem robusta para determinar a hora de chegada "verdadeira" do sinal - ou seja, a hora de chegada do sinal de caminho direto. Talvez alguma forma de estimativa e deconvolução de canal? Se sim, como isso funcionaria?

Dados / Código: quero deixar claro que não espero que ninguém analise os dados ou inspecione meu código. Eu os disponibilizei caso você queira fazê-lo. Estou mais interessado em idéias.

Eu disponibilizei o sinal bruto recebido e modulei os sinais esperados para download. Todos são amostrados em 44,1 kHz. Correlacionar o sinal recebido com os sinais esperados produzirá algo semelhante, mas não idêntico à imagem acima, porque movo os sinais recebidos para a banda base e dizimamos antes de correlacionar com os sinais esperados.

Sinal recebido

Sinal esperado # 1

Sinal esperado # 2

Scripts do Matlab Os scripts do Matlab possuem o script de geração de sinal (genLocationSig.m) e o meu script de recebimento / processamento (calcTimingOffset.m).

Jim Clay
fonte
É possível compartilhar seus dados rx1, rx2 e modelo?
Tarin Ziyaee
@ user4619 Vou tentar fazer isso esta noite.
Jim Clay
Muito rápido: recebi seus dados e produzi um STFT-PSD com contraste aprimorado . Eu estou supondo que esses 5 blips na parte inferior são seus dois sinais, separados por frequência. Parece que seus sinais estão sendo transmitidos ok, mas não acredito que ecos ou caminhos múltiplos sejam o seu problema. Como você pode ver, há muito ruído intermitente (banda larga) entre os pulsos, pelo menos no começo. Se você troca de banda complexa, reduz a amostra, se correlaciona com a sequência de latidos e olha o envelope, o que está vendo?
Tarin Ziyaee
11
Ok, algumas coisas: I) você já pensou em usar um chirp linear em vez de formas de onda codificadas como essa? Você tem muito mais flexibilidade com eles e há muito menos peças móveis envolvidas. II) Quais são, se houver, suas restrições de largura de banda? Por exemplo, seus modelos parecem ter cerca de 1 KHz de largura, alguma razão para isso? Você pode ir mais alto? Com um chilrear linear, isso é fácil. III) Embora eu duvide que haja algo errado com sua desmodulação, colocá-lo em ação ajudaria. Isso, e me pouparia o trabalho de escrevê-lo!
Tarin Ziyaee
11
Em relação aos comentários de bits, há um mal-entendido: vamos chamar cada um dos 13 estados do código de barras de 'chip'. Então, se eu transmitir um pouco, estou transmitindo 13 chips. Se eu transmitir 2 bits, estou transmitindo 26 chips, etc. etc. Então, minha pergunta era: quantos bits você está transmitindo? Suponho que você esteja apenas transmitindo 1 bit e, portanto, estou dizendo que você também pode considerar transmitir muito mais, para reforçar seu ganho de codificação. Isso faz sentido?
Tarin Ziyaee

Respostas:

3

Estes não são os códigos que você está procurando ...

Como mencionei nos comentários, existem várias maneiras de executar um TDOA robusto. (Correlação cruzada com os métodos Linear Chirps, Exponential Chirps e CDMA-type). Você já construiu um sistema TDOA utilizando códigos (e essa é realmente uma boa escolha em relação aos chirps lineares, se você precisar de robustez ao doppler); no entanto, você está se limitando artificialmente de duas maneiras:

  • 13
  • 1 1

Use uma sequência 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];

1310 euog[12713]10

insira a descrição da imagem aqui

Transmitir um preâmbulo:

Em seu aplicativo em particular, você mencionou que estava transmitindo apenas um bit. Você deve evitar isso se puder ajudá-lo e transmitir o máximo de bits que seu aplicativo permitir, para obter mais ganhos de codificação.

316112713


Tente uma ou ambas as soluções e apresente seus resultados. Espero que haja melhorias tangíveis nas quais possamos iterar. (Modelagem de pulso, sequências PN diferentes / mais longas, etc).

Tarin Ziyaee
fonte
11
Sim, pretendo tentar sequências mais longas. Eu não sabia que as autocorrelações circulares das seqüências pn eram tão legais - interessantes. Infelizmente para minha aplicação, é a autocorrelação linear que importa. Em relação ao preâmbulo - a sequência inteira é, de certa forma, um "preâmbulo", no sentido de que o que torna um preâmbulo útil é que é um padrão de dados conhecido. Todo o meu sinal é conhecido a priori.
Jim Clay
Decidi exagerar um pouco no comprimento do sinal usando uma ordem de 10 lfsr (1023 chips) para provar ou descartar que o problema é solucionável ao aumentar o sinal. Vou postar o que acontece.
Jim Clay
11
@ JimClay Fico feliz em ouvir isso. Estou curioso para ver como são os xcorrs / sinais recebidos agora. Isso é ótimo.
Tarin Ziyaee
11
@ endolith Sim, o doppler é um problema. Eu trato disso correlacionando várias vezes, mudando a frequência do sinal recebido a cada vez em uma quantidade diferente. Isso é fácil de fazer se você estiver correlacionado no domínio da frequência.
Jim Clay
11
Como Jim Clay descreveu seu método, ele basicamente calcula o que é conhecido como Função de Ambiguidade . Ou seja, resultados de correção cruzada, com a segunda dimensão correspondente à frequência base. Isso revelará o pico e, portanto, já que conhecemos a frequência original, seu grau doppler.
Tarin Ziyaee