如果前後兩個數據之差大於默認值(一般爲π,也可自己在調用函數時設定),那麼就把第二個值加上或者減去2π,反正最終結果是它倆之差小於默認值即可。【特別注意】這個函數並不是把[-π,π]範圍的數據變成[0,2π]的數據,感覺有點類似於讓數據具有一定的單調性。
2.5W長度數組執行16ms:
/// <summary>
/// 解相位
/// </summary>
/// <param name="data_in">數據源</param>
/// <param name="col">默認以列進行解包裹</param>
/// <returns></returns>
public double[,] unwrap(double[,] data_in,bool col=true)
{
double[,] data_out = new double[data_in.GetLength(0),data_in.GetLength(1)];
bool cen = true;
double Pi2 = 2 * Math.PI;
if (col)
{
for (int i = 0; i < data_out.GetLength(1); ++i)
{
data_out[0, i] = data_in[0, i];
if (((data_in[1, i] > data_in[0, i]) && ((data_in[1, i] - data_in[0, i]) < Math.PI)) || ((data_in[1, i] - data_in[0, i]) < -Math.PI))
{
cen = true;//+
}
else
{
cen = false;//-
}
double tt1 = 0;
if (cen)//+
{
for (int j = 1; j < data_out.GetLength(0); j++)
{
if (Math.Abs(data_in[j, i] - data_out[j - 1, i]) < Math.PI)
data_out[j, i] = data_in[j - 1, i];
else
{
data_out[j, i] = data_in[j, i] + Pi2;
tt1 = Math.Abs(data_out[j, i] - data_out[j - 1, i]);
if (tt1 > Math.PI)
{
data_out[j, i] = data_out[j, i] - ((int)((tt1 - Math.PI) / Pi2) + 1) * Pi2;
}
}
}
}
else //-
{
for (int j = 1; j < data_in.GetLength(0); j++)
{
if (Math.Abs(data_in[j, i] - data_out[j - 1, i]) < Math.PI)
data_out[j, i] = data_in[j - 1, i];
else
{
data_out[j, i] = data_in[j, i] - Pi2;
tt1 = Math.Abs(data_out[j, i] - data_out[j - 1, i]);
if (tt1 > Math.PI)
{
data_out[j, i] = data_out[j, i] - ((int)((tt1 - Math.PI) / Pi2) + 1) * Pi2;
}
}
}
}
}
}
else
{
for (int i = 0; i < data_out.GetLength(0); ++i)
{
data_out[i,0] = data_in[i,0];
if (((data_in[i,1] > data_in[i,0]) && ((data_in[i,1] - data_in[i,0]) < Math.PI)) || ((data_in[i,1] - data_in[i,0]) < -Math.PI))
{
cen = true;//+
}
else
{
cen = false;//-
}
double tt1 = 0;
if (cen)//+
{
for (int j = 1; j < data_out.GetLength(1); j++)
{
if (Math.Abs(data_in[i,j] - data_out[i,j-1]) < Math.PI)
data_out[i,j] = data_in[i,j-1];
else
{
data_out[i,j] = data_in[i,j] + Pi2;
tt1 = Math.Abs(data_out[i,j] - data_out[i,j-1]);
if (tt1 > Math.PI)
{
data_out[i,j] = data_out[i,j] - ((int)((tt1 - Math.PI) / Pi2) + 1) * Pi2;
}
}
}
}
else //-
{
for (int j = 1; j < data_in.GetLength(1); j++)
{
if (Math.Abs(data_in[i,j] - data_out[i,j-1]) < Math.PI)
data_out[i,j] = data_in[i,j-1];
else
{
data_out[i,j] = data_in[i,j] - Pi2;
tt1 = Math.Abs(data_out[i,j] - data_out[i,j-1]);
if (tt1 > Math.PI)
{
data_out[i,j] = data_out[i,j] - ((int)((tt1 - Math.PI) / Pi2) + 1) * Pi2;
}
}
}
}
}
}
return data_out;
}
使用網上下載素材,解包裹樣例
不同頻率下的正弦光拍攝到的傾斜長方體:
光照不到的地方,形成的陰影會導致一些地方解包裹錯誤,如上圖中的條紋。
如果我的文章對您有幫忙,點個贊是對我最大的讚賞 :)