最近处理相位角的时候用到了这个函数,所以在这里稍稍用一点篇幅来记录一下我的理解.
unwrap函数究竟是用来是用来干什么的呢?它是用来解卷绕的.
至于什么是卷绕,网上的说法是:
要计算一个系统相频特性,就要用到反正切函数,计算机中反正切函数规定,在一、二象限中的角度为0~pi,三四象限的角度为0~-pi。
若一个角度从0变到2pi,但实际得到的结果是0~pi,再由-pi~0,在w=pi处发生跳变,跳变幅度为2pi,这就叫相位的卷绕。 (个人觉得就是为了解决在正切中-pi 和pi的位置cost值为0的原因造成的跳变)
如上图所示,如果相位角从-0.99pi出发,逆时针旋转,穿过x轴的负半轴,到达第三相限,那么根据定义,此时它的角度会直接由pi变为-pi,会有一个2pi的跳变,这样的话,如果将旋转的角度绘制成图像的话,事实上图像是不连续的,为了修正这种跳变,所以有了unwrap.
unwrap究竟做了什么事情呢?它只是检测相邻的两个值a和b,如果abs(a-b) > tol, 那么现在要对b进行修正,通过对b增加或者减少2pi,消除这个突然的跳变,这里的tol其实是unwrap函数的一个参数,默认为pi.
举个例子:
out[196]: a = np.array([3.13, -3.12, 3.12, 3.13, -3.11])
in [197]: a
Out[197]: array([ 3.13, -3.12, 3.12, 3.13, -3.11])
in [198]: np.unwrap(a)
Out[198]: array([ 3.13 , 3.16318531, 3.12 , 3.13 , 3.17318531])
上面的代码,当角度从3.13变为-3.12的时候,3.13 + 3.12 > pi,所以要对-3.12增加一个2pi进行修正,变为了3.16318531, 接下来比较3.16318531和3.12,不用修正,继续比较3.12和-3.11,对-3.11增加一个2pi,变为了3.17318531,修正完毕.
使用这个函数唯一需要特别注意一点,那就是不要乱用这个函数.
我之前不懂行情的时候,经常用一列没有什么规律可言的角度做解卷绕,类似于这样:
In[207]: phase = np.array([2.67, -0.92, -1.37, -0.58, 0, 0,78, -2.94])
In[208]: np.unwrap(phase)
Out[208]:
array([ 2.67 , 5.36318531, 4.91318531, 5.70318531, 6.28318531, 6.28318531, 8.88496162, 9.62637061])
看到没有,上面的结果是不是很出人意表,什么鬼,居然出现了大于pi的角度.
这是因为,unwrap其实包含了一个前提(从运作机制也看得到),这些角度是有时序的.对于序列[a,b,c],物体一定是先是a角度,然后才到达b角度,最后才到达c角度.
上面的,从2.67->-0.92,对-0.92加上一个2pi做修正,得到5.36…, 5.36…和-1.37做比较,-1.37变为4.91…, 4.91…和-0.58做比较,-0.58变为5.70…, 5.70…和0做比较,0直接加上了一个2pi,变为6.28…,……
总体而言,unwrap通过比较相邻的a和b,考虑a的值,对b进行修正.
所以尽量不要用unwrap对随机的角度进行校正,没有意义.