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.
46 #ifndef __ophKernel_cuh__
47 #define __ophKernel_cuh__
49 #include <cuComplex.h>
52 #include <device_launch_parameters.h>
53 #include <cuda_runtime_api.h>
56 static const int kBlockThreads = 512;
58 inline __global__ void fftShift(int N, int nx, int ny, cufftDoubleComplex* input, cufftDoubleComplex* output, bool bNormalized)
60 int tid = threadIdx.x + blockIdx.x * blockDim.x;
66 int half_nx = nx >> 1;
67 int half_ny = ny >> 1;
68 unsigned int size = blockDim.x * gridDim.x;
75 int ti = i - half_nx; if (ti < 0) ti += nx;
76 int tj = j - half_ny; if (tj < 0) tj += ny;
78 int oindex = tj * nx + ti;
81 output[tid].x = input[oindex].x / normalF;
82 output[tid].y = input[oindex].y / normalF;
88 inline __global__ void fftShiftf(int N, int nx, int ny, cuFloatComplex* input, cuFloatComplex* output, bool bNormalized)
90 int tid = threadIdx.x + blockIdx.x * blockDim.x;
96 int half_nx = nx >> 1;
97 int half_ny = ny >> 1;
99 unsigned int size = blockDim.x * gridDim.x;
106 int ti = i - half_nx; if (ti < 0) ti += nx;
107 int tj = j - half_ny; if (tj < 0) tj += ny;
109 int oindex = tj * nx + ti;
112 output[tid].x = input[oindex].x / normalF;
113 output[tid].y = input[oindex].y / normalF;
119 inline __device__ void exponent_complex(cuDoubleComplex* val)
121 double exp_val = exp(val->x);
122 //double re = val->x;
125 val->x = exp_val * cos(im);
126 val->y = exp_val * sin(im);
131 inline void cudaFFT(CUstream_st* stream, int nx, int ny, cufftDoubleComplex* in_field, cufftDoubleComplex* output_field, int direction, bool bNormalized)
133 unsigned int nblocks = (nx * ny + kBlockThreads - 1) / kBlockThreads;
135 fftShift << <nblocks, kBlockThreads, 0, stream >> > (N, nx, ny, in_field, output_field, false);
140 result = cufftPlan2d(&plan, ny, nx, CUFFT_Z2Z);
141 if (result != CUFFT_SUCCESS)
143 LOG("<FAILED> cufftPlan2d (%d)\n", result);
148 result = cufftExecZ2Z(plan, output_field, in_field, CUFFT_FORWARD);
150 result = cufftExecZ2Z(plan, output_field, in_field, CUFFT_INVERSE);
152 if (result != CUFFT_SUCCESS)
154 LOG("<FAILED> cufftExecZ2Z (%d)\n", result);
158 if (cudaDeviceSynchronize() != cudaSuccess) {
159 LOG("<FAILED> cudaDeviceSynchronize\n");
163 fftShift << < nblocks, kBlockThreads, 0, stream >> > (N, nx, ny, in_field, output_field, bNormalized);
169 #endif // !__ophKernel_cuh__