public static ZComplexDescriptor ATAN_OLD4(ZArrayDescriptor[] zArrayPicture, double[] fzz)
        {
            // 8, 9, 10, 11   ->    Complex[1]

            int w1 = zArrayPicture[8].width;
            int h1 = zArrayPicture[8].height;

            ZComplexDescriptor faza = new ZComplexDescriptor(w1, h1);

            for (int i = 0; i < w1; i++)
            {
                for (int j = 0; j < h1; j++)
                {
                    double i1 = zArrayPicture[8].array[i, j];    //   0
                    double i2 = zArrayPicture[9].array[i, j];    //  90
                    double i3 = zArrayPicture[10].array[i, j];   // 180
                    double i4 = zArrayPicture[11].array[i, j];   // 270

                    // ------                                     Формула расшифровки

                    faza.array[i, j] = new Complex(i1 - i2, i2 - i4);
                }
            }

            return(faza);
        }
        //----------------------------------------------------------------------------------------------
        //                           Циклический сдвиг    Смещение изображения в центр
        //----------------------------------------------------------------------------------------------
        public static ZComplexDescriptor Invers(ZComplexDescriptor zarray)
        {
            int nx = zarray.width;
            int ny = zarray.height;

            if (nx != ny)
            {
                MessageBox.Show("Invers nx != ny");
            }

            Complex[] Array  = new Complex[nx];
            Complex[] Array1 = new Complex[nx];

            ZComplexDescriptor resultArray = new ZComplexDescriptor(nx, ny);
            int n2 = nx / 2;


            for (int j = 0; j < ny; j++)
            {
                for (int i = 0; i < nx; i++)
                {
                    Array[i] = zarray.array[i, j];
                }
                for (int i = 0; i < n2; i++)
                {
                    Array1[i] = Array[i + n2]; Array1[i + n2] = Array[i];
                }
                for (int i = 0; i < nx; i++)
                {
                    resultArray.array[i, j] = Array1[i];
                }
            }


            for (int i = 0; i < nx; i++)
            {
                for (int j = 0; j < ny; j++)
                {
                    Array[j] = resultArray.array[i, j];
                }
                for (int j = 0; j < n2; j++)
                {
                    Array1[j] = Array[j + n2]; Array1[j + n2] = Array[j];
                }
                for (int j = 0; j < ny; j++)
                {
                    resultArray.array[i, j] = Array1[j];
                }
            }

            return(resultArray);
        }
