Média de ângulo

7

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.45π45πππ

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

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.

Jim Clay
fonte
5
Eu sempre calculo a média dos números complexos e tomo o ângulo desse resultado.
John
11
Eu também preferiria o método @ John. A soma dos números complexos na verdade corresponde a uma adição de vetor no plano complexo que gera um ângulo de no seu exemplo. Tomando o ângulo do resultado é suficiente como média só afeta a magnitude (a menos gama limitada de números é um problema)π
DEVE
@ John Esse é um ponto muito bom, mas, como no caso do deslocamento de tempo / fase, em que quero multiplicar o ângulo dos canais "7" por 3 antes de calcular a média, não vejo uma boa maneira de fazer isso. Eu acho que eu poderia converter para polar, multiplicar por 3, converter de volta para cartesiano, média e depois converter de volta para polar, mas isso é muito desajeitado.
Jim Clay
@ JimClay: Por que você está calculando a média dos valores juntos? Isso não está claro em sua descrição. Em geral, você não deve fazer a média coerente de valores juntos, a menos que eles sejam de fato coerentes; caso contrário, você obtém a interferência destrutiva que você anotou. Eu acho que um pouco mais de detalhes ajudaria.
Jason R

Respostas:

5

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:

arg(x3)=3arg(x)

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π/32π/3

Jason R
fonte
3

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 .PNα^(n)

μ^P=P2π[arg(n=0N1ej2πα^(n)/P)]2π
α^2π[0,P)

Uma abordagem semelhante pode ser usada para obter uma "variação circular da amostra".

Peter K.
fonte
0

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.

Ryan Johnson
fonte
2
O problema é que, apenas muda onde o problema ocorre, ele não se livra do problema. Por exemplo, imagine um ângulo de0.1 ee ângulo de 2π0.1. A "média" seriaπ, que é, obviamente, a resposta errada.
Jim Clay
Sim você está certo. Você precisaria fazer uma abordagem baseada em quadrante, como o cálculo da função atan2 e pelo mesmo motivo da descontinuidade em±π (ou 0/2π) Isso não se prestaria bem ao desempenho de médias.
Ryan Johnson
0

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.

// median_average: find the "average angle" from some set of angles.
// pick A and B "well separated" from each other and from 0 --
// perhaps A =~= 2pi/3 and B =~= 4pi/3
average0 = (average{ (angles .- 0) mod 2pi } + 0) mod 2pi
averageA = (average{ (angles .- A) mod 2pi } + A) mod 2pi
averageB = (average{ (angles .- B) mod 2pi } + B) mod 2pi
average = median ( average0, averageA, averageB )

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).

David Cary
fonte
0

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 :

A idéia por trás da Equação 10 é que, para calcular a média de uma quantidade circular, a posição e a direção precisam primeiro ser transformadas em um ângulo, que é então projetado no círculo unitário 2D onde a média aritmética é calculada. Depois disso, o ângulo que a posição média forma é transformado de volta de um ângulo para o espaço. Para posições, isso assume a forma:

xprednet(t)=1+12πarctan2(iNexcpi(t)(sin(2πxiπ)),iNexcpi(t)(cos(2πxiπ)))

no seu contexto, você tem N medidas θi com probabilidades pi, a média θ é igual a:

θ=arctan2(iNpi(sin(2πθiπ)),iNpi(cos(2πθiπ)))
meduz
fonte
Sim, é basicamente o mesmo que a abordagem que sugeri ... embora o θa equação que você tem está errada; Eu acredito no1+ não é necessário, nem é o 12π. Editado para corresponder ao que eu acho correto. YMMV.
Peter K.