10 #include <boost/range.hpp>
11 #include <boost/range/algorithm.hpp>
13 #include <FftwTransform.hpp>
14 #include <Waveform.hpp>
16 #include <gtest/gtest.h>
19 #include <boost/archive/text_iarchive.hpp>
21 #include <boost/serialization/vector.hpp>
22 #include <boost/serialization/complex.hpp>
41 parse_dat_file (std::string fileName)
43 std::ifstream ifs(fileName.c_str());
47 std::vector<T> result { std::istream_iterator<T>(ifs)
48 , std::istream_iterator<T>() };
54 class FftwTransformTest :
public ::testing::Test {
85 std::ifstream ifst(
"test_data/bs_FftwTransformTest_tDomain_.txt");
86 boost::archive::text_iarchive iat (ifst);
89 std::ifstream ifsf(
"test_data/bs_FftwTransformTest_fDomain_.txt");
90 boost::archive::text_iarchive iaf (ifsf);
94 stepFn1024_real = parse_dat_file<double>(
"test_data/stepFn1024_real.dat");
95 stepFn1024_complex = parse_dat_file<std::complex<double> >(
"test_data/stepFn1024_complex.dat");
97 diracFn1024_real = parse_dat_file<double>(
"test_data/diracFn1024_real.dat");
98 diracFn1024_complex = parse_dat_file<std::complex<double> >(
"test_data/diracFn1024_complex.dat");
100 triangleFn1024_real = parse_dat_file<double>(
"test_data/triangleFn1024_real.dat");
101 triangleFn1024_complex = parse_dat_file<std::complex<double> >(
"test_data/triangleFn1024_complex.dat");
103 squareFn1024_real = parse_dat_file<double>(
"test_data/squareFn1024_real.dat");
104 squareFn1024_complex = parse_dat_file<std::complex<double> >(
"test_data/squareFn1024_complex.dat");
107 testArrays_real.push_back(stepFn1024_real);
108 testArrays_real.push_back(diracFn1024_real);
109 testArrays_real.push_back(triangleFn1024_real);
110 testArrays_real.push_back(squareFn1024_real);
112 testArrays_complex.push_back(stepFn1024_complex);
113 testArrays_complex.push_back(diracFn1024_complex);
114 testArrays_complex.push_back(triangleFn1024_complex);
115 testArrays_complex.push_back(squareFn1024_complex);
137 double nearVal = 0.00001;
139 std::vector<double> tDomain_;
142 std::vector< std::complex<double> > fDomain_;
146 std::vector<double> stepFn1024_real;
147 std::vector< std::complex<double> > stepFn1024_complex;
149 std::vector<double> diracFn1024_real;
150 std::vector< std::complex<double> > diracFn1024_complex;
152 std::vector<double> triangleFn1024_real;
153 std::vector< std::complex<double> > triangleFn1024_complex;
155 std::vector<double> squareFn1024_real;
156 std::vector< std::complex<double> > squareFn1024_complex;
158 std::vector< std::vector<double> > testArrays_real;
159 std::vector< std::vector<std::complex<double> > > testArrays_complex;
170 TEST_F(FftwTransformTest, CTor1)
174 std::vector< std::complex<double> > fresult (tDomain_.size() / 2 + 1);
175 FftwTransform myFT = FftwTransform(tDomain_.begin(), tDomain_.end(), fresult.begin());
177 myFT.exec_transform();
180 for (
unsigned iter (0); iter < fresult.size(); ++iter)
187 EXPECT_NEAR( std::real(fresult.at(iter)), std::real(fDomain_.at(iter)), nearVal ) <<
"\t@\t" << iter;
188 EXPECT_NEAR( std::imag(fresult.at(iter)), std::imag(fDomain_.at(iter)), nearVal ) <<
"\t@\t" << iter;
194 TEST_F(FftwTransformTest, CTor2)
199 std::vector< std::complex<double> > fresult (tDomain_.size() / 2 + 1);
200 FftwTransform myFT = FftwTransform(tDomain_, fresult);
203 myFT.exec_transform();
206 for (
unsigned iter (0); iter < fresult.size(); ++iter)
213 EXPECT_NEAR( std::real(fresult.at(iter)), std::real(fDomain_.at(iter)), nearVal ) <<
"\t@\t" << iter;
214 EXPECT_NEAR( std::imag(fresult.at(iter)), std::imag(fDomain_.at(iter)), nearVal ) <<
"\t@\t" << iter;
223 TEST_F(FftwTransformTest, FwTrans)
227 std::vector< std::complex<double> > fresult (tDomain_.size() / 2 + 1);
228 FftwTransform myFT = FftwTransform(tDomain_.begin(), tDomain_.end(), fresult.begin());
230 myFT.exec_transform();
233 for (
unsigned iter (0); iter < fresult.size(); ++iter)
240 EXPECT_NEAR( std::real(fresult.at(iter)), std::real(fDomain_.at(iter)), nearVal ) <<
"\t@\t" << iter;
241 EXPECT_NEAR( std::imag(fresult.at(iter)), std::imag(fDomain_.at(iter)), nearVal ) <<
"\t@\t" << iter;
260 TEST_F(FftwTransformTest, FwTransTestArrays)
266 for (std::size_t iter_array (0); iter_array < testArrays_real.size(); ++iter_array) {
267 std::vector< std::complex<double> > fresult (testArrays_real.at(iter_array).size() / 2 + 1);
269 FftwTransform myFT = FftwTransform(testArrays_real.at(iter_array).begin(), testArrays_real.at(iter_array).end(), fresult.begin());
271 myFT.exec_transform();
273 EXPECT_EQ (fresult.size(), testArrays_complex.at(iter_array).size()) << iter_array;
275 for (
unsigned iter (0); iter < fresult.size(); ++iter)
282 EXPECT_NEAR( std::real(fresult.at(iter)), std::real(testArrays_complex.at(iter_array).at(iter)), nearVal ) <<
"\t@\t" << iter;
283 EXPECT_NEAR( std::imag(fresult.at(iter)), std::imag(testArrays_complex.at(iter_array).at(iter)), nearVal ) <<
"\t@\t" << iter;
291 TEST_F(FftwTransformTest, InvTrans)
297 std::vector<double> tresult (tDomain_.size());
298 FftwTransform myFT = FftwTransform(tresult.begin(), tresult.end(), fDomain_.begin());
300 myFT.exec_inverse_transform();
302 ASSERT_EQ( tresult.size(), tDomain_.size()) <<
"\tfDomain size:\t" << fDomain_.size();
305 for (
auto& val : tresult)
307 val /= double(tresult.size());
310 for (
unsigned iter (0); iter < tresult.size(); ++iter)
312 EXPECT_NEAR( tresult.at(iter), tDomain_.at(iter), nearVal ) <<
"\t@\t" << iter <<
"\tFactor:\t" << tresult.at(iter) / tDomain_.at(iter);
319 TEST_F(FftwTransformTest, ParameterForWaveform)
326 , std::vector< std::complex<double> >
330 EXPECT_EQ(tDomain_.size(), myWfm.size());
333 for (
unsigned iter (0); iter < myWfm.size(); ++iter)
335 EXPECT_EQ(tDomain_.at(iter), myWfm.GetConstTimeSeries().at(iter));
341 TEST_F(FftwTransformTest, FwdTransformInWaveform)
349 , std::vector< std::complex<double> >
353 myWfm.GetConstFreqSpectrum();
356 EXPECT_EQ(fDomain_.size() / 2 + 1, myWfm.GetConstFreqSpectrum().size());
358 for (
unsigned iter (0); iter < myWfm.GetConstFreqSpectrum().size(); ++iter)
361 EXPECT_NEAR( std::real(myWfm.GetConstFreqSpectrum().at(iter)), std::real(fDomain_.at(iter)), nearVal ) <<
"\t@\t" << iter;
362 EXPECT_NEAR( std::imag(myWfm.GetConstFreqSpectrum().at(iter)), std::imag(fDomain_.at(iter)), nearVal ) <<
"\t@\t" << iter;
367 TEST_F(FftwTransformTest, RvsTransformInWaveform)
372 std::vector<std::complex<double> > fDomainProper (fDomain_.begin(), fDomain_.begin() + 131);
375 , std::vector< std::complex<double> >
377 > myWfm (fDomainProper);
379 myWfm.GetConstTimeSeries();
392 for (
auto& val : myWfm.GetTimeSeries())
397 EXPECT_EQ(tDomain_.size(), myWfm.GetConstTimeSeries().size());
399 for (
unsigned iter (0); iter < myWfm.GetConstTimeSeries().size(); ++iter)
401 EXPECT_NEAR(myWfm.GetTimeSeries().at(iter), tDomain_.at(iter), nearVal) <<
"\t@\t" << iter;
409 main (
int argc,
char** argv)
411 ::testing::InitGoogleTest(&argc, argv);
412 return RUN_ALL_TESTS();