Exemple #3
0
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // Конструктор для заполения реальной части и мнимой части
        // k=0   Re
        // k=1   Im
        // k=2   re im=0
        // value.Real, value.Imaginary
        public ZComplexDescriptor(ZArrayDescriptor descriptorToCopy, ZComplexDescriptor a, int k)
        {
            if (descriptorToCopy == null)
            {
                MessageBox.Show("ZArrayDescriptor == NULL"); return;
            }
            if (a == null)
            {
                MessageBox.Show("ZComplexDescriptor == NULL"); return;
            }

            width  = a.width;
            height = a.height;

            int w1 = descriptorToCopy.width;
            int h1 = descriptorToCopy.height;

            MessageBox.Show("k= " + k + "width= " + width + "height = " + height + "w1 = " + w1 + "h1 = " + h1);


            if (w1 > width || h1 > height)
            {
                MessageBox.Show("ZComplexDescriptor.cs ZArrayDescriptor > ZComplexDescriptor"); return;
            }

            int x1 = (width - w1) / 2;
            int y1 = (height - h1) / 2;

            array = new Complex[width, height];
            //MessageBox.Show("width =" + Convert.ToString(width) + "height =" + Convert.ToString(height));

            for (int i1 = 0; i1 < w1; i1++)
            {
                for (int j1 = 0; j1 < h1; j1++)
                {
                    int i = i1 + x1;
                    int j = j1 + y1;
                    //Double c = descriptorToCopy.array[i, j];
                    if (k == 0)
                    {
                        array[i, j] = new Complex(descriptorToCopy.array[i1, j1], a.array[i1, j1].Imaginary);
                    }
                    if (k != 0)
                    {
                        array[i, j] = new Complex(a.array[i1, j1].Real, descriptorToCopy.array[i1, j1]);
                    }
                }
            }
        }
        public static ZArrayDescriptor Re(ZComplexDescriptor zComplex)
        {
            int nx = zComplex.width;
            int ny = zComplex.height;
            ZArrayDescriptor amp1 = new ZArrayDescriptor(nx, ny);

            for (int i = 0; i < nx; i++)
            {
                for (int j = 0; j < ny; j++)
                {
                    amp1.array[i, j] = zComplex.array[i, j].Real;
                }
            }

            return(amp1);
        }
        //----------------------------------------------------------------------------------------------
        //     Двухмерное быстрое преобразование Фурье
        //----------------------------------------------------------------------------------------------
        public static ZComplexDescriptor FourierTransform(ZComplexDescriptor zarray, int powerOfTwo)
        {
            int nx = zarray.width;
            int ny = zarray.height;

            Complex[]          Array       = new Complex[nx];
            Complex[]          Array1      = new Complex[nx];
            ZComplexDescriptor resultArray = new ZComplexDescriptor(nx, ny);

            //for (int i = 0; i < nx; i++) Array[i] = new Complex(0.0, 0.0);

            //Complex[] Array_exp = new Complex[nx];

            //for (int i = 0; i < nx; i++) Array_exp[i] = new Complex(Math.Cos(i *  Math.PI ), -Math.Sin(i *  Math.PI ));

            for (int j = 0; j < ny; j++)
            {
                //for (int i = 0; i < nx; i++) Array[i] = zarray.array[i, j] * Array_exp[i];
                for (int i = 0; i < nx; i++)
                {
                    Array[i] = zarray.array[i, j];
                }
                Array1 = GetFourierTransform(Array, powerOfTwo);
                for (int i = 0; i < nx; i++)
                {
                    resultArray.array[i, j] = Array1[i];
                }
            }


            for (int i = 0; i < nx; i++)
            {
                //for (int j = 0; j < ny; j++) Array[j] = resultArray.array[i, j]*Array_exp[j];
                for (int j = 0; j < ny; j++)
                {
                    Array[j] = resultArray.array[i, j];
                }
                Array1 = GetFourierTransform(Array, powerOfTwo);
                for (int j = 0; j < ny; j++)
                {
                    resultArray.array[i, j] = Array1[j];
                }
            }

            return(resultArray);
        }
Exemple #6
0
        public ZComplexDescriptor(ZComplexDescriptor descriptorToCopy)
        {
            if (descriptorToCopy == null)
            {
                return;
            }

            array  = new Complex[descriptorToCopy.width, descriptorToCopy.height];
            width  = descriptorToCopy.width;
            height = descriptorToCopy.height;

            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    array[i, j] = descriptorToCopy.array[i, j];
                }
            }
        }
        public static ZComplexDescriptor Exponenta(double g, int N)
        {
            ZComplexDescriptor cmpl = new ZComplexDescriptor(N, 256);

            double kx = 2 * Math.PI * g / N;
            double am = 1;

            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < 256; j++)
                {
                    double fz = -kx * i;
                    cmpl.array[i, j] = Complex.FromPolarCoordinates(am, fz);
                }
            }


            return(cmpl);
        }
        public static double getAverage(ZComplexDescriptor newDescriptor)
        {
            if (newDescriptor == null)
            {
                return(0);
            }


            double a = 0;

            for (int i = 0; i < newDescriptor.width; i++)
            {
                for (int j = 0; j < newDescriptor.height; j++)
                {
                    a = a + newDescriptor.array[i, j].Magnitude;
                }
            }
            a = a / (newDescriptor.width * newDescriptor.height);
            return(a);
        }
        public static ZComplexDescriptor InverseFourierTransform(ZComplexDescriptor zarray, int powerOfTwo)
        {
            int nx = zarray.width;
            int ny = zarray.height;

            Complex[]          Array       = new Complex[nx];
            Complex[]          Array1      = new Complex[nx];
            ZComplexDescriptor resultArray = new ZComplexDescriptor(nx, ny);



            for (int j = 0; j < ny; j++)
            {
                for (int i = 0; i < nx; i++)
                {
                    Array[i] = zarray.array[i, j];
                }
                Array1 = GetInverseFourierTransform(Array, powerOfTwo);
                for (int i = 0; i < nx; i++)
                {
                    resultArray.array[i, j] = Array1[i];
                }
            }


            for (int i = 0; i < nx; i++)
            {
                for (int j = 0; j < ny; j++)
                {
                    Array[j] = resultArray.array[i, j];
                }
                Array1 = GetInverseFourierTransform(Array, powerOfTwo);
                for (int j = 0; j < ny; j++)
                {
                    resultArray.array[i, j] = Array1[j];
                }
            }

            return(resultArray);
        }
