1 // This is core/vnl/algo/vnl_fft_2d.h
2 #ifndef vnl_fft_2d_h_
3 #define vnl_fft_2d_h_
4 //:
5 // \file
6 // \brief In-place 2D fast Fourier transform
7 // \author fsm
8 
9 #include <vnl/vnl_matrix.h>
10 #include <vnl/algo/vnl_fft_base.h>
11 
12 //: In-place 2D fast Fourier transform
13 
14 template <class T>
15 struct vnl_fft_2d : public vnl_fft_base<2, T>
16 {
17   typedef vnl_fft_base<2, T> base;
18 
19   //: constructor takes size of signal.
vnl_fft_2dvnl_fft_2d20   vnl_fft_2d(int M, int N) {
21     base::factors_[0].resize(M);
22     base::factors_[1].resize(N);
23   }
24 
25   //: dir = +1/-1 according to direction of transform.
transformvnl_fft_2d26   void transform(vnl_matrix<std::complex<T> > &signal, int dir)
27   { base::transform(signal.data_block(), dir); }
28 
29   //: forward FFT
fwd_transformvnl_fft_2d30   void fwd_transform(vnl_matrix<std::complex<T> > &signal)
31   { transform(signal, +1); }
32 
33   //: backward (inverse) FFT
bwd_transformvnl_fft_2d34   void bwd_transform(vnl_matrix<std::complex<T> > &signal)
35   { transform(signal, -1); }
36 
37   //: return size of signal.
rowsvnl_fft_2d38   unsigned rows() const { return base::factors_[0].number(); }
colsvnl_fft_2d39   unsigned cols() const { return base::factors_[1].number(); }
40 };
41 
42 #endif // vnl_fft_2d_h_
43