Пример #1
0
        //----------------------------------------------------------------------------------------------
        //           Cuda  Френель из k1 в k2
        //----------------------------------------------------------------------------------------------
        public static ZComplexDescriptor Fr_CUDA(ZComplexDescriptor zarray, double lambda, double d, double dx)
        {
            int nx = zarray.width;
            int ny = zarray.height;
            ZComplexDescriptor resultArray = new ZComplexDescriptor(nx, ny);

            Complex[] Array_с2x = FurieN.fexp2(lambda, d, nx, dx);                       // Умножение на экспоненту
            Complex[] Array_с2y = FurieN.fexp2(lambda, d, ny, dx);

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

            //Array_с2 = FurieN.fexp2(lambda, d, ny, dx);
            //for (int i = 0; i < nx; i++)
            //    for (int j = 0; j < ny; j++) resultArray.array[i, j] = resultArray.array[i, j] * Array_с2[j];

            ComplexNumber[] Cud_array  = ComplexMatrix.ToArrayByRows(resultArray);      // Из двухмерного в одномерный ->  Массив комплексных (Struct)чисел [nx*ny]
            ComplexNumber[] Cud_array1 = CUDA_FFT.CudaFFT(Cud_array, nx, ny);           // БПФ

            int k = 0;

            for (int i = 0; i < nx; i++)                                                // Из одномерного в двухмерный
            {
                for (int j = 0; j < ny; j++)
                {
                    resultArray.array[i, j] = Complex.FromPolarCoordinates(Cud_array1[k].Real, Cud_array1[k].Imaginary);  // Преобразование из одномерного в [ , ]
                    k++;
                }
            }


            double[] phase_y = FurieN.fexp1(lambda, d, ny, dx);                           // Умножение на экспоненту
            double[] phase_x = FurieN.fexp1(lambda, d, nx, dx);

            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_y[j] + phase_x[i]);
                }
            }

            //  phase = FurieN.fexp1(lambda, d, nx, dx);
            //  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]); }

            return(resultArray);
        }
Пример #2
0
        //----------------------------------------------------------------------------------------------
        //           Cuda  FFT из главного окна
        //----------------------------------------------------------------------------------------------
        public static void Fur_CUDA(ZArrayDescriptor zArrayPicture)                                            // Прямое преобразование Фурье (CUDA)
        {
            //MessageBox.Show("Прямое преобразование Фурье с произвольным числом точек");


            int nx = zArrayPicture.width;
            int ny = zArrayPicture.height;

            System.Diagnostics.Stopwatch sw = new Stopwatch();

            System.Diagnostics.Stopwatch sw1 = new Stopwatch();
            System.Diagnostics.Stopwatch sw3 = new Stopwatch();
            System.Diagnostics.Stopwatch sw4 = new Stopwatch();

            sw.Start();

            ComplexNumber[] Cud_array = ComplexMatrix.ToArrayByRows(zArrayPicture);            // Из двухмерного в одномерный ->  Массив комплексных (Struct)чисел [nx*ny]


            sw.Stop();
            TimeSpan ts = sw.Elapsed;

            MessageBox.Show("CUDA FFT Из двухмерного в одномерный  Время Минут: " + ts.Minutes + "   Время сек: " + ts.Seconds + "   Время миллисек: " + ts.Milliseconds);

            sw1.Start();

            ComplexNumber[] Cud_array1 = CUDA_FFT.CudaFFT(Cud_array, nx, ny);

            sw1.Stop();
            ts = sw1.Elapsed;
            MessageBox.Show("CUDA FFT  Время Минут: " + ts.Minutes + "   Время сек: " + ts.Seconds + "   Время миллисек: " + ts.Milliseconds);

            sw3.Start();
            int k = 0;

            for (int i = 0; i < nx; i++)
            {
                for (int j = 0; j < ny; j++)
                {
                    zArrayPicture.array[i, j] = Complex.FromPolarCoordinates(Cud_array1[k].Real, Cud_array1[k].Imaginary).Magnitude;
                    k++;
                }
            }
            //zArrayPicture.array[i, j] = C_array1[i, j].Magnitude;
            //zArrayPicture = ComplexMatrix.ToArrayByRows_column(Cud_array, nx, ny);

            sw3.Stop();
            ts = sw3.Elapsed;
            MessageBox.Show("CUDA FFT  zArrayPicture.array  Время Минут: " + ts.Minutes + "   Время сек: " + ts.Seconds + "   Время миллисек: " + ts.Milliseconds);
            // Cud_array1 = null;
        }
Пример #3
0
        //----------------------------------------------------------------------------------------------
        //           Cuda  FFT из главного окна из k1 в k2
        //----------------------------------------------------------------------------------------------
        public static ZComplexDescriptor Fur_CUDA1(ZComplexDescriptor zarray)                                             // Прямое преобразование Фурье (CUDA)
        {
            int nx = zarray.width;
            int ny = zarray.height;
            ZComplexDescriptor resultArray = new ZComplexDescriptor(nx, ny);

            ComplexNumber[] Cud_array  = ComplexMatrix.ToArrayByRows(zarray);           // Из двухмерного в одномерный ->  Массив комплексных (Struct)чисел [nx*ny]
            ComplexNumber[] Cud_array1 = CUDA_FFT.CudaFFT(Cud_array, nx, ny);

            int k = 0;

            for (int i = 0; i < nx; i++)
            {
                for (int j = 0; j < ny; j++)
                {
                    resultArray.array[i, j] = Complex.FromPolarCoordinates(Cud_array1[k].Real, Cud_array1[k].Imaginary);  // Преобразование из одномерного в [ , ]
                    k++;
                }
            }
            return(resultArray);
        }