角度平均

信息处理 解调 极性
2022-01-12 01:33:48

我正在开发一个 802.11a 解调器,该解调器在大多数情况下都可以工作,但有一个会导致间歇性错误的错误。我还没有完成对它的表征,但似乎问题出在我的均衡器块上。

802.11a是OFDM信号,每个OFDM符号有64个子信道。其中四个子信道是导频(已知数据),位于子信道 7、21、-7 和 -21。我使用导频来校正任何剩余的载波偏移(在导频中显示为恒定相位偏移)和时间偏移(显示为线性偏移 - 即相位偏移在 bin 0 处为 0,并且随着距离的增加而增长仓 0)。

我进行简单的平均以检测载波偏移相位,并在平均之前进行一些简单的操作以检测时间相位偏移(例如,将通道-21 乘以-1,将通道-7 乘以-3,以及将通道7 乘以3)。我故意遗漏了一些不需要的细节,但希望这能说明我正在做的事情的要点。

我的问题是角度的圆形性质可能会导致平均值对于某些值以灾难性的方式表现不佳。例如,想象一下平均从图形上很容易看出答案应该是,但标准平均公式给出的答案是 0,与正确答案完全相反。45π45πππ

在此处输入图像描述

平均角度的正确方法是什么?

编辑:我会试着让我正在做的事情更清楚一点。在 FFT 的输出中有两种不同的“错误条件”。首先是载波偏移,它表现为恒定的相位偏移。

在此处输入图像描述

对于这种情况,如约翰建议的那样,平均笛卡尔引导值而不是角度是一个好主意。谢谢你。

第二个错误条件是时间偏移,表现为线性相位偏移。时间偏移越大,相位偏移的斜率越大。斜率也可以是负数,这取决于接收器是在它应该在的位置前面还是后面。

在此处输入图像描述

现在,由于它是严格线性的(原点经过零),理论上我可以仅从一名飞行员计算斜率。我将首先计算载波偏移相位偏移(即错误条件#1),将其减去,然后使用四个中的任何一个来计算斜率。这将完全避免平均。问题是噪声会使这些值跳来跳去,所以如果我使用所有四个值,我的估计要好得多——因此是平均值。

希望上面的图片清楚地表明我不能只取试验值并按原样平均它们——我必须修改它们以使它们成为常数 + 噪声。我通过将 -21 飞行员的角度乘以 -1,将 -7 飞行员乘以 -3,将 7 飞行员乘以 3,将 21 飞行员乘以 1 来做到这一点。因此它们与 21 飞行员的角度相等并且可以取平均值。

在此处输入图像描述

我不知道在笛卡尔系统中将向量的角度乘以常数(如“3”)的好方法,所以在我看来,我必须转换为极坐标,将角度乘以 -1, -3、3 和 1 分别转换回笛卡尔坐标,平均导频,然后转换回极坐标以获得相位偏移。虽然这是可行的,但如果可能的话,我想找到一个不那么笨拙的解决方案。

4个回答

正如您在编辑中指出的那样,平均这些值并不适合此类问题。一个简单的替代方法是使用线性最小二乘拟合将一条线简单地拟合到四相测量值这应该比单点方法表现更好。

一个可能更好的解决方案是将正弦曲线拟合到四个复杂样本。这可以防止您必须先计算它们的相位角,这可能会导致低 SNR 下的性能下降。

此外,为了实现将复数相位乘以 3 的原始目标,您可以通过简单地将每个数字取三次方来实现:

arg(x3)=3arg(x)

这显然也会影响每个样本的大小,但如果您只关心相位,您通常可以解决这个问题。但是,通过这样做,您将限制估计器将处理的时间偏移范围。将复数的相位乘以 3 将在输出中引入相位模糊度(即,您将无法检测到的相位偏移)。这类似于您在 PSK 同步系统(如 Costas 循环)中经常看到的恒定相位模糊。2π/32π/3

接近方向的常用方法是转向(复杂)矢量方法。

例如,如果您的观察是周期性的,周期为次观察的平均值可以根据上述链接的方程 (1) 找到: 上周期性,执行单位向量复数和,获取复数和的参数(角度),最后重新缩放到PNα^(n)

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

可以使用类似的方法来获得“循环样本方差”。

我会将域从更改为并处理以为模的所有内容。然后你不需要处理负角。[π:+π)[0:2π)2π

或者正如约翰所提到的,对所有需要实际角度的地方都使用复数。

这是我过去用来找到“平均角度”的快速技巧。它有点笨拙,并且使用了比我想要的更多的幻数,但至少它快速高效,并且没有简单算术平均所带来的灾难性故障。

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

我通常以“brad”表示形式存储角度,因此“mod 2pi”操作是一个快速的“bitand MASK”。

我有证据表明,对于相距小于 2pi/3 的任何 2 个角度,3 个中间平均值的中位数总是给出“正确”平均值;5 个中间平均值的中位数总是给出任何 2 个小于 4pi/5 的角度的“正确”平均值,等等。

每当这个“median_average”算法对“相距不太远”的 2 个角度进行平均时,3 个中间简单平均值中最多 1 个给出灾难性错误值(5 个中间平均值中最多 2 个)。(正如您已经提到的,在尝试平均 0.1 和 2pi-0.1 时,“average0”值是完全错误的)。然后最终的 median() 抛出“错误”值(如果有的话)并返回 2 个正确平均值之一。

(您是否考虑过时序偏移如此糟糕以至于相位偏移穿过 +pi 线并“环绕”到 -pi 的可能性?也许您很幸运,这在您的系统中从未发生过)。