//-----------------------------------------------------------------------------------------------
        //Расшифровка интерферограммы
        public InterferogramDecodingResult DecodeInterferogram(
            RealMatrix[] interferograms, double[] phaseShifts, BitMask2D bitMask
            )
        {
            RealVector cosVector = this.GetCosVector(phaseShifts);
            RealVector sinVector = this.GetSinVector(phaseShifts);

            int        width       = interferograms[0].ColumnCount;
            int        height      = interferograms[0].RowCount;
            RealMatrix phaseMatrix = new RealMatrix(height, width);

            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    if (bitMask[y, x])
                    {
                        double[]   intensities                 = this.CreateIntensitiesAtPoint(x, y, interferograms);
                        RealVector intensitiesVector           = new RealVector(intensities);
                        RealVector orthogonalIntensitiesVector = intensitiesVector.GetOrthogonalVector();
                        double     phase =
                            this.CalculatePhase(orthogonalIntensitiesVector, sinVector, cosVector);
                        phaseMatrix[y, x] = phase;
                    }
                    else
                    {
                        phaseMatrix[y, x] = this.DefaultPhaseValue;
                    }
                }
            }
            InterferogramDecodingResult decodingResult = new InterferogramDecodingResult(phaseMatrix);

            return(decodingResult);
        }
        //--------------------------------------------------------------------------------------------------
        //Знаменатель формулы расшифровки
        private double GetDecodingFormulaDenominator(double[] intensities, double[] phaseShifts)
        {
            RealVector cosPhaseShiftsVector        = this.GetCosVector(phaseShifts);
            RealVector intensitiesVector           = new RealVector(intensities);
            RealVector orthogonalIntensitiesVector = intensitiesVector.GetOrthogonalVector();
            double     denominator = orthogonalIntensitiesVector * cosPhaseShiftsVector;

            return(denominator);
        }
        //-------------------------------------------------------------------------------------------
        //Числитель формулы расшифровки
        public double GetDecodingFormulaNumerator(double[] intensities, double[] phaseShifts)
        {
            RealVector sinPhaseShiftsVector        = this.GetSinVector(phaseShifts);
            RealVector intensitiesVector           = new RealVector(intensities);
            RealVector orthogonalIntensitiesVector = intensitiesVector.GetOrthogonalVector();
            double     numerator = orthogonalIntensitiesVector * sinPhaseShiftsVector;

            return(numerator);
        }
        //--------------------------------------------------------------------------------------------------
        //Расшифровка в точке
        public double Decode(double[] intensities, double[] phaseShifts)
        {
            RealVector cosVector = this.GetCosVector(phaseShifts);
            RealVector sinVector = this.GetSinVector(phaseShifts);

            RealVector intensitiesVector           = new RealVector(intensities);
            RealVector orthogonalIntensitiesVector = intensitiesVector.GetOrthogonalVector();

            double phase = this.CalculatePhase(orthogonalIntensitiesVector, sinVector, cosVector);

            return(phase);
        }
예제 #5
0
        //---------------------------------------------------------------------------------------------
        //Ортогональные векторы
        protected RealVector[] GetOrthogonalVectors(RealMatrix[] interferograms, Point[] imagePoints)
        {
            int pointsCount = imagePoints.Length;

            RealVector[] orthogonalVectors = new RealVector[pointsCount];

            for (int index = 0; index < pointsCount; index++)
            {
                Point      point             = imagePoints[index];
                int        x                 = point.X;
                int        y                 = point.Y;
                double[]   intensities       = this.CreateIntensitiesAtPoint(x, y, interferograms);
                RealVector intensitiesVector = new RealVector(intensities);
                RealVector orthogonalVector  = intensitiesVector.GetOrthogonalVector();
                orthogonalVectors[index] = orthogonalVector;
            }

            return(orthogonalVectors);
        }