Estou trabalhando em um demod 802.11a que funciona, na maioria das vezes, mas tem um bug que causa erros intermitentes. Não terminei de caracterizá-lo, mas parece que o problema está no meu bloco do equalizador.
802.11a é um sinal OFDM e cada símbolo OFDM possui 64 subcanais. Quatro desses subcanais são pilotos (dados conhecidos), nos subcanais 7, 21, -7 e -21. Eu uso os pilotos para corrigir qualquer deslocamento restante da transportadora (aparece como um deslocamento de fase constante nos pilotos) e o deslocamento de tempo (aparece como um deslocamento de liner - ou seja, o deslocamento de fase é 0 no compartimento 0 e cresce à medida que se afasta bin 0).
Faço uma média simples para detectar a fase de deslocamento da portadora e algumas manipulações simples antes de calcular a média para detectar o deslocamento da fase de tempo (por exemplo, multiplique o canal -21 por -1, multiplique o canal -7 por -3 e multiplique o canal 7 por 3). Estou intencionalmente deixando de fora alguns detalhes desnecessários, mas espero que isso dê a essência do que estou fazendo.
Meu problema é que a natureza circular dos ângulos pode fazer com que a média se comporte de maneiras catastróficas para certos valores. Por exemplo, imagine imaginar a média e . É fácil ver graficamente que a resposta deve ser ou , mas a fórmula de média padrão fornece a resposta 0, literalmente o oposto da resposta correta.
Qual é a maneira correta de obter ângulos médios?
Edição: Vou tentar tornar o que estou fazendo um pouco mais claro. Existem duas "condições de erro" que se manifestam de maneira diferente na saída da FFT. Primeiro, o deslocamento da portadora, que se manifesta como um deslocamento de fase constante.
Nesse caso, calcular a média dos valores do piloto cartesiano em vez do ângulo, como John sugeriu, é uma boa idéia. Obrigado.
A segunda condição de erro é o deslocamento de tempo, que se manifesta como um deslocamento de fase linear. Quanto maior o deslocamento de tempo, maior a inclinação do deslocamento de fase. A inclinação também pode ser negativa, dependendo de o receptor estar à frente ou atrás de onde deveria estar.
Agora, como é estritamente linear (a origem passa por zero), eu poderia, teoricamente, calcular a inclinação de apenas um piloto. Primeiro eu calcularia o deslocamento da fase de deslocamento da portadora (ou seja, a condição de erro nº 1), subtraí-o e depois usaria qualquer um dos quatro para calcular a inclinação. Isso evitaria calcular a média completamente. O problema é que o ruído pode fazer esses valores pularem, então minha estimativa é muito melhor se eu usar todos os quatro - portanto, a média.
Espero que a imagem acima deixe claro que eu não posso apenas pegar os valores do piloto e calculá-los como estão - eu tenho que modificá-los para torná-los um ruído constante +. Faço isso multiplicando o ângulo do piloto -21 por -1, o piloto -7 por -3, o piloto 7 por 3 e o piloto 21 por 1. Eles tornam-se equivalentes ao piloto 21 e podem ser calculados em média.
Não conheço uma boa maneira de multiplicar o ângulo de um vetor por uma constante como "3" no sistema cartesiano; portanto, parece-me que eu teria que converter em coordenadas polares, multiplicar os ângulos por -1, -3, 3 e 1, respectivamente, convertem de volta para coordenadas cartesianas, calculam a média dos pilotos e depois convertem de volta para polar para obter o deslocamento de fase. Embora isso seja possível, eu gostaria de encontrar uma solução menos desajeitada, se possível.