// // Добавление фазового сдвига fz и получение голограммы // public static ZArrayDescriptor Model_pl_PSI(double am, ZComplexDescriptor cmpl0, double AngleX, double AngleY, double Lambda, double dx, double noise, double fz) { int NX = cmpl0.width; int NY = cmpl0.height; double kx = dx / NX; double ky = dx / NY; ZArrayDescriptor cmpl = new ZArrayDescriptor(NX, NY); // Результирующий фронт am = SumClass.getAverage(cmpl0); // Амплитуда опорного пучка равна средней амплитуды объектного //MessageBox.Show("am = " + am + " fz= " + fz); Random rnd = new Random((int)DateTime.Now.Ticks & 0x0000FFFF); for (int i = 0; i < NX; i++) { for (int j = 0; j < NY; j++) { double fz1 = 2 * Math.PI * (Math.Sin(AngleX) * kx * i + Math.Sin(AngleY) * ky * j) / Lambda; double fa = rnd.NextDouble() * 2.0 * Math.PI - Math.PI; double f0 = fz1 + fa * noise + fz; double Ap = cmpl0.array[i, j].Magnitude; // амплитуда объектного пучка double Fp = cmpl0.array[i, j].Phase; // Фаза объектного пучка cmpl.array[i, j] = Ap * Ap + am * am + 2 * Ap * am * Math.Cos(Fp - f0); // Интенсивность } } return(cmpl); }
// Сложение с плоской волной -------------------------------------------------------------------- public static ZComplexDescriptor Model_pl_ADD_PSI(double am, ZComplexDescriptor cmpl0, double AngleX, double AngleY, double Lambda, double dx, double noise, double fzr) { int NX = cmpl0.width; int NY = cmpl0.height; //ZComplexDescriptor cmpl1 = new ZComplexDescriptor(NX, NY); // Фронт под углом AngleX, AngleY ZComplexDescriptor cmpl = new ZComplexDescriptor(NX, NY); // Результирующий фронт double kx = dx / NX; double ky = dx / NY; am = SumClass.getAverage(cmpl0); // Среднее значение // a = (a - min) * 2.0 * Math.PI / (max - min); -pi +pi Random rnd = new Random((int)DateTime.Now.Ticks & 0x0000FFFF); for (int i = 0; i < NX; i++) { for (int j = 0; j < NY; j++) { double fz = 2 * Math.PI * (Math.Sin(AngleX) * kx * i + Math.Sin(AngleY) * ky * j) / Lambda; double fa = rnd.NextDouble() * 2.0 * Math.PI - Math.PI; double f0 = fz + fa * noise + fzr; Complex Pl = Complex.FromPolarCoordinates(am, f0); cmpl.array[i, j] = cmpl0.array[i, j] + Pl; } } return(cmpl); }