相位解包裹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;
        }

使用網上下載素材,解包裹樣例 

 

 不同頻率下的正弦光拍攝到的傾斜長方體:

 

光照不到的地方,形成的陰影會導致一些地方解包裹錯誤,如上圖中的條紋。

如果我的文章對您有幫忙,點個贊是對我最大的讚賞  :)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章