33TEST_CASE(
"compiling psdFilter",
"[sigproc::psdFilter]" )
35 GIVEN(
"a psdFilter, sqrt pointer" )
39 mx::sigproc::psdFilter<double, 1> psdF;
41 std::vector<double> psdSqrt( 1024, 1 );
43 int rv = psdF.psdSqrt( &psdSqrt, 1 );
46 REQUIRE( psdF.rows() == 1024 );
47 REQUIRE( psdF.cols() == 1 );
48 REQUIRE( psdF.planes() == 1 );
51 REQUIRE( psdF.rows() == 0 );
52 REQUIRE( psdF.cols() == 0 );
53 REQUIRE( psdF.planes() == 0 );
57 mx::sigproc::psdFilter<double, 2> psdF;
59 Eigen::Array<double, -1, -1> psdSqrt;
60 psdSqrt.resize( 256, 256 );
61 psdSqrt.setConstant( 1 );
63 int rv = psdF.psdSqrt( &psdSqrt, 1, 1 );
66 REQUIRE( psdF.rows() == 256 );
67 REQUIRE( psdF.cols() == 256 );
68 REQUIRE( psdF.planes() == 1 );
71 REQUIRE( psdF.rows() == 0 );
72 REQUIRE( psdF.cols() == 0 );
73 REQUIRE( psdF.planes() == 0 );
77 mx::sigproc::psdFilter<double, 3> psdF;
80 psdSqrt.resize( 128, 128, 256 );
83 int rv = psdF.psdSqrt( &psdSqrt, 1, 1, 1 );
86 REQUIRE( psdF.rows() == 128 );
87 REQUIRE( psdF.cols() == 128 );
88 REQUIRE( psdF.planes() == 256 );
91 REQUIRE( psdF.rows() == 0 );
92 REQUIRE( psdF.cols() == 0 );
93 REQUIRE( psdF.planes() == 0 );
97 GIVEN(
"a psdFilter, sqrt reference" )
101 mx::sigproc::psdFilter<double, 1> psdF;
103 std::vector<double> psdSqrt( 1024, 1 );
105 int rv = psdF.psdSqrt( psdSqrt, 1 );
108 REQUIRE( psdF.rows() == 1024 );
109 REQUIRE( psdF.cols() == 1 );
110 REQUIRE( psdF.planes() == 1 );
113 REQUIRE( psdF.rows() == 0 );
114 REQUIRE( psdF.cols() == 0 );
115 REQUIRE( psdF.planes() == 0 );
119 mx::sigproc::psdFilter<double, 2> psdF;
121 Eigen::Array<double, -1, -1> psdSqrt;
122 psdSqrt.resize( 256, 256 );
123 psdSqrt.setConstant( 1 );
125 int rv = psdF.psdSqrt( psdSqrt, 1, 1 );
128 REQUIRE( psdF.rows() == 256 );
129 REQUIRE( psdF.cols() == 256 );
130 REQUIRE( psdF.planes() == 1 );
133 REQUIRE( psdF.rows() == 0 );
134 REQUIRE( psdF.cols() == 0 );
135 REQUIRE( psdF.planes() == 0 );
139 mx::sigproc::psdFilter<double, 3> psdF;
142 psdSqrt.resize( 128, 128, 256 );
145 int rv = psdF.psdSqrt( psdSqrt, 1, 1, 1 );
148 REQUIRE( psdF.rows() == 128 );
149 REQUIRE( psdF.cols() == 128 );
150 REQUIRE( psdF.planes() == 256 );
153 REQUIRE( psdF.rows() == 0 );
154 REQUIRE( psdF.cols() == 0 );
155 REQUIRE( psdF.planes() == 0 );
159 GIVEN(
"a psdFilter, psd reference" )
163 mx::sigproc::psdFilter<double, 1> psdF;
165 std::vector<double> psd( 1024, 1 );
167 int rv = psdF.psd( psd, 1.0 );
170 REQUIRE( psdF.rows() == 1024 );
171 REQUIRE( psdF.cols() == 1 );
172 REQUIRE( psdF.planes() == 1 );
175 REQUIRE( psdF.rows() == 0 );
176 REQUIRE( psdF.cols() == 0 );
177 REQUIRE( psdF.planes() == 0 );
181 mx::sigproc::psdFilter<double, 2> psdF;
183 Eigen::Array<double, -1, -1> psd;
184 psd.resize( 256, 256 );
185 psd.setConstant( 1 );
187 int rv = psdF.psd( psd, 1.0, 1.0 );
190 REQUIRE( psdF.rows() == 256 );
191 REQUIRE( psdF.cols() == 256 );
192 REQUIRE( psdF.planes() == 1 );
195 REQUIRE( psdF.rows() == 0 );
196 REQUIRE( psdF.cols() == 0 );
197 REQUIRE( psdF.planes() == 0 );
201 mx::sigproc::psdFilter<double, 3> psdF;
204 psd.resize( 128, 128, 256 );
207 int rv = psdF.psd( psd, 1, 1, 1 );
210 REQUIRE( psdF.rows() == 128 );
211 REQUIRE( psdF.cols() == 128 );
212 REQUIRE( psdF.planes() == 256 );
215 REQUIRE( psdF.rows() == 0 );
216 REQUIRE( psdF.cols() == 0 );
217 REQUIRE( psdF.planes() == 0 );
230TEST_CASE(
"filtering with psdFilter",
"[sigproc::psdFilter]" )
232 GIVEN(
"a rank 1 psd" )
234 WHEN(
"alpha=-2.5, df Nyquist matched to array size, var=1" )
236 mx::sigproc::psdFilter<double, 1> psdF;
238 std::vector<double> f( 2049 ), psd( 2049 );
240 for(
size_t n = 0; n < psd.size(); ++n )
241 f[n] = n * 1.0 / 4096.;
243 for(
size_t n = 1; n < psd.size(); ++n )
244 psd[n] = pow( f[n], -2.5 );
249 std::vector<double> f2s, psd2s;
253 double df = f2s[1] - f2s[0];
255 int rv = psdF.psd( psd2s, df );
258 REQUIRE( psdF.rows() == 2. * psd.size() - 2 );
259 REQUIRE( psdF.cols() == 1 );
260 REQUIRE( psdF.planes() == 1 );
262 std::vector<double> noise( psdF.rows() );
265 normVar.
seed( 0x50D00001 );
269 for(
int k = 0; k < psdFilterTrials; ++k )
271 for(
size_t n = 0; n < noise.size(); ++n )
277 avgRms = sqrt( avgRms / psdFilterTrials );
279 REQUIRE_THAT( avgRms, Catch::Matchers::WithinAbs( 1.0, psdFilterTol ) );
281 WHEN(
"alpha=-1.5, df arbitrary, var = 2.2" )
283 mx::sigproc::psdFilter<double, 1> psdF;
285 std::vector<double> f( 1025 ), psd( 1025 );
287 for(
size_t n = 0; n < psd.size(); ++n )
288 f[n] = n * 1.0 / 7000.;
290 for(
size_t n = 1; n < psd.size(); ++n )
291 psd[n] = pow( f[n], -1.5 );
294 std::vector<double> f2s, psd2s;
298 double df = f2s[1] - f2s[0];
301 int rv = psdF.psd( psd2s, df );
304 REQUIRE( psdF.rows() == 2. * psd.size() - 2 );
305 REQUIRE( psdF.cols() == 1 );
306 REQUIRE( psdF.planes() == 1 );
308 std::vector<double> noise( psdF.rows() );
311 normVar.
seed( 0x50D00002 );
315 for(
int k = 0; k < psdFilterTrials; ++k )
317 for(
size_t n = 0; n < noise.size(); ++n )
323 avgRms = sqrt( avgRms / psdFilterTrials );
325 REQUIRE_THAT( avgRms, Catch::Matchers::WithinAbs( sqrt( 2.2 ), psdFilterTol * sqrt( 2.2 ) ) );
328 GIVEN(
"a rank 2 psd" )
330 WHEN(
"alpha=-2.5, dk Nyquist matched to array size, var=1" )
332 mx::sigproc::psdFilter<double, 2> psdF;
334 Eigen::Array<double, -1, -1> k, psd;
337 psd.resize( 64, 64 );
340 for(
int cc = 0; cc < psd.cols(); ++cc )
342 for(
int rr = 0; rr < psd.rows(); ++rr )
344 if( k( rr, cc ) == 0 )
347 psd( rr, cc ) = pow( k( rr, cc ), -2.5 );
351 double dk = k( 0, 1 ) - k( 0, 0 );
355 int rv = psdF.psd( psd, dk, dk );
358 REQUIRE( psdF.rows() == psd.rows() );
359 REQUIRE( psdF.cols() == psd.cols() );
360 REQUIRE( psdF.planes() == 1 );
362 Eigen::Array<double, -1, -1> noise( psdF.rows(), psdF.cols() );
365 normVar.
seed( 0x50D00003 );
369 for(
int k = 0; k < psdFilterTrials; ++k )
371 for(
int cc = 0; cc < psd.cols(); ++cc )
373 for(
int rr = 0; rr < psd.rows(); ++rr )
375 noise( rr, cc ) = normVar;
380 avgRms += noise.square().sum();
383 avgRms = sqrt( avgRms / ( psd.rows() * psd.cols() ) / psdFilterTrials );
385 REQUIRE_THAT( avgRms, Catch::Matchers::WithinAbs( 1.0, psdFilterTol ) );
387 WHEN(
"alpha=-1.5, dk arb, var=2.2" )
389 mx::sigproc::psdFilter<double, 2> psdF;
391 Eigen::Array<double, -1, -1> k, psd;
394 psd.resize( 64, 64 );
397 for(
int cc = 0; cc < psd.cols(); ++cc )
399 for(
int rr = 0; rr < psd.rows(); ++rr )
401 if( k( rr, cc ) == 0 )
404 psd( rr, cc ) = pow( k( rr, cc ), -1.5 );
408 double dk = k( 0, 1 ) - k( 0, 0 );
412 int rv = psdF.psd( psd, dk, dk );
415 REQUIRE( psdF.rows() == psd.rows() );
416 REQUIRE( psdF.cols() == psd.cols() );
417 REQUIRE( psdF.planes() == 1 );
419 Eigen::Array<double, -1, -1> noise( psdF.rows(), psdF.cols() );
422 normVar.
seed( 0x50D00004 );
426 for(
int k = 0; k < psdFilterTrials; ++k )
428 for(
int cc = 0; cc < psd.cols(); ++cc )
430 for(
int rr = 0; rr < psd.rows(); ++rr )
432 noise( rr, cc ) = normVar;
437 avgRms += noise.square().sum();
440 avgRms = sqrt( avgRms / ( psd.rows() * psd.cols() ) / psdFilterTrials );
442 REQUIRE_THAT( avgRms, Catch::Matchers::WithinAbs( sqrt( 2.2 ), psdFilterTol * sqrt( 2.2 ) ) );
445 GIVEN(
"a rank 3 psd" )
447 WHEN(
"k-alpha=-2.5, f-alph=-2.5, dk Nyquist matched to array size, df Nyquist matched to array size, var=1" )
449 mx::sigproc::psdFilter<double, 3> psdF;
451 Eigen::Array<double, -1, -1> k, psdk;
452 std::vector<double> f, f2s, psd2s;
460 psdk.resize( k.rows(), k.cols() );
461 for(
int cc = 0; cc < psdk.cols(); ++cc )
463 for(
int rr = 0; rr < psdk.rows(); ++rr )
465 if( k( rr, cc ) == 0 )
468 psdk( rr, cc ) = pow( k( rr, cc ), -2.5 );
473 for(
size_t n = 0; n < f.size(); ++n )
474 f[n] = n * 1.0 / 64.;
476 psd2s.resize( f2s.size() );
477 for(
size_t n = 0; n < psd2s.size(); ++n )
478 psd2s[n] = pow( fabs( f2s[n] ), -2.5 );
481 psd.resize( k.rows(), k.cols(), f2s.size() );
483 for(
int cc = 0; cc < psd.cols(); ++cc )
485 for(
int rr = 0; rr < psd.rows(); ++rr )
487 if( k( rr, cc ) == 0 )
488 psd.
pixel( rr, cc ).setZero();
491 double p = psdk( rr, cc );
494 for(
int pp = 0; pp < psd.planes(); ++pp )
495 psd.
image( pp )( rr, cc ) = psd2s[pp];
500 double dk = k( 0, 1 ) - k( 0, 0 );
501 double df = f[1] - f[0];
503 int rv = psdF.psd( psd, dk, dk, df );
506 REQUIRE( psdF.rows() == psd.rows() );
507 REQUIRE( psdF.cols() == psd.cols() );
508 REQUIRE( psdF.planes() == psd.planes() );
513 normVar.
seed( 0x50D00005 );
517 for(
int k = 0; k < psdFilterTrials; ++k )
519 for(
int pp = 0; pp < psd.planes(); ++pp )
521 for(
int cc = 0; cc < psd.cols(); ++cc )
523 for(
int rr = 0; rr < psd.rows(); ++rr )
525 noise.
image( pp )( rr, cc ) = normVar;
531 for(
int pp = 0; pp < noise.planes(); ++pp )
532 avgRms += noise.
image( pp ).square().sum();
535 avgRms = sqrt( avgRms / ( psd.rows() * psd.cols() * psd.planes() ) / psdFilterTrials );
537 REQUIRE_THAT( avgRms, Catch::Matchers::WithinAbs( 1.0, psdFilterTol ) );
539 WHEN(
"k-alpha=-3.5, f-alph=-1.5, dk arb, df arb, var=2" )
541 mx::sigproc::psdFilter<double, 3> psdF;
543 Eigen::Array<double, -1, -1> k, psdk;
544 std::vector<double> f, f2s, psd2s;
552 psdk.resize( k.rows(), k.cols() );
553 for(
int cc = 0; cc < psdk.cols(); ++cc )
555 for(
int rr = 0; rr < psdk.rows(); ++rr )
557 if( k( rr, cc ) == 0 )
560 psdk( rr, cc ) = pow( k( rr, cc ), -3.5 );
565 for(
size_t n = 0; n < f.size(); ++n )
566 f[n] = n * 1.0 / 78.;
568 psd2s.resize( f2s.size() );
569 for(
size_t n = 0; n < psd2s.size(); ++n )
570 psd2s[n] = pow( fabs( f2s[n] ), -1.5 );
573 psd.resize( k.rows(), k.cols(), f2s.size() );
575 for(
int cc = 0; cc < psd.cols(); ++cc )
577 for(
int rr = 0; rr < psd.rows(); ++rr )
579 if( k( rr, cc ) == 0 )
580 psd.
pixel( rr, cc ).setZero();
583 double p = psdk( rr, cc );
586 for(
int pp = 0; pp < psd.planes(); ++pp )
587 psd.
image( pp )( rr, cc ) = psd2s[pp];
592 double dk = k( 0, 1 ) - k( 0, 0 );
593 double df = f[1] - f[0];
595 int rv = psdF.psd( psd, dk, dk, df );
598 REQUIRE( psdF.rows() == psd.rows() );
599 REQUIRE( psdF.cols() == psd.cols() );
600 REQUIRE( psdF.planes() == psd.planes() );
605 normVar.
seed( 0x50D00006 );
609 for(
int k = 0; k < psdFilterTrials; ++k )
611 for(
int pp = 0; pp < psd.planes(); ++pp )
613 for(
int cc = 0; cc < psd.cols(); ++cc )
615 for(
int rr = 0; rr < psd.rows(); ++rr )
617 noise.
image( pp )( rr, cc ) = normVar;
623 for(
int pp = 0; pp < noise.planes(); ++pp )
624 avgRms += noise.
image( pp ).square().sum();
627 avgRms = sqrt( avgRms / ( psd.rows() * psd.cols() * psd.planes() ) / psdFilterTrials );
629 REQUIRE_THAT( avgRms, Catch::Matchers::WithinAbs( sqrt( 2.0 ), psdFilterTol * sqrt( 2 ) ) );