1 /*M///////////////////////////////////////////////////////////////////////////////////////
3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
5 // By downloading, copying, installing or using the software you agree to this license.
6 // If you do not agree to this license, do not download, install, copy or use the software.
10 // For Open Source Digital Holographic Library
12 // Openholo library is free software;
13 // you can redistribute it and/or modify it under the terms of the BSD 2-Clause license.
15 // Copyright (C) 2017-2024, Korea Electronics Technology Institute. All rights reserved.
16 // E-mail : contact.openholo@gmail.com
17 // Web : http://www.openholo.org
19 // Redistribution and use in source and binary forms, with or without modification,
20 // are permitted provided that the following conditions are met:
22 // 1. Redistribution's of source code must retain the above copyright notice,
23 // this list of conditions and the following disclaimer.
25 // 2. Redistribution's in binary form must reproduce the above copyright notice,
26 // this list of conditions and the following disclaimer in the documentation
27 // and/or other materials provided with the distribution.
29 // This software is provided by the copyright holders and contributors "as is" and
30 // any express or implied warranties, including, but not limited to, the implied
31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
32 // In no event shall the copyright holder or contributors be liable for any direct,
33 // indirect, incidental, special, exemplary, or consequential damages
34 // (including, but not limited to, procurement of substitute goods or services;
35 // loss of use, data, or profits; or business interruption) however caused
36 // and on any theory of liability, whether in contract, strict liability,
37 // or tort (including negligence or otherwise) arising in any way out of
38 // the use of this software, even if advised of the possibility of such damage.
40 // This software contains opensource software released under GNU Generic Public License,
41 // NVDIA Software License Agreement, or CUDA supplement to Software License Agreement.
42 // Check whether software you use contains licensed software.
45 #include "ophKernel.cuh"
47 __global__ void fftShift(int N, int nx, int ny, cufftDoubleComplex* input, cufftDoubleComplex* output, bool bNormalized)
49 int tid = threadIdx.x + blockIdx.x * blockDim.x;
52 if (bNormalized == true)
55 int half_nx = nx >> 1;
56 int half_ny = ny >> 1;
57 unsigned int size = blockDim.x * gridDim.x;
64 int ti = i - half_nx; if (ti < 0) ti += nx;
65 int tj = j - half_ny; if (tj < 0) tj += ny;
67 int oindex = tj * nx + ti;
70 output[tid].x = input[oindex].x / normalF;
71 output[tid].y = input[oindex].y / normalF;
77 __global__ void fftShiftf(int N, int nx, int ny, cuFloatComplex* input, cuFloatComplex* output, bool bNormalized)
79 int tid = threadIdx.x + blockIdx.x * blockDim.x;
82 if (bNormalized == true)
85 int half_nx = nx >> 1;
86 int half_ny = ny >> 1;
88 unsigned int size = blockDim.x * gridDim.x;
95 int ti = i - half_nx; if (ti < 0) ti += nx;
96 int tj = j - half_ny; if (tj < 0) tj += ny;
98 int oindex = tj * nx + ti;
101 output[tid].x = input[oindex].x / normalF;
102 output[tid].y = input[oindex].y / normalF;
108 __device__ void exponent_complex(cuDoubleComplex* val)
110 double exp_val = exp(val->x);
111 //double re = val->x;
114 val->x = exp_val * cos(im);
115 val->y = exp_val * sin(im);
120 void cudaFFT(CUstream_st* stream, int nx, int ny, cufftDoubleComplex* in_field, cufftDoubleComplex* output_field, int direction, bool bNormalized)
122 unsigned int nblocks = (nx * ny + kBlockThreads - 1) / kBlockThreads;
124 fftShift << <nblocks, kBlockThreads, 0, stream >> > (N, nx, ny, in_field, output_field, false);
129 result = cufftPlan2d(&plan, ny, nx, CUFFT_Z2Z);
130 if (result != CUFFT_SUCCESS)
132 LOG("<FAILED> cufftPlan2d (%d)\n", result);
137 result = cufftExecZ2Z(plan, output_field, in_field, CUFFT_FORWARD);
139 result = cufftExecZ2Z(plan, output_field, in_field, CUFFT_INVERSE);
141 if (result != CUFFT_SUCCESS)
143 LOG("<FAILED> cufftExecZ2Z (%d)\n", result);
147 if (cudaDeviceSynchronize() != cudaSuccess) {
148 LOG("<FAILED> cudaDeviceSynchronize\n");
152 fftShift << < nblocks, kBlockThreads, 0, stream >> > (N, nx, ny, in_field, output_field, bNormalized);