//----------------------------------------------------------------------------------------------- //Расшифровка интерферограммы 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); }
//--------------------------------------------------------------------------------------------- //Ортогональные векторы 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); }