36 const string myname =
"test_DuneFFT: ";
38 cout << myname <<
"NDEBUG must be off." <<
endl;
41 string line =
"-----------------------------";
45 cout << myname <<
" Global norm: " << ignorm <<
endl;
46 cout << myname <<
" Term norm: " << itnorm <<
endl;
48 cout << myname << line <<
endl;
49 cout << myname <<
"Create data." <<
endl;
50 vector<float> sams = { 3.0, 6.0, 16.1, 28.6, 30.2, 27.7, 16.3, 9.6, 4.2, -1.0,
51 -2.3, -4.2, -9.2, -18.6, -21.9, -29.0, -24.3, -14.2, -5.0, -3.0};
52 if ( len > 0 ) sams.resize(len, 0.0);
54 assert( sams.
size() == nsam );
55 cout << myname <<
"Sample length: " << nsam <<
endl;
57 for (
float sam : sams ) samsum +=
sam;
58 cout << myname <<
"Sample mean: " << samsum/nsam <<
endl;
59 Index namp = (nsam+2)/2;
60 Index npha = (nsam+1)/2;
61 cout << myname <<
" # samples: " << nsam <<
endl;
62 cout << myname <<
"Expected amp size: " << namp <<
endl;
63 cout << myname <<
"Expected pha size: " << npha <<
endl;
65 cout << myname << line <<
endl;
66 cout << myname <<
"Create empty DFT." <<
endl;
68 assert( dft.size() == 0 );
70 cout << myname << line <<
endl;
71 cout << myname <<
"Transform forward." <<
endl;
73 assert( sams.size() == nsam );
74 cout << myname <<
"DFT size: " << dft.size() <<
endl;
75 assert( dft.size() == nsam );
76 assert( dft.nCompact() == namp );
77 assert( dft.nAmplitude() == namp );
78 assert( dft.nPhase() == npha );
79 cout <<
"Frequency components:" <<
endl;
80 for (
Index ifrq=0; ifrq<namp; ++ifrq ) {
81 cout << myname <<
setw(4) << ifrq <<
": " << dft.amplitude(ifrq);
82 if ( ifrq < npha ) cout <<
" @ " << dft.phase(ifrq);
86 cout << myname << line <<
endl;
87 cout << myname <<
"Check power." <<
endl;
90 float pwr2 = dft.power();
93 for (
Index ifrq=0; ifrq<nsam; ++ifrq ) {
94 float amp = dft.amplitude(ifrq);
95 float xre = dft.real(ifrq);
96 float xim = dft.imag(ifrq);
97 if ( !dft.normalization().isPower() || ifrq < dft.nCompact() ) {
99 pwr4 += xre*xre + xim*xim;
103 if ( dft.normalization().isStandard() ) pfac = 1.0/nsam;
104 if ( dft.normalization().isBin() ) pfac = nsam;
107 cout << myname <<
"Tick power: " << pwr1 <<
endl;
108 cout << myname <<
" DFT power: " << pwr2 <<
endl;
109 cout << myname <<
" Amp power: " << pwr3 <<
endl;
110 cout << myname <<
" ReI power: " << pwr4 <<
endl;
111 assert( fabs(pwr2 - pwr1) < 1.
e-5*pwr1 );
113 cout << myname << line <<
endl;
114 cout << myname <<
"Call inverse." <<
endl;
118 cout << myname <<
"FFT invert returned " << rstat <<
endl;
122 assert( sams2.size() == nsam );
123 for (
Index isam=0; isam<nsam; ++isam ) {
124 cout <<
setw(4) << isam <<
":" <<
setw(10) << fixed << sams[isam]
125 <<
" ?= " <<
setw(10) << fixed << sams2[isam] <<
endl;
126 assert( fabs(sams2[isam] - sams[isam]) < 1.
e-4 );
129 cout << myname << line <<
endl;
130 cout << myname <<
"Done." <<
endl;
static int fftForward(Index ntick, const float *psam, DFT &dft, Index logLevel=0)
auto norm(Vector const &v)
Return norm of the specified vector.
Q_EXPORT QTSManip setw(int w)
static int fftInverse(const DFT &dft, FloatVector &sams, Index logLevel=0)
void line(double t, double *p, double &x, double &y, double &z)
Dft::FloatVector FloatVector
QTextStream & endl(QTextStream &s)