I have a series of unwrapped phases, with some unwrapping errors that consist of a jump of +/- a multiple of Pi:
import numpy
a = numpy.array([0.5, 1.3, 2.4, 10.3, 10.8, 10.2, 7.6, 3.2, 2.9])
In this example there is a first jump of 2 cycles between 2.4 and 10.3, and a jump of -1 cycle between 7.6 and 3.2. I want to remove the jumps. The catch is that when you remove a jump, you need to increase or decrease the rest of the series accordingly, not just the value where the jump occurs.
Is there a cleaner way (no/less loops, faster) of doing this:
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
NumPy offers the function numpy.unwrap()
for phase unwrapping. With the default parameter values, it will correct an array of phases modulo 2π such that all jumps are less than or equal to π:
>>> 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 ])
How about this:
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
which gives:
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]
Here d
holds the signed magntiude of the "jumps", and cumulative summation of the appropriately truncated "jumps" is the mulitple of pi which needs to be removed/added to each sucessive element of the series.
Is that what you meant?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With