isce3 0.25.0
Loading...
Searching...
No Matches
gpuSignal.h
1#pragma once
2
3#include "forward.h"
4
5#include <complex>
6#include <valarray>
7
8#include <cufft.h>
9#include <thrust/complex.h>
10
11namespace isce3::cuda::signal {
12
13template<class T>
14class gpuSignal {
15
16 public:
17 // Default constructor
18 gpuSignal() {};
19 gpuSignal(cufftType _type);
20 ~gpuSignal();
21
27 void azimuthFFT(int ncolumns, int nrows);
28
34 void rangeFFT(int ncolumns, int nrows);
35
41 void FFT2D(int ncolumns, int nrows);
42
46 void fftPlan(int rank, int* n, int howmany,
47 int* inembed, int istride, int idist,
48 int* onembed, int ostride, int odist);
49
51 void nextPowerOfTwo(size_t N, size_t& fftLength);
52
54 inline void _configureRangeFFT(int ncolumns, int nrows);
55
57 inline void _configureAzimuthFFT(int ncolumns, int nrows);
58
60 void dataToDevice(std::complex<T> *input);
61 void dataToDevice(std::valarray<std::complex<T>> &input);
62 void dataToHost(std::complex<T> *output);
63 void dataToHost(std::valarray<std::complex<T>> &output);
64
66 void forward();
67
69 void forwardC2C(std::complex<T> *input, std::complex<T> *output);
70 void forwardC2C(std::valarray<std::complex<T>> &input,
71 std::valarray<std::complex<T>> &output);
72 void forwardZ2Z(std::complex<T> *input, std::complex<T> *output);
73 void forwardZ2Z(std::valarray<std::complex<T>> &input,
74 std::valarray<std::complex<T>> &output);
75 void forwardD2Z(T *input, std::complex<T> *output);
76
77 void forward(std::complex<T> *input, std::complex<T> *output);
78 void forward(std::valarray<std::complex<T>> &input,
79 std::valarray<std::complex<T>> &output);
80
81 void forwardDevMem(thrust::complex<float> *input,
83
84 void forwardDevMem(thrust::complex<double> *input,
86
87 void forwardDevMem(thrust::complex<T> *dataInPlace);
88
90 void inverse();
91
93 void inverseC2C(std::complex<T> *input, std::complex<T> *output);
94 void inverseC2C(std::valarray<std::complex<T>> &input,
95 std::valarray<std::complex<T>> &output);
96 void inverseZ2Z(std::complex<T> *input, std::complex<T> *output);
97 void inverseZ2Z(std::valarray<std::complex<T>> &input,
98 std::valarray<std::complex<T>> &output);
99 void inverseZ2D(std::complex<T> *input, T *output);
100
101 void inverse(std::complex<T> *input, std::complex<T> *output);
102 void inverse(std::valarray<std::complex<T>> &input,
103 std::valarray<std::complex<T>> &output);
104
105 void inverseDevMem(thrust::complex<float> *input,
106 thrust::complex<float> *output);
107
108 void inverseDevMem(thrust::complex<double> *input,
110
111 void inverseDevMem(thrust::complex<T> *dataInPlace);
112
114 void upsample(std::valarray<std::complex<T>> &input,
115 std::valarray<std::complex<T>> &output,
116 int row,
117 int ncols,
118 int upsampleFactor);
119 void upsample(std::valarray<std::complex<T>> &input,
120 std::valarray<std::complex<T>> &output,
121 int row,
122 int ncols,
123 int upsampleFactor,
124 std::valarray<std::complex<T>> &shiftImpact);
125
126 int getRows() {return _rows;};
127 int getColumns() {return _columns;};
128 int getNumElements() {return _n_elements;};
129
130 thrust::complex<T>* getDevicePtr() {return _d_data;};
131
132 private:
133 cufftHandle _plan;
134 bool _plan_set;
135 cufftType _cufft_type;
136
137 // FFT plan parameters
138 int _rank;
139 int _n[2];
140 int _howmany;
141 int _inembed[2];
142 int _istride;
143 int _idist;
144 int _onembed[2];
145 int _ostride;
146 int _odist;
147 int _n_elements;
148 int _rows;
149 int _columns;
150
151 // device memory pointers
152 thrust::complex<T> *_d_data;
153 bool _d_data_set;
154};
155
156template<class T>
157void upsample(gpuSignal<T> &fwd,
158 gpuSignal<T> &inv,
159 thrust::complex<T> *input,
160 thrust::complex<T> *output);
161
162template<class T>
163void upsample(gpuSignal<T> &fwd,
164 gpuSignal<T> &inv,
165 thrust::complex<T> *input,
166 thrust::complex<T> *output,
167 thrust::complex<T> *shiftImpact);
168
169template<class T>
170void upsample(gpuSignal<T> &fwd,
171 gpuSignal<T> &inv,
172 std::valarray<std::complex<T>> &input,
173 std::valarray<std::complex<T>> &output);
174
175template<class T>
176void upsample(gpuSignal<T> &fwd,
177 gpuSignal<T> &inv,
178 std::valarray<std::complex<T>> &input,
179 std::valarray<std::complex<T>> &output,
180 std::valarray<std::complex<T>> &shiftImpact);
181
182} // namespace isce3::cuda::signal
Definition gpuSignal.h:14
void forward()
forward transforms without intermediate return
Definition gpuSignal.cu:345
void forwardZ2Z(std::complex< T > *input, std::complex< T > *output)
unnormalized forward complex double transform
Definition gpuSignal.cu:479
void _configureRangeFFT(int ncolumns, int nrows)
determine the required parameters for setting range FFT plans
Definition gpuSignal.cu:223
void inverse()
inverse transforms using existing device memory
Definition gpuSignal.cu:635
void upsample(std::valarray< std::complex< T > > &input, std::valarray< std::complex< T > > &output, int row, int ncols, int upsampleFactor)
upsample
Definition gpuSignal.cu:1005
void inverseZ2D(std::complex< T > *input, T *output)
unnormalized inverse complex double to double transform
Definition gpuSignal.cu:844
void FFT2D(int ncolumns, int nrows)
initiate plan for FFT in azimuth direction for a block of complex data.
Definition gpuSignal.cu:155
void _configureAzimuthFFT(int ncolumns, int nrows)
determine the required parameters for setting azimuth FFT plans
Definition gpuSignal.cu:256
void nextPowerOfTwo(size_t N, size_t &fftLength)
next power of two
Definition gpuSignal.cu:206
void forwardC2C(std::complex< T > *input, std::complex< T > *output)
forward transforms
Definition gpuSignal.cu:405
void forwardD2Z(T *input, std::complex< T > *output)
unnormalized forward double to complex double transform
Definition gpuSignal.cu:553
void inverseC2C(std::complex< T > *input, std::complex< T > *output)
inverse transforms
Definition gpuSignal.cu:695
void rangeFFT(int ncolumns, int nrows)
initiate plan for FFT in azimuth direction for a block of complex data.
Definition gpuSignal.cu:123
void inverseZ2Z(std::complex< T > *input, std::complex< T > *output)
unnormalized inverse complex double transform
Definition gpuSignal.cu:770
void fftPlan(int rank, int *n, int howmany, int *inembed, int istride, int idist, int *onembed, int ostride, int odist)
initiate cuFFT plan for a block of complex data input parameters cuFFT interface for fftw_plan_many_d...
Definition gpuSignal.cu:182
void dataToDevice(std::complex< T > *input)
moving data in between device and host
Definition gpuSignal.cu:288
void azimuthFFT(int ncolumns, int nrows)
initiate plan for FFT in range direction for a block of complex data.
Definition gpuSignal.cu:139
~gpuSignal()
Destructor.
Definition gpuSignal.cu:106
Definition GDALDataTypeUtil.h:10

Generated for ISCE3.0 by doxygen 1.13.2.