HOPS
HOPS class reference
MHO_FastFourierTransformWorkspace.hh
Go to the documentation of this file.
1 #ifndef MHO_FastFourierTransformWorkspace_HH__
2 #define MHO_FastFourierTransformWorkspace_HH__
3 
4 #include <algorithm>
5 #include <cmath>
6 #include <complex>
7 #include <cstddef>
8 
11 #include "MHO_Message.hh"
12 
13 namespace hops
14 {
15 
24 template< typename XFloatType > class MHO_FastFourierTransformWorkspace
25 {
26  public:
28  {
29  fN = 0;
30  fM = 0;
31  fPermutation = nullptr;
32  fTwiddle = nullptr;
33  fConjugateTwiddle = nullptr;
34  fScale = nullptr;
35  fCirculant = nullptr;
36  fWorkspace = nullptr;
37  };
38 
40  {
41  fN = 0;
42  fM = 0;
43  fPermutation = nullptr;
44  fTwiddle = nullptr;
45  fConjugateTwiddle = nullptr;
46  fScale = nullptr;
47  fCirculant = nullptr;
48  fWorkspace = nullptr;
49  Resize(n);
50  };
51 
53  {
54  fN = 0;
55  fM = 0;
56  fPermutation = nullptr;
57  fTwiddle = nullptr;
58  fConjugateTwiddle = nullptr;
59  fScale = nullptr;
60  fCirculant = nullptr;
61  fWorkspace = nullptr;
62  Resize(copy.fN);
63  };
64 
65  virtual ~MHO_FastFourierTransformWorkspace() { Deallocate(); };
66 
72  void Resize(unsigned int n)
73  {
74  if(fN != n)
75  {
76  Deallocate();
77  Allocate(n);
78  Fill();
79  }
80  }
81 
87  bool IsRadix2() { return (fM == 0); }
88 
94  unsigned int GetN() { return fN; }
95 
101  unsigned int GetM() { return fM; }
102 
108  const unsigned int* GetPermutation() const { return fPermutation; }
109 
115  const std::complex< XFloatType >* GetTwiddle() const { return fTwiddle; }
116 
122  const std::complex< XFloatType >* GetConjTwiddle() const { return fConjugateTwiddle; }
123 
129  const std::complex< XFloatType >* GetScale() const { return fScale; } //unused for radix-2 (nullptr)
130 
136  const std::complex< XFloatType >* GetCirculant() const { return fCirculant; } //unused for radix-2 (nullptr)
137 
143  std::complex< XFloatType >* GetWorkspace() const { return fWorkspace; } //unused for radix-2 (nullptr)
144 
145  //data is publicly accessible (for now -- eventually re-work FFT classes to access data via getters)
146  public:
147  unsigned int fN;
148  unsigned int fM; //unused for radix-2 (set to zero)
149  unsigned int* fPermutation;
150  std::complex< XFloatType >* fTwiddle;
151  std::complex< XFloatType >* fConjugateTwiddle;
152  std::complex< XFloatType >* fScale; //unused for radix-2 (nullptr)
153  std::complex< XFloatType >* fCirculant; //unused for radix-2 (nullptr)
154  std::complex< XFloatType >* fWorkspace; //unused for radix-2 (nullptr)
155 
156  private:
157  void Deallocate()
158  {
159  delete[] fPermutation;
160  fPermutation = nullptr;
161  delete[] fTwiddle;
162  fTwiddle = nullptr;
163  delete[] fConjugateTwiddle;
164  fConjugateTwiddle = nullptr;
165  delete[] fScale;
166  fScale = nullptr;
167  delete[] fCirculant;
168  fCirculant = nullptr;
169  delete[] fWorkspace;
170  fWorkspace = nullptr;
171  fN = 0;
172  fM = 0;
173  }
174 
175  void Fill()
176  {
177  if(fN == 0)
178  {
179  return;
180  }
181  if(fM == 0)
182  {
183  //radix-2 algorithm, only need a handful of items
187  }
188  else
189  {
190  //use Bluestein algorithm
196  fCirculant);
197  }
198  }
199 
200  void Allocate(unsigned int n)
201  {
202  fN = n;
203  if(fN == 0)
204  {
205  return;
206  }
208  if(!is_radix2)
209  {
211  //can't perform an in-place transform, need Bluestein algo workspace
212  fPermutation = new unsigned int[fM];
213  fTwiddle = new std::complex< XFloatType >[fM];
214  fConjugateTwiddle = new std::complex< XFloatType >[fM];
215  fScale = new std::complex< XFloatType >[fN];
216  fCirculant = new std::complex< XFloatType >[fM];
217  fWorkspace = new std::complex< XFloatType >[fM];
218  }
219  else
220  {
221  //radix-2 algorithm
222  fM = 0;
223  fPermutation = new unsigned int[fN];
224  fTwiddle = new std::complex< XFloatType >[fN];
225  fConjugateTwiddle = new std::complex< XFloatType >[fN];
226  }
227  }
228 };
229 
230 } // namespace hops
231 
232 #endif
static void ComputeBitReversedIndicesBaseTwo(unsigned int N, unsigned int *index_arr)
Computes bit-reversed indices using Buneman algorithm for input N, must have N = 2^P,...
Definition: MHO_BitReversalPermutation.cc:119
static bool IsPowerOfTwo(unsigned int N)
Checks if an unsigned integer is a power of two.
Definition: MHO_BitReversalPermutation.cc:10
static void ComputeBluesteinScaleFactors(unsigned int N, std::complex< XFloatType > *scale)
Function ComputeBluesteinScaleFactors.
static unsigned int ComputeBluesteinArraySize(unsigned int N)
Function ComputeBluesteinArraySize Computes the array size needed to perform a Bluestein/Chirp-Z FFT ...
Definition: MHO_FastFourierTransformUtilities.hh:331
static void ComputeConjugateTwiddleFactors(unsigned int N, std::complex< XFloatType > *conj_twiddle)
Computes the conjugate twiddle factors for given size N and stores them in provided array.
Definition: MHO_FastFourierTransformUtilities.hh:76
static void ComputeTwiddleFactors(unsigned int N, std::complex< XFloatType > *twiddle)
Compute twiddle factors for a Fast Fourier Transform. computes all the twiddle factors e^{i*2*pi/N} f...
static void ComputeBluesteinCirculantVector(unsigned int N, unsigned int M, std::complex< XFloatType > *twiddle, std::complex< XFloatType > *scale, std::complex< XFloatType > *circulant)
Function ComputeBluesteinCirculantVector twiddle and circulant array must be length M = 2^p >= (2N - ...
Definition: MHO_FastFourierTransformUtilities.hh:363
navtive FFT workspace definitions
Definition: MHO_FastFourierTransformWorkspace.hh:25
std::complex< XFloatType > * fCirculant
Definition: MHO_FastFourierTransformWorkspace.hh:153
const std::complex< XFloatType > * GetTwiddle() const
Getter for twiddle.
Definition: MHO_FastFourierTransformWorkspace.hh:115
std::complex< XFloatType > * fWorkspace
Definition: MHO_FastFourierTransformWorkspace.hh:154
unsigned int fM
Definition: MHO_FastFourierTransformWorkspace.hh:148
std::complex< XFloatType > * fScale
Definition: MHO_FastFourierTransformWorkspace.hh:152
MHO_FastFourierTransformWorkspace()
Definition: MHO_FastFourierTransformWorkspace.hh:27
MHO_FastFourierTransformWorkspace(unsigned int n)
Definition: MHO_FastFourierTransformWorkspace.hh:39
void Resize(unsigned int n)
Resizes the internal data structure to a new size and fills it.
Definition: MHO_FastFourierTransformWorkspace.hh:72
bool IsRadix2()
Checks if the current workspace is for radix-2 FFT.
Definition: MHO_FastFourierTransformWorkspace.hh:87
unsigned int fN
Definition: MHO_FastFourierTransformWorkspace.hh:147
const std::complex< XFloatType > * GetConjTwiddle() const
Getter for conj twiddle.
Definition: MHO_FastFourierTransformWorkspace.hh:122
MHO_FastFourierTransformWorkspace(const MHO_FastFourierTransformWorkspace &copy)
Definition: MHO_FastFourierTransformWorkspace.hh:52
const std::complex< XFloatType > * GetScale() const
Getter for scale.
Definition: MHO_FastFourierTransformWorkspace.hh:129
unsigned int * fPermutation
Definition: MHO_FastFourierTransformWorkspace.hh:149
const unsigned int * GetPermutation() const
Getter for permutation.
Definition: MHO_FastFourierTransformWorkspace.hh:108
std::complex< XFloatType > * fTwiddle
Definition: MHO_FastFourierTransformWorkspace.hh:150
const std::complex< XFloatType > * GetCirculant() const
Getter for circulant.
Definition: MHO_FastFourierTransformWorkspace.hh:136
std::complex< XFloatType > * fConjugateTwiddle
Definition: MHO_FastFourierTransformWorkspace.hh:151
virtual ~MHO_FastFourierTransformWorkspace()
Definition: MHO_FastFourierTransformWorkspace.hh:65
std::complex< XFloatType > * GetWorkspace() const
Getter for workspace.
Definition: MHO_FastFourierTransformWorkspace.hh:143
unsigned int GetN()
Getter for n.
Definition: MHO_FastFourierTransformWorkspace.hh:94
unsigned int GetM()
Getter for m.
Definition: MHO_FastFourierTransformWorkspace.hh:101
Definition: MHO_ChannelLabeler.hh:17