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:
Porém, quando eu correlaciono o sinal esperado com o sinal recebido na vida real, o que recebo normalmente se parece com isso-
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.
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).