125 fftwf_execute_dft_r2c(mFFTWPlan, mVal1DIDCs[thread], mCoefficients[thread]);
126 std::memcpy(&(*(mFourierCoefficients.mFourierCoefficients.begin() + mFourierCoefficients.getIndex(interval, 0))), mCoefficients[thread], mFourierCoefficients.getNCoefficientsPerTF() *
sizeof(
float));
132 if (this->mRangeIDC % 2) {
133 LOGP(info,
"number of specified fourier coefficients is {}, but should be an even number! FFTW3 method is used instead!", mFourierCoefficients.getNCoefficientsPerTF());
134 return inverseFourierTransformFFTW3();
138 std::vector<std::vector<float>> inverse(this->getNIntervals());
142 for (
unsigned int interval = 0; interval < this->getNIntervals(); ++interval) {
143 inverse[interval].resize(this->mRangeIDC);
145 const float term0 = factor *
index;
146 unsigned int coeffTmp = 0;
148 for (
unsigned int coeff = 0; coeff < this->mRangeIDC; ++coeff) {
149 const unsigned int indexDataReal = mFourierCoefficients.getIndex(interval, 2 * coeffTmp);
150 const unsigned int indexDataImag = indexDataReal + 1;
151 const float term = term0 * coeff;
152 inverse[interval][
index] += mFourierCoefficients(indexDataReal) * std::cos(term) - fac * mFourierCoefficients(indexDataImag) * std::sin(term);
153 if (coeff < getNMaxCoefficients() - 1) {
169 std::vector<std::vector<float>> inverse(this->getNIntervals());
173 for (
unsigned int interval = 0;
interval < this->getNIntervals(); ++
interval) {
174 inverse[
interval].resize(this->mRangeIDC);
175 std::vector<std::array<float, 2>> val1DIDCs;
176 val1DIDCs.reserve(this->mRangeIDC);
178 const unsigned int indexDataReal = mFourierCoefficients.getIndex(interval, 2 *
index);
179 const unsigned int indexDataImag = indexDataReal + 1;
180 val1DIDCs.emplace_back(std::array<float, 2>{mFourierCoefficients(indexDataReal), mFourierCoefficients(indexDataImag)});
182 const fftwf_plan fftwPlan = fftwf_plan_dft_c2r_1d(this->mRangeIDC,
reinterpret_cast<fftwf_complex*
>(val1DIDCs.data()), inverse[interval].data(), FFTW_ESTIMATE);
183 fftwf_execute(fftwPlan);
184 fftwf_destroy_plan(fftwPlan);
192 TFile fOut(outFileName,
"RECREATE");
193 fOut.WriteObject(
this, outName);
202 const std::vector<unsigned int> offsetIndex = this->getLastIntervals();
203 const auto idcOneExpanded = this->getExpandedIDCOne();
204 const auto inverseFourier = inverseFourierTransformNaive();
205 const auto inverseFourierFFTW3 = inverseFourierTransformFFTW3();
207 for (
unsigned int interval = 0; interval < this->getNIntervals(); ++interval) {
208 std::vector<float> oneDIDCInverse = inverseFourier[interval];
209 std::vector<float> oneDIDCInverseFFTW3 = inverseFourierFFTW3[interval];
212 std::vector<float> oneDIDC;
213 oneDIDC.reserve(this->mRangeIDC);
215 oneDIDC.emplace_back(idcOneExpanded[
index + offsetIndex[interval]]);
218 for (
unsigned int coeff = 0; coeff < mFourierCoefficients.getNCoefficientsPerTF(); ++coeff) {
219 float coefficient = mFourierCoefficients(mFourierCoefficients.getIndex(interval, coeff));
222 <<
"interval=" << interval
223 <<
"icoefficient=" << coeff
224 <<
"coefficient=" << coefficient
225 <<
"1DIDC.=" << oneDIDC
226 <<
"1DIDCiDFT.=" << oneDIDCInverse
227 <<
"1DIDCiDFTFFTW3.=" << oneDIDCInverseFFTW3
236 float* val1DIDCs = fftwf_alloc_real(this->mRangeIDC);
237 fftwf_complex* coefficients = fftwf_alloc_complex(getNMaxCoefficients());
238 fftwf_plan fftwPlan = fftwf_plan_dft_r2c_1d(this->mRangeIDC, val1DIDCs, coefficients, FFTW_ESTIMATE);
239 char* splan = fftwf_sprint_plan(fftwPlan);
241 LOGP(info,
"========= printing FFTW plan ========= \n {}", splan);
244 double fusedMultAdd = 0;
245 fftwf_flops(fftwPlan, &add, &mul, &fusedMultAdd);
246 LOGP(info,
"additions: {} multiplications: {} fused multiply-add: {} sum: {}", add, mul, fusedMultAdd, add + mul + fusedMultAdd);
250 fftwf_free(coefficients);
251 fftwf_free(val1DIDCs);
252 fftwf_destroy_plan(fftwPlan);
258 std::vector<std::pair<float, float>> freq;
260 const int nFreqPerInterval = nCoeff / 2;
262 freq.reserve(nTFs * nFreqPerInterval);
263 for (
int iTF = 0; iTF < nTFs; ++iTF) {
264 for (
int iFreq = 0; iFreq < nFreqPerInterval; ++iFreq) {
265 const int realInd = nCoeff * iTF + iFreq * 2;
266 const int compInd = realInd + 1;
267 const float magnitude = std::sqrt(coeff(realInd) * coeff(realInd) + coeff(compInd) * coeff(compInd));
268 const float freqTmp = iFreq * samplingFrequency / nCoeff;
269 freq.emplace_back(freqTmp, magnitude);