5

我有一系列展开阶段,其中一些展开错误包括 +/- Pi 的倍数的跳跃:

import numpy
a = numpy.array([0.5, 1.3, 2.4, 10.3, 10.8, 10.2, 7.6, 3.2, 2.9])

在此示例中,在 2.4 和 10.3 之间有 2 个周期的第一次跳跃,在 7.6 和 3.2 之间有 -1 个周期的跳跃。我想删除跳跃。问题是,当您删除一个跳跃时,您需要相应地增加或减少该系列的其余部分,而不仅仅是跳跃发生的值。

有没有更清洁的方法(没有/更少的循环,更快)这样做:

jumpsexist = 1
while jumpsexist:
    # Look for absolute differences greater than Pi
    jump = numpy.abs((numpy.roll(a,-1) -a)) > numpy.pi
    if jump[:-1].any():
        # Find the index of the first jump
        jumpind = numpy.argmax(jump) + 1
        # Calculate the number of cycles in that jump
        cycles = ((a[jumpind] - a[jumpind- 1]) / numpy.pi).astype("Int8")
        # Remove the cycles
        a[jumpind:] -= cycles * numpy.pi
    else:
        break
4

2 回答 2

8

NumPy 提供了numpy.unwrap()相位展开的功能。使用默认参数值,它将校正以 2π 为模的相位数组,使得所有跳跃都小于或等于 π:

>>> a = numpy.array([0.5, 1.3, 2.4, 10.3, 10.8, 10.2, 7.6, 3.2, 2.9])
>>> numpy.unwrap(a)
array([ 0.5       ,  1.3       ,  2.4       ,  4.01681469,  4.51681469,
        3.91681469,  1.31681469,  3.2       ,  2.9       ])
于 2012-04-17T12:37:13.347 回答
2

这个怎么样:

import numpy as np 
a = np.array([0.5, 1.3, 2.4, 10.3, 10.8, 10.2, 7.6, 3.2, 2.9])
d = np.diff(a)/np.pi
b = np.empty_like(a)
b[0] = a[0]
b[1:] = a[1:]-(np.floor(np.abs(d))*np.sign(d)).cumsum()*np.pi

这使:

In [40]: print a
[  0.5   1.3   2.4  10.3  10.8  10.2   7.6   3.2   2.9]

In [41]: print b
[ 0.5         1.3         2.4         4.01681469  4.51681469  3.91681469
  1.31681469  0.05840735 -0.24159265]

这里d包含“跳跃”的有符号数量,适当截断的“跳跃”的累积总和是需要删除/添加到系列的每个连续元素的 pi 的多个。

这是你的意思吗?

于 2012-04-12T15:24:53.893 回答