四步相位解包裹C#实现

如果前后两个数据之差大于默认值(一般为π,也可自己在调用函数时设定),那么就把第二个值加上或者减去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相结果

如果我的文章对您有帮忙,点个赞是对我最大的赞赏  :)

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值