124 std::memcpy(&(*(mFourierCoefficients.mFourierCoefficients.begin() + mFourierCoefficients.getIndex(interval, 0))), mCoefficients[thread], mFourierCoefficients.getNCoefficientsPerTF() *
sizeof(
float));
130 if (this->mRangeIDC % 2) {
131 LOGP(info,
"number of specified fourier coefficients is {}, but should be an even number! FFTW3 method is used instead!", mFourierCoefficients.getNCoefficientsPerTF());
132 return inverseFourierTransformFFTW3();
136 std::vector<std::vector<float>> inverse(this->getNIntervals());
140 for (
unsigned int interval = 0; interval < this->getNIntervals(); ++interval) {
141 inverse[interval].resize(this->mRangeIDC);
143 const float term0 = factor *
index;
144 unsigned int coeffTmp = 0;
146 for (
unsigned int coeff = 0; coeff < this->mRangeIDC; ++coeff) {
147 const unsigned int indexDataReal = mFourierCoefficients.getIndex(interval, 2 * coeffTmp);
148 const unsigned int indexDataImag = indexDataReal + 1;
149 const float term = term0 * coeff;
150 inverse[interval][
index] += mFourierCoefficients(indexDataReal) * std::cos(term) - fac * mFourierCoefficients(indexDataImag) * std::sin(term);
151 if (coeff < getNMaxCoefficients() - 1) {
167 std::vector<std::vector<float>> inverse(this->getNIntervals());
171 for (
unsigned int interval = 0;
interval < this->getNIntervals(); ++
interval) {
172 inverse[
interval].resize(this->mRangeIDC);
173 std::vector<std::array<float, 2>> val1DIDCs;
174 val1DIDCs.reserve(this->mRangeIDC);
176 const unsigned int indexDataReal = mFourierCoefficients.getIndex(interval, 2 *
index);
177 const unsigned int indexDataImag = indexDataReal + 1;
178 val1DIDCs.emplace_back(std::array<float, 2>{mFourierCoefficients(indexDataReal), mFourierCoefficients(indexDataImag)});
180 const fftwf_plan fftwPlan = fftwf_plan_dft_c2r_1d(this->mRangeIDC,
reinterpret_cast<fftwf_complex*
>(val1DIDCs.data()), inverse[interval].data(), FFTW_ESTIMATE);
181 fftwf_execute(fftwPlan);
182 fftwf_destroy_plan(fftwPlan);
190 TFile fOut(outFileName,
"RECREATE");
191 fOut.WriteObject(
this, outName);
200 const std::vector<unsigned int> offsetIndex = this->getLastIntervals();
201 const auto idcOneExpanded = this->getExpandedIDCOne();
202 const auto inverseFourier = inverseFourierTransformNaive();
203 const auto inverseFourierFFTW3 = inverseFourierTransformFFTW3();
205 for (
unsigned int interval = 0; interval < this->getNIntervals(); ++interval) {
206 std::vector<float> oneDIDCInverse = inverseFourier[interval];
207 std::vector<float> oneDIDCInverseFFTW3 = inverseFourierFFTW3[interval];
210 std::vector<float> oneDIDC;
211 oneDIDC.reserve(this->mRangeIDC);
213 oneDIDC.emplace_back(idcOneExpanded[
index + offsetIndex[interval]]);
216 for (
unsigned int coeff = 0; coeff < mFourierCoefficients.getNCoefficientsPerTF(); ++coeff) {
217 float coefficient = mFourierCoefficients(mFourierCoefficients.getIndex(interval, coeff));
220 <<
"interval=" << interval
221 <<
"icoefficient=" << coeff
222 <<
"coefficient=" << coefficient
223 <<
"1DIDC.=" << oneDIDC
224 <<
"1DIDCiDFT.=" << oneDIDCInverse
225 <<
"1DIDCiDFTFFTW3.=" << oneDIDCInverseFFTW3
234 float* val1DIDCs = fftwf_alloc_real(this->mRangeIDC);
235 fftwf_complex* coefficients = fftwf_alloc_complex(getNMaxCoefficients());
236 fftwf_plan fftwPlan = fftwf_plan_dft_r2c_1d(this->mRangeIDC, val1DIDCs, coefficients, FFTW_ESTIMATE);
237 char* splan = fftwf_sprint_plan(fftwPlan);
239 LOGP(info,
"========= printing FFTW plan ========= \n {}", splan);
242 double fusedMultAdd = 0;
243 fftwf_flops(fftwPlan, &add, &mul, &fusedMultAdd);
244 LOGP(info,
"additions: {} multiplications: {} fused multiply-add: {} sum: {}", add, mul, fusedMultAdd, add + mul + fusedMultAdd);
248 fftwf_free(coefficients);
249 fftwf_free(val1DIDCs);
250 fftwf_destroy_plan(fftwPlan);
256 std::vector<std::pair<float, float>> freq;
258 const int nFreqPerInterval = nCoeff / 2;
260 freq.reserve(nTFs * nFreqPerInterval);
261 for (
int iTF = 0; iTF < nTFs; ++iTF) {
262 for (
int iFreq = 0; iFreq < nFreqPerInterval; ++iFreq) {
263 const int realInd = nCoeff * iTF + iFreq * 2;
264 const int compInd = realInd + 1;
265 const float magnitude = std::sqrt(coeff(realInd) * coeff(realInd) + coeff(compInd) * coeff(compInd));
266 const float freqTmp = iFreq * samplingFrequency / nCoeff;
267 freq.emplace_back(freqTmp, magnitude);