2010-07-07 100 views
5

我與來自Mathworks公司的人討論我回復:unwrap功能,擁有比其他π跳公差在它「錯誤」,並希望得到一些其他觀點:MATLAB:解包功能

說明

Q = unwrap(P)通過添加&plusmn倍數校正在矢量P弧度的相位角; 2,當P的連續元件之間的絕對跳轉大於或等於的π弧度默認跳躍公差π。如果P是一個矩陣,則解包操作以列爲單位。如果P是一個多維數組,則unwrap將在第一個非單一維上運行。

Q = unwrap(P,tol)使用跳轉公差tol而不是默認值π。

有文檔的兩種可能的解釋:

  1. Q = unwrap(P,tol)通過添加&plusmn倍數校正在矢量P弧度的相位角; P的連續元件之間的2個π當絕對跳轉被更大大於或等於tol弧度。如果P是一個矩陣,則解包操作以列爲單位。如果P是一個多維數組,則unwrap將在第一個非單一維上運行。

    實施例:

    >> x = mod(0:20:200,100); unwrap(x, 50) 
    ans = 
        0 20.0000 40.0000 60.0000 80.0000 81.6814 101.6814 121.6814 141.6814 161.6814 163.3628 
    
  2. Q = unwrap(P,tol)通過添加&plusmn倍數校正在矢量P的元素; 2 * TOL當P的連續元件之間的絕對跳轉大於或等於TOL。如果P是一個矩陣,則解包操作以列爲單位。如果P是一個多維數組,則unwrap將在第一個非單一維上運行。

    實施例:

    >> x = mod(0:20:200,100); unwrap(x, 50) 
    ans = 
        0 20 40 60 80 100 120 140 160 180 200 
    

unwrap() MATLAB中的實際行爲(至少到R2010a版本)爲#1。我對unwrap()的解釋是它應該是#2,因此在行爲上存在一個錯誤。如果unwrap()的行爲與#2匹配,則對於緩慢變化的輸入,即,對於矢量x,其中連續元素變化小於tol = T/2,則解纏可以用作mod的逆。

請注意,此第二種解釋比角度更一般,並且可以用環繞週期T解開任何東西。(對於弧度,是否默認爲T = 2 π,對於度數爲360,對於8位數字是256,對於65536 16位號碼等)

所以我的問題是:

是行爲#1有可能的用途?哪種解釋更有意義?

回答

1

Behavor#1是有道理的,因爲輸入被假定爲弧度,不。如果你高於跳躍容忍度,調整會增加pi/2,所以沒關係。

如果unwrap有一個功能允許它在任何類型的系列上工作,而不僅僅是在弧度角度上,那麼會更好。

跳轉公差不足以說明您是否有弧度,度數或任何其他類型的系列,因此需要額外的輸入。

+0

有趣......我的解釋#2的觀點是(正如你所提到的)那裏真的沒有任何特定的與弧度,度數或任何角度的聯繫,除了環繞時期,默認情況下是2pi,但可以是任何東西(對於度數是360,對於16位整數是65536等)。跳躍寬容應該是環繞期的1/2 ...我不確定爲什麼你會選擇兩者之間的不同關係。 – 2010-07-07 16:39:12

+0

我想你可以有兩種方法來實現這個功能。無論是特定於弧度(如文檔中所述),並且您可以自由選擇跳轉公差。或者你在1/2環繞時修復跳轉容限,並且你將該輸入用於任何類型的範圍。 – Jonas 2010-07-07 18:28:38

+1

我會爲後者投票,但這只是我的承擔。我可能最終只是編寫自己的函數(這是相當簡單的),而不再依賴於Mathworks的正確運行的unwrap()實現。 – 2010-07-07 20:45:16

1

我一直認爲第二個行爲是實際行爲,但從未測試過。文字閱讀幫助文件的確表明行爲​​#1。但那不是人們想做的事。作爲一個簡單的例子,可考慮做在度展開

x = mod(0:30:720, 360) 
y = unwrap(x,180) 

很明顯,你想Y = 0:30:720,而是你...

Y =

Columns 1 through 7 

    0 30.0000 60.0000 90.0000 120.0000 150.0000 180.0000 

Columns 8 through 14 

210.0000 240.0000 270.0000 300.0000 330.0000 333.0088 363.0088 

Columns 15 through 21 

393.0088 423.0088 453.0088 483.0088 513.0088 543.0088 573.0088 

Columns 22 through 25 

603.0088 633.0088 663.0088 666.0176 

這是錯誤的(Y不再對應於相同的角度x,它是解包的點)

任何人都可以給出一個當你想要行爲#1(當前行爲?)的例子

5

解釋#1是我如何閱讀文檔,我認爲它是有道理的。我可以想象使用它來重建車輪編碼器的驅動距離。對於較慢的速度,容差並不重要,但對於高速(足夠高可能違反採樣定理,即每個車輪旋轉少於兩個採樣),容差可以幫助您在知道方向時獲得正確的重建。

爲什麼#1變得更有意義的另一個原因可能是普通的展開可以很容易地擴展到一個普通的展開,因此沒有直接需要這個時期成爲參數。

% example for 16 bit integers 
>> x1 = [10 5 0 65535 65525]; 
T = 65536; 
x2 = T * unwrap(x1 * 2 * pi/T)/(2 * pi) 
x2 = 
    10.0000 5.0000   0 -1.0000 -11.0000 

或者只是讓自己的函數:

function ret = generic_unwrap(x, T) 
    ret = T * unwrap(x * 2 * pi/T)/(2 * pi); 
end 
+0

評論很晚,但如果您違反抽樣理論,您會如何知道方向?沒有辦法知道!我同意原來的問題:行爲#1似乎沒用,而行爲#2可能對數字計數器,角度度數有用...... – 2015-02-15 12:53:15

-1
x = mod(0:30*pi/180:4*pi, 2*pi); 
y = unwrap(x)*180/pi; 

它工作在弧度而不是在度。

+0

請閱讀問題;我沒有問如何實現它,我問的是最好的行爲。 – 2017-04-04 18:03:43