//
        //                     Добавление фазового сдвига  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);
        }