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.
fonte
Respostas:
Como você apontou em sua edição, a média dos valores não é uma boa opção para esse tipo de problema. Uma alternativa simples seria simplesmente ajustar uma linha às medições em quatro fases usando um ajuste linear de mínimos quadrados . Isso deve ter um desempenho melhor do que a abordagem de ponto único.
Uma solução possivelmente ainda melhor seria ajustar um sinusóide às quatro amostras complexas. Isso evita que você precise calcular primeiro os ângulos de fase deles, o que pode causar uma degradação no desempenho em SNR baixo.
Além disso, para alcançar seu objetivo original de multiplicar a fase de um número complexo por 3, você pode fazer isso simplesmente levando cada número à terceira potência:
Obviamente, isso também afetará a magnitude de cada amostra, mas se você estiver preocupado apenas com a fase, normalmente poderá contornar isso. Ao fazer isso, no entanto, você limitará o intervalo de compensações de tempo em que seu estimador trabalhará. Multiplicar a fase de um número complexo por 3 apresentará uma ambiguidade de na saída (ou seja, você não seria capaz de detectar uma mudança na fase de ). Isso é semelhante às ambiguidades da fase de contestação que você costuma ver nos sistemas de sincronização PSK (como um loop Costas).2 π/ 3 2 π/ 3
fonte
A maneira usual de abordar direcional é passar para uma abordagem vetorial (complexa).
Por exemplo, se suas observações são periódicas com o período , a média de observações, pode ser encontrada conforme a equação (1) do link acima: que escala para ser periódico acima de , executa uma soma complexa de vetores unitários, pega o argumento (ângulo) da soma complexa e, finalmente, redimensiona para .P N α^( N )
Uma abordagem semelhante pode ser usada para obter uma "variação circular da amostra".
fonte
Eu mudaria o domínio de para e lidaria com tudo o módulo[ - π: + π) [ 0 : 2 π) 2 π . Então você não precisa lidar com ângulos negativos.
Ou, como John mencionou, use números complexos para tudo, até onde você precisa de um ângulo real.
fonte
Aqui está um truque rápido que eu usei no passado para encontrar um "ângulo médio". É um pouco desajeitado e usa mais números mágicos do que eu gostaria, mas pelo menos é rápido e eficiente e não apresenta a falha catastrófica que a média aritmética simples fornece.
Normalmente guardo ângulos em algo como a representação "brad" , de modo que a operação "mod 2pi" seja uma rápida "bitand MASK".
Eu tenho uma prova de que a mediana de 3 médias intermediárias sempre fornece a média "correta" para quaisquer 2 ângulos que estão a menos de 2pi / 3; a mediana de 5 médias intermediárias sempre fornece a média "correta" para quaisquer 2 ângulos separados por menos de 4pi / 5 etc.
Sempre que esse algoritmo "median_average" calcula a média de 2 ângulos "não muito distantes", no máximo 1 das 3 médias simples intermediárias fornece um valor catastroficamente errado (no máximo 2 das 5 médias intermediárias). (Como você já mencionou, o valor "average0" está completamente errado ao tentar calcular a média de 0,1 e 2pi-0,1). A mediana final () lança o valor "errado" (se houver) e retorna uma das 2 médias corretas.
(Você considerou a possibilidade de que o deslocamento de tempo seja tão ruim que o deslocamento de fase cruze a linha + pi e "se mova" para -pi? Talvez você tenha sorte o suficiente para que isso nunca aconteça no seu sistema).
fonte
Para calcular a média dos ângulos, você pode usar estatísticas circulares, conforme definido em Mardia KV, Jupp PE (2009, Directional Statistics, Vol. 494 Hoboken, NJ: Wiley) e como usado neste artigo, Eq. 10 :
no seu contexto, você temN medidas θEu com probabilidades pEu , a média θ é igual a:
fonte