如果前后两个数据之差大于默认值(一般为π,也可自己在调用函数时设定),那么就把第二个值加上或者减去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;
}
使用网上下载素材,解包裹样例
不同频率下的正弦光拍摄到的倾斜长方体:
光照不到的地方,形成的阴影会导致一些地方解包裹错误,如上图中的条纹。
实验结果不仅有干涉条纹,还有误差条纹:
后续会继续更新3频4相结果
如果我的文章对您有帮忙,点个赞是对我最大的赞赏 :)