//---------------------------------------------------------------------------------------------- // 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); }
//---------------------------------------------------------------------------------------------- // 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; }
//---------------------------------------------------------------------------------------------- // 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); }