39 C_SUB( *Fout2 , *Fout ,
t );
60 tw3 = tw2 = tw1 = st->twiddles;
65 C_MUL(scratch[0],Fout[m] , *tw1 );
66 C_MUL(scratch[1],Fout[m2] , *tw2 );
67 C_MUL(scratch[2],Fout[m3] , *tw3 );
69 C_SUB( scratch[5] , *Fout, scratch[1] );
71 C_ADD( scratch[3] , scratch[0] , scratch[2] );
72 C_SUB( scratch[4] , scratch[0] , scratch[2] );
73 C_SUB( Fout[m2], *Fout, scratch[3] );
80 Fout[m].r = scratch[5].
r - scratch[4].
i;
81 Fout[m].i = scratch[5].
i + scratch[4].
r;
82 Fout[m3].r = scratch[5].
r + scratch[4].
i;
83 Fout[m3].i = scratch[5].
i - scratch[4].
r;
85 Fout[m].r = scratch[5].
r + scratch[4].
i;
86 Fout[m].i = scratch[5].
i - scratch[4].
r;
87 Fout[m3].r = scratch[5].
r - scratch[4].
i;
88 Fout[m3].i = scratch[5].
i + scratch[4].
r;
102 const size_t m2 = 2*m;
106 epi3 = st->twiddles[fstride*m];
108 tw1=tw2=st->twiddles;
113 C_MUL(scratch[1],Fout[m] , *tw1);
114 C_MUL(scratch[2],Fout[m2] , *tw2);
116 C_ADD(scratch[3],scratch[1],scratch[2]);
117 C_SUB(scratch[0],scratch[1],scratch[2]);
121 Fout[m].
r = Fout->r -
HALF_OF(scratch[3].r);
122 Fout[m].i = Fout->i -
HALF_OF(scratch[3].i);
128 Fout[m2].r = Fout[m].r + scratch[0].
i;
129 Fout[m2].i = Fout[m].i - scratch[0].
r;
131 Fout[m].r -= scratch[0].
i;
132 Fout[m].i += scratch[0].
r;
140 const size_t fstride,
151 ya = twiddles[fstride*m];
152 yb = twiddles[fstride*2*m];
161 for ( u=0; u<m; ++u ) {
165 C_MUL(scratch[1] ,*Fout1, tw[u*fstride]);
166 C_MUL(scratch[2] ,*Fout2, tw[2*u*fstride]);
167 C_MUL(scratch[3] ,*Fout3, tw[3*u*fstride]);
168 C_MUL(scratch[4] ,*Fout4, tw[4*u*fstride]);
170 C_ADD( scratch[7],scratch[1],scratch[4]);
171 C_SUB( scratch[10],scratch[1],scratch[4]);
172 C_ADD( scratch[8],scratch[2],scratch[3]);
173 C_SUB( scratch[9],scratch[2],scratch[3]);
175 Fout0->
r += scratch[7].
r + scratch[8].
r;
176 Fout0->
i += scratch[7].
i + scratch[8].
i;
178 scratch[5].
r = scratch[0].
r +
S_MUL(scratch[7].r,ya.
r) +
S_MUL(scratch[8].r,yb.
r);
179 scratch[5].
i = scratch[0].
i +
S_MUL(scratch[7].i,ya.
r) +
S_MUL(scratch[8].i,yb.
r);
181 scratch[6].
r =
S_MUL(scratch[10].i,ya.
i) +
S_MUL(scratch[9].i,yb.
i);
182 scratch[6].
i = -
S_MUL(scratch[10].r,ya.
i) -
S_MUL(scratch[9].r,yb.
i);
184 C_SUB(*Fout1,scratch[5],scratch[6]);
185 C_ADD(*Fout4,scratch[5],scratch[6]);
187 scratch[11].
r = scratch[0].
r +
S_MUL(scratch[7].r,yb.
r) +
S_MUL(scratch[8].r,ya.
r);
188 scratch[11].
i = scratch[0].
i +
S_MUL(scratch[7].i,yb.
r) +
S_MUL(scratch[8].i,ya.
r);
189 scratch[12].
r = -
S_MUL(scratch[10].i,yb.
i) +
S_MUL(scratch[9].i,ya.
i);
190 scratch[12].
i =
S_MUL(scratch[10].r,yb.
i) -
S_MUL(scratch[9].r,ya.
i);
192 C_ADD(*Fout2,scratch[11],scratch[12]);
193 C_SUB(*Fout3,scratch[11],scratch[12]);
195 ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4;
202 const size_t fstride,
211 int Norig = st->nfft;
215 for ( u=0; u<m; ++u ) {
217 for ( q1=0 ; q1<p ; ++q1 ) {
218 scratch[q1] = Fout[ k ];
224 for ( q1=0 ; q1<p ; ++q1 ) {
226 Fout[ k ] = scratch[0];
228 twidx += fstride * k;
229 if (twidx>=Norig) twidx-=Norig;
230 C_MUL(
t,scratch[q] , twiddles[twidx] );
243 const size_t fstride,
250 const int p=*factors++;
251 const int m=*factors++;
257 if (fstride==1 && p<=5)
262# pragma omp parallel for
264 kf_work( Fout +k*m, f+ fstride*in_stride*k,fstride*p,in_stride,factors,st);
268 case 2:
kf_bfly2(Fout,fstride,st,m);
break;
269 case 3:
kf_bfly3(Fout,fstride,st,m);
break;
270 case 4:
kf_bfly4(Fout,fstride,st,m);
break;
271 case 5:
kf_bfly5(Fout,fstride,st,m);
break;
281 f += fstride*in_stride;
282 }
while(++Fout != Fout_end );
294 kf_work( Fout , f, fstride*p, in_stride, factors,st);
295 f += fstride*in_stride;
296 }
while( (Fout += m) != Fout_end );
303 case 2:
kf_bfly2(Fout,fstride,st,m);
break;
304 case 3:
kf_bfly3(Fout,fstride,st,m);
break;
305 case 4:
kf_bfly4(Fout,fstride,st,m);
break;
306 case 5:
kf_bfly5(Fout,fstride,st,m);
break;
326 case 4: p = 2;
break;
327 case 2: p = 3;
break;
328 default: p += 2;
break;
369 if ( lenmem==
NULL ) {
372 if (mem !=
NULL && *lenmem >= memneeded)
381 for (i=0;i<
nfft;++i) {
382 const double pi=3.141592653589793238462643383279502884197169399375105820974944;
383 double phase = -2*pi*i /
nfft;
401 kf_work(tmpbuf,fin,1,in_stride, st->factors,st);
405 kf_work( fout, fin, 1, in_stride, st->factors,st );
424 while ( (m%2) == 0 ) m/=2;
425 while ( (m%3) == 0 ) m/=3;
426 while ( (m%5) == 0 ) m/=5;
#define C_MULBYSCALAR(c, s)
#define KISS_FFT_TMP_FREE(ptr)
#define KISS_FFT_TMP_ALLOC(nbytes)
#define kf_cexp(x, phase)
int factors[2 *MAXFACTORS]
void kiss_fft(kiss_fft_cfg cfg, const kiss_fft_cpx *fin, kiss_fft_cpx *fout) FL_NOEXCEPT
void kiss_fft_cleanup(void) FL_NOEXCEPT
static void kf_bfly4(kiss_fft_cpx *Fout, const size_t fstride, const kiss_fft_cfg st, const size_t m) FL_NOEXCEPT
static void kf_bfly5(kiss_fft_cpx *Fout, const size_t fstride, const kiss_fft_cfg st, int m) FL_NOEXCEPT
kiss_fft_cfg kiss_fft_alloc(int nfft, int inverse_fft, void *mem, size_t *lenmem) FL_NOEXCEPT
void kiss_fft_stride(kiss_fft_cfg st, const kiss_fft_cpx *fin, kiss_fft_cpx *fout, int in_stride) FL_NOEXCEPT
static void kf_bfly3(kiss_fft_cpx *Fout, const size_t fstride, const kiss_fft_cfg st, size_t m) FL_NOEXCEPT
int kiss_fft_next_fast_size(int n) FL_NOEXCEPT
static void kf_bfly2(kiss_fft_cpx *Fout, const size_t fstride, const kiss_fft_cfg st, int m) FL_NOEXCEPT
static void kf_factor(int n, int *facbuf) FL_NOEXCEPT
static void kf_work(kiss_fft_cpx *Fout, const kiss_fft_cpx *f, const size_t fstride, int in_stride, int *factors, const kiss_fft_cfg st) FL_NOEXCEPT
static void kf_bfly_generic(kiss_fft_cpx *Fout, const size_t fstride, const kiss_fft_cfg st, int m, int p) FL_NOEXCEPT
struct kiss_fft_state * kiss_fft_cfg
#define KISS_FFT_MALLOC(nbytes)
void * memcpy(void *dest, const void *src, size_t n) FL_NOEXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type sqrt(T x) FL_NOEXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type floor(T x) FL_NOEXCEPT