numpy的unwrap函数

本文深入探讨了unwrap函数的工作原理及应用场景,详细解释了如何利用该函数解决相位角卷绕问题,避免角度跳变导致的数据不连续现象,同时提醒读者正确使用此函数的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近处理相位角的时候用到了这个函数,所以在这里稍稍用一点篇幅来记录一下我的理解.

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对随机的角度进行校正,没有意义.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值