最近處理相位角的時候用到了這個函數,所以在這裡稍稍用一點篇幅來記錄一下我的理解.
unwrap函數究竟是用來是用來幹什麼的呢?它是用來解卷繞的.
至於什麼是卷繞,網上的說法是:
要計算一個系統相頻特性,就要用到反正切函數,電腦中反正切函數規定,在一、二象限中的角度為0~pi,三四象限的角度為0~-pi。
若一個角度從0變到2pi,但實際得到的結果是0~pi,再由-pi~0,在w=pi處發生跳變,跳變幅度為2pi,這就叫相位的卷繞。
如上圖所示,如果相位角從-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]: aOut[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對隨機的角度進行校正,沒有意義.