Exemple #10
0
        // Конструктор для заполнения амплитуды , фаза остается

        public ZComplexDescriptor(ZComplexDescriptor zc, ZArrayDescriptor ampl)
        {
            if (ampl == null)
            {
                MessageBox.Show("ZComplexDescriptor == NULL"); return;
            }

            width  = zc.width;
            height = zc.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++)
                {
                    array[i, j] = Complex.FromPolarCoordinates(ampl.array[i, j], zc.array[i, j].Phase);
                }
            }
        }
        public static double getMax(ZComplexDescriptor newDescriptor)
        {
            if (newDescriptor == null)
            {
                return(0);
            }

            double max = double.MinValue;

            for (int i = 0; i < newDescriptor.width; i++)
            {
                for (int j = 0; j < newDescriptor.height; j++)
                {
                    // max = Math.Max(max, newDescriptor.array[i, j]);
                    double a = newDescriptor.array[i, j].Magnitude;
                    if (max < a)
                    {
                        max = a;
                    }
                }
            }

            return(max);
        }
        //----------------------------------------------------------------------------------------------
        //     Двухмерное быстрое преобразование Френеля
        //----------------------------------------------------------------------------------------------
        public static ZComplexDescriptor FrenelTransform(ZComplexDescriptor zarray, int powerOfTwo, double lambda, double d, double dx)
        {
            int nx = zarray.width;
            int ny = zarray.height;

            if (nx != ny)
            {
                MessageBox.Show("Frenel nx != ny");
            }

            Complex[] Array = new Complex[nx];

            double[]           phase       = exp1(lambda, d, nx, dx);
            Complex[]          Array_с2    = exp2(lambda, d, nx, dx);
            ZComplexDescriptor resultArray = new ZComplexDescriptor(nx, ny);

            //Array_с1 = exp1(lambda, d, nx, dx);
            //Array_с2 = exp2(lambda, d, nx, dx);

            for (int j = 0; j < ny; j++)
            {
                for (int i = 0; i < nx; i++)
                {
                    Array[i] = zarray.array[i, j] * Array_с2[i];
                }
                Array = GetFourierTransform(Array, powerOfTwo);
                for (int i = 0; i < nx; i++)
                {
                    resultArray.array[i, j] = Array[i];
                }
            }


            for (int i = 0; i < nx; i++)
            {
                for (int j = 0; j < ny; j++)
                {
                    Array[j] = resultArray.array[i, j] * Array_с2[j];
                }
                Array = GetFourierTransform(Array, powerOfTwo);
                for (int j = 0; j < ny; j++)
                {
                    resultArray.array[i, j] = Array[j];
                }
            }

            for (int i = 0; i < nx; i++)
            {
                for (int j = 0; j < ny; j++)
                {
                    resultArray.array[i, j] = Complex.FromPolarCoordinates(resultArray.array[i, j].Magnitude, resultArray.array[i, j].Phase + phase[j]);
                }
            }
            for (int j = 0; j < ny; j++)
            {
                for (int i = 0; i < nx; i++)
                {
                    resultArray.array[i, j] = Complex.FromPolarCoordinates(resultArray.array[i, j].Magnitude, resultArray.array[i, j].Phase + phase[i]);
                }
            }

            /*
             *
             *                               for (int i = 0; i < nx; i++)
             *                                   for (int j = 0; j < ny; j++)
             *                                     { resultArray.array[i, j] = new Complex( phase[j], 0);  }
             *
             *                               for (int j = 0; j < ny; j++)
             *                                   for (int i = 0; i < nx; i++)
             *                                    { resultArray.array[i, j] = resultArray.array[i, j].Real + phase[i]; }
             */
            // for (int i = 0; i < nx; i++) for (int j = 0; j < ny; j++) resultArray.array[i, j] =  Array_с1[j];
            // for (int j = 0; j < ny; j++) for (int i = 0; i < nx; i++) resultArray.array[i, j] = resultArray.array[i, j] * Array_с1[i];

            return(resultArray);
        }