1 #ifndef KISSFFT_I32_CLASS_HH 2 #define KISSFFT_I32_CLASS_HH 12 template <
typename DType>
37 : _scale_factor(
scalar_type(scale_factor)), _nfft(nfft), _inverse(inverse)
40 _twiddles.resize(_nfft);
41 const double phinc = (_inverse ? 2 : -2) * acos(-1.0) / _nfft;
44 _twiddles[i] = scale_factor *
exp(complex<double>(0, i * phinc));
69 _stageRadix.push_back(p);
70 _stageRemainder.push_back(n);
95 cpx_type *
const Fout_end = FDst + p * m;
102 FSrc += fstride * in_stride;
103 }
while (++FDst != Fout_end);
113 transform(FSrc, FDst, stage + 1, fstride * p, in_stride);
114 FSrc += fstride * in_stride;
115 }
while ((FDst += m) != Fout_end);
147 const cpx_type t = (Fout[m + k] * _twiddles[k * fstride]) / _scale_factor;
148 Fout[m + k] = Fout[k] - t;
159 const cpx_type epi3 = _twiddles[fstride * m];
161 tw1 = tw2 = &_twiddles[0];
165 scratch[1] = (Fout[m] * *tw1) / _scale_factor;
166 scratch[2] = (Fout[m2] * *tw2) / _scale_factor;
168 scratch[3] = scratch[1] + scratch[2];
169 scratch[0] = scratch[1] - scratch[2];
173 Fout[m] = Fout[0] - (scratch[3] / 2);
174 scratch[0] *= epi3.imag();
175 scratch[0] /= _scale_factor;
177 Fout[0] += scratch[3];
189 const scalar_type negative_if_inverse = _inverse ? -1 : +1;
193 scratch[0] = (Fout[k + m] * _twiddles[k * fstride]) / _scale_factor;
194 scratch[1] = (Fout[k + 2 * m] * _twiddles[k * fstride * 2]) / _scale_factor;
195 scratch[2] = (Fout[k + 3 * m] * _twiddles[k * fstride * 3]) / _scale_factor;
196 scratch[5] = Fout[k] - scratch[1];
198 Fout[k] += scratch[1];
199 scratch[3] = scratch[0] + scratch[2];
200 scratch[4] = scratch[0] - scratch[2];
201 scratch[4] =
cpx_type(scratch[4].
imag() * negative_if_inverse,
202 -scratch[4].
real() * negative_if_inverse);
204 Fout[k + 2 * m] = Fout[k] - scratch[3];
205 Fout[k] += scratch[3];
206 Fout[k + m] = scratch[5] + scratch[4];
207 Fout[k + 3 * m] = scratch[5] - scratch[4];
213 cpx_type *Fout0, *Fout1, *Fout2, *Fout3, *Fout4;
215 const cpx_type ya = _twiddles[fstride * m];
216 const cpx_type yb = _twiddles[fstride * 2 * m];
220 Fout2 = Fout0 + 2 * m;
221 Fout3 = Fout0 + 3 * m;
222 Fout4 = Fout0 + 4 * m;
228 scratch[1] = (*Fout1 * _twiddles[u * fstride]) / _scale_factor;
229 scratch[2] = (*Fout2 * _twiddles[2 * u * fstride]) / _scale_factor;
230 scratch[3] = (*Fout3 * _twiddles[3 * u * fstride]) / _scale_factor;
231 scratch[4] = (*Fout4 * _twiddles[4 * u * fstride]) / _scale_factor;
233 scratch[7] = scratch[1] + scratch[4];
234 scratch[10] = scratch[1] - scratch[4];
235 scratch[8] = scratch[2] + scratch[3];
236 scratch[9] = scratch[2] - scratch[3];
238 *Fout0 += scratch[7];
239 *Fout0 += scratch[8];
241 scratch[5] = scratch[0] + (
cpx_type(
242 scratch[7].
real() * ya.real() + scratch[8].real() * yb.real(),
243 scratch[7].imag() * ya.real() + scratch[8].imag() * yb.real() ) / _scale_factor);
246 scratch[10].
imag() * ya.imag() + scratch[9].imag() * yb.imag(),
247 -scratch[10].real() * ya.imag() - scratch[9].real() * yb.imag() ) / _scale_factor;
249 *Fout1 = scratch[5] - scratch[6];
250 *Fout4 = scratch[5] + scratch[6];
252 scratch[11] = scratch[0] + (
cpx_type(
253 scratch[7].
real() * yb.real() + scratch[8].real() * ya.real(),
254 scratch[7].imag() * yb.real() + scratch[8].imag() * ya.real() ) / _scale_factor);
257 -scratch[10].
imag() * yb.imag() + scratch[9].imag() * ya.imag(),
258 scratch[10].real() * yb.imag() - scratch[9].real() * ya.imag() ) / _scale_factor;
260 *Fout2 = scratch[11] + scratch[12];
261 *Fout3 = scratch[11] - scratch[12];
274 const cpx_type *twiddles = &_twiddles[0];
282 scratchbuf[q1] = Fout[k];
290 Fout[k] = scratchbuf[0];
293 twidx += fstride * k;
296 Fout[k] += (scratchbuf[q] * twiddles[twidx]) / _scale_factor;
void kf_bfly4(cpx_type *const Fout, const std::size_t fstride, const std::size_t m) const
span_CONFIG_SIZE_TYPE size_t
void kf_bfly5(cpx_type *const Fout, const std::size_t fstride, const std::size_t m) const
std::vector< std::size_t > _stageRemainder
kissfft_i32(const std::size_t nfft, const bool inverse, const double scale_factor=1024.0)
static void kf_bfly2(kiss_fft_cpx *Fout, const size_t fstride, const kiss_fft_cfg st, int m)
void kf_bfly2(cpx_type *const Fout, const size_t fstride, const std::size_t m) const
scalar_type _scale_factor
void kf_bfly3(cpx_type *Fout, const std::size_t fstride, const std::size_t m) const
void transform(const cpx_type *FSrc, cpx_type *FDst, const std::size_t stage=0, const std::size_t fstride=1, const std::size_t in_stride=1) const
void kf_bfly_generic(cpx_type *const Fout, const size_t fstride, const std::size_t m, const std::size_t p) const
std::vector< cpx_type > _twiddles
static void kf_bfly4(kiss_fft_cpx *Fout, const size_t fstride, const kiss_fft_cfg st, const size_t m)
std::vector< std::size_t > _stageRadix
complex< int32_t > cpx_type
static void kf_bfly5(kiss_fft_cpx *Fout, const size_t fstride, const kiss_fft_cfg st, int m)
static void kf_bfly3(kiss_fft_cpx *Fout, const size_t fstride, const kiss_fft_cfg st, size_t m)
static void kf_bfly_generic(kiss_fft_cpx *Fout, const size_t fstride, const kiss_fft_cfg st, int m, int p)