// // Добавление фазового сдвига 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 void Diapazon(double a1, double a2) // Привести к диапазону вещественный кадр { if (Form1.zArrayDescriptor[Form1.regImage] == null) { MessageBox.Show("Diapazon zArrayDescriptor[" + Form1.regImage + "] == NULL"); return; } int nx = Form1.zArrayDescriptor[Form1.regImage].width; int ny = Form1.zArrayDescriptor[Form1.regImage].height; //ZArrayDescriptor rez = new ZArrayDescriptor(nx, ny); double min = SumClass.getMin(Form1.zArrayDescriptor[Form1.regImage]); double max = SumClass.getMax(Form1.zArrayDescriptor[Form1.regImage]); for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { double d = Form1.zArrayDescriptor[Form1.regImage].array[i, j]; Form1.zArrayDescriptor[Form1.regImage].array[i, j] = (d - min) * (a2 - a1) / (max - min) + a1; } } VisualRegImage(Form1.regImage); }
// Сложение с плоской волной => интенсивность в центральное окно public static ZArrayDescriptor Model_pl_ADD_I(double am, ZComplexDescriptor cmpl0, double AngleX, double AngleY, double Lambda, double dx, double noise, double fzr) { MessageBox.Show("am = " + am); int NX = cmpl0.width; int NY = cmpl0.height; //ZComplexDescriptor cmpl1 = new ZComplexDescriptor(NX, NY); // Фронт под углом AngleX, AngleY ZArrayDescriptor cmpl = new ZArrayDescriptor(NX, NY); // Результирующая интенсивность double kx = dx / NX; double ky = dx / NY; // a = (a - min) * 2.0 * Math.PI / (max - min); -pi +pi //am = SumClass.getAverage(cmpl0); // Средняя интенсивность комплексного массива 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; double a = cmpl0.array[i, j].Magnitude; double f = cmpl0.array[i, j].Phase; cmpl.array[i, j] = a * a + am * am + 2 * a * am * Math.Cos(f - f0); } } cmpl = SumClass.Range_Array1(cmpl, am); // Приведение к диапазону от 0 до am 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); }
// Конструктор для заполнения фазы (Амплитуда постоянная) public ZComplexDescriptor(ZArrayDescriptor descriptorToCopy, double am) { if (descriptorToCopy == null) { MessageBox.Show("ZComplexDescriptor == NULL"); return; } width = descriptorToCopy.width; height = descriptorToCopy.height; array = new Complex[width, height]; double max = SumClass.getMax(descriptorToCopy); double min = SumClass.getMin(descriptorToCopy); //MessageBox.Show("width =" + Convert.ToString(width) + "height =" + Convert.ToString(height)); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { double a = descriptorToCopy.array[i, j]; a = (a - min) * 2.0 * Math.PI / (max - min); a = a - Math.PI; array[i, j] = Complex.FromPolarCoordinates(am, a); //array[i, j] = new Complex(1.0, descriptorToCopy.array[i, j]); } } }
// Конструктор для случайного заполнения фазы (RANDOM) (Амплитуда из файла, k=1) public ZComplexDescriptor(ZArrayDescriptor descriptorToCopy, ZArrayDescriptor amp, int k) { if (amp == null) { MessageBox.Show("Ampl == NULL"); return; } if (descriptorToCopy == null) { MessageBox.Show("ZArrayDescriptor == NULL"); return; } if (k != 1) { MessageBox.Show(" k!=1 "); return; } width = amp.width; height = amp.height; array = new Complex[width, height]; double max = SumClass.getMax(descriptorToCopy); double min = SumClass.getMin(descriptorToCopy); int NX = descriptorToCopy.width; int NY = descriptorToCopy.height; if (NX > width) { NX = width; } if (NY > height) { NY = height; } //MessageBox.Show("width =" + Convert.ToString(width) + "height =" + Convert.ToString(height)); Random rnd = new Random(); for (int i = 0; i < NX; i++) { for (int j = 0; j < NY; j++) { double am = amp.array[i, j]; double fz = descriptorToCopy.array[i, j]; double fa = rnd.NextDouble() * 2.0 * Math.PI - Math.PI; fz = fz + fa; //if (fz > Math.PI) fz = fz - Math.PI; //if (fz < -Math.PI) fz = fz + Math.PI; if (am <= 0) { fz = 0; // По шаблону } //if (a > 0) a = rnd.NextDouble() * Math.PI ; else a = 0; array[i, j] = Complex.FromPolarCoordinates(am, fz); } } }
public static void Diapazon_С(double a1, double a2) // Привести к диапазону комплексный кадр { if (Form1.zComplex[Form1.regComplex] == null) { MessageBox.Show("Diapazon zComplex[" + Form1.regComplex + "] == NULL"); return; } int nx = Form1.zComplex[Form1.regComplex].width; int ny = Form1.zComplex[Form1.regComplex].height; ZArrayDescriptor rez = new ZArrayDescriptor(nx, ny); for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { rez.array[i, j] = Form1.zComplex[Form1.regComplex].array[i, j].Magnitude; } } double min = SumClass.getMin(rez); double max = SumClass.getMax(rez); for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { double d = rez.array[i, j]; rez.array[i, j] = (d - min) * (a2 - a1) / (max - min) + a1; } } ZComplexDescriptor rezc = new ZComplexDescriptor(Form1.zComplex[Form1.regComplex], rez); // Амплитуда в rez, фаза старая Form1.zComplex[Form1.regComplex] = rezc; ComplexPictureImage(Form1.regComplex); }
public static ZComplexDescriptor Model_SpSUB(double am, double Lambda, int NX, int NY, double dx, double d) { ZComplexDescriptor cmpl1 = Model_Sp(am, Lambda, NX, NY, dx, d); ZComplexDescriptor cmpl2 = Model_Sp1(am, Lambda, NX, NY, dx, d); ZArrayDescriptor sub = new ZArrayDescriptor(NX, NY); double s, s1; for (int i = 0; i < NX; i++) { for (int j = 0; j < NY; j++) { s = cmpl1.array[i, j].Phase; s1 = cmpl2.array[i, j].Phase; sub.array[i, j] = Math.Abs(s1 - s); } } double max = (SumClass.getMax(sub) - SumClass.getMin(sub)) / Math.PI; MessageBox.Show(" Разброс в PI = " + max); return(cmpl1); }