Xmipp  v3.23.11-Nereus
test_fftw_main.cpp
Go to the documentation of this file.
1 #include <core/xmipp_image.h>
2 #include <data/filters.h>
3 #include <core/xmipp_fftw.h>
4 #include <core/multidim_array.h>
5 #include <iostream>
6 #include <gtest/gtest.h>
7 // MORE INFO HERE: http://code.google.com/p/googletest/wiki/AdvancedGuide
8 class FftwTest : public ::testing::Test
9 {
10 protected:
11  //init metadatas
12  virtual void SetUp()
13  {
14 #define len 128
15 
16  mulDouble.resize(3,3);
17  DIRECT_A2D_ELEM(mulDouble,0,0) = 1;
18  DIRECT_A2D_ELEM(mulDouble,0,1) = 2;
19  DIRECT_A2D_ELEM(mulDouble,0,2) = 3;
20 
21  DIRECT_A2D_ELEM(mulDouble,1,0) = 3;
22  DIRECT_A2D_ELEM(mulDouble,1,1) = 2;
23  DIRECT_A2D_ELEM(mulDouble,1,2) = 1;
24 
25  DIRECT_A2D_ELEM(mulDouble,2,0) = 4;
26  DIRECT_A2D_ELEM(mulDouble,2,1) = 4;
27  DIRECT_A2D_ELEM(mulDouble,2,2) = 5;
28  }
30 
31  // virtual void TearDown() {}//Destructor
32 
33 };
34 
35 TEST_F( FftwTest, directFourierTransform)
36 {
37 
39  FourierTransformer transformer1;
40  transformer1.FourierTransform(mulDouble, FFT1, false);
42  auxFFT.resize(3,2);
43  DIRECT_A2D_ELEM(auxFFT,0,0) = std::complex<double>(2.77778,0);
44  DIRECT_A2D_ELEM(auxFFT,0,1) = std::complex<double>(-0.0555556,0.096225);
45  DIRECT_A2D_ELEM(auxFFT,1,0) = std::complex<double>(-0.388889,0.673575) ;
46  DIRECT_A2D_ELEM(auxFFT,1,1) = std::complex<double>(-0.388889,-0.096225);
47  DIRECT_A2D_ELEM(auxFFT,2,0) = std::complex<double>(-0.388889,-0.673575) ;
48  DIRECT_A2D_ELEM(auxFFT,2,1) = std::complex<double>(-0.0555556,0.288675) ;
49  EXPECT_EQ(FFT1,auxFFT);
50  transformer1.cleanup();
51 }
52 
53 TEST_F( FftwTest, directFourierTransformComplex)
54 {
55 
56  MultidimArray< std::complex< double > > FFT1, complxDouble;
57  FourierTransformer transformer1;
58  typeCast(mulDouble, complxDouble);
59  transformer1.FourierTransform(complxDouble, FFT1, false);
60  transformer1.inverseFourierTransform();
61 
62  transformer1.inverseFourierTransform();
64  auxFFT.resize(3,3);
65  DIRECT_A2D_ELEM(auxFFT,0,0) = std::complex<double>(2.77778,0);
66  DIRECT_A2D_ELEM(auxFFT,0,1) = std::complex<double>(-0.0555556,0.096225);
67  DIRECT_A2D_ELEM(auxFFT,0,2) = std::complex<double>(-0.0555556,-0.096225);
68 
69  DIRECT_A2D_ELEM(auxFFT,1,0) = std::complex<double>(-0.388889,0.673575) ;
70  DIRECT_A2D_ELEM(auxFFT,1,1) = std::complex<double>(-0.388889,-0.096225);
71  DIRECT_A2D_ELEM(auxFFT,1,2) = std::complex<double>(-0.0555556,-0.288675);
72 
73  DIRECT_A2D_ELEM(auxFFT,2,0) = std::complex<double>(-0.388889,-0.673575) ;
74  DIRECT_A2D_ELEM(auxFFT,2,1) = std::complex<double>(-0.0555556,0.288675) ;
75  DIRECT_A2D_ELEM(auxFFT,2,2) = std::complex<double>(-0.388889,0.096225) ;
76  EXPECT_EQ(FFT1,auxFFT);
77  transformer1.cleanup();
78 }
79 
81 {
82  double w;
83  FFT_IDX2DIGFREQ(0,128,w);
84  EXPECT_EQ(0,w);
85  FFT_IDX2DIGFREQ(1,128,w);
86  EXPECT_EQ(1.0/128.0,w);
87  FFT_IDX2DIGFREQ(64,128,w);
88  EXPECT_EQ(0.5,w);
89  FFT_IDX2DIGFREQ(65,128,w);
90  EXPECT_EQ(-63.0/128.0,w);
91  FFT_IDX2DIGFREQ(127,128,w);
92  EXPECT_EQ(-1.0/128.0,w);
93 
94  FFT_IDX2DIGFREQ(0,129,w);
95  EXPECT_EQ(0,w);
96  FFT_IDX2DIGFREQ(1,129,w);
97  EXPECT_EQ(1.0/129.0,w);
98  FFT_IDX2DIGFREQ(64,129,w);
99  EXPECT_EQ(64.0/129.0,w);
100  FFT_IDX2DIGFREQ(65,129,w);
101  EXPECT_EQ(-64.0/129.0,w);
102  FFT_IDX2DIGFREQ(128,129,w);
103  EXPECT_EQ(-1.0/129.0,w);
104 
105  size_t i=255;
106  size_t dim=256;
107  FFT_IDX2DIGFREQ(i,dim,w);
108  EXPECT_EQ(-1.0/256.0,w);
109 }
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
void cleanup(void)
Definition: xmipp_fftw.h:370
#define DIRECT_A2D_ELEM(v, i, j)
doublereal * w
MultidimArray< double > mulDouble
#define i
TEST_F(FftwTest, directFourierTransform)
__host__ __device__ float fft_IDX2DIGFREQ(int idx, int size)
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
__device__ float FFT_IDX2DIGFREQ(int idx, int size)
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1863
void typeCast(const Matrix1D< T1 > &v1, Matrix1D< T2 > &v2)
Definition: matrix1d.h:1227
virtual void SetUp()