示例#1
0
static void ki_work(
             kiss_fft_cpx * Fout,
             const kiss_fft_cpx * f,
             size_t fstride,
             int in_stride,
             const celt_int16 * factors,
             const kiss_fft_state *st,
             int N,
             int m2
            )
{
   const int p=*factors++; /* the radix  */
   const int m=*factors++; /* stage's fft length/p */
   /*printf ("fft %d %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N, m2);*/
   if (m!=1) 
      ki_work( Fout , f, fstride*p, in_stride, factors,st, N*p, m);

   /* Compensate for longer twiddles table (when sharing) */
   if (st->shift>0)
      fstride <<= st->shift;
   switch (p) {
      case 2: ki_bfly2(Fout,fstride,st,m, N, m2); break;
      case 4: ki_bfly4(Fout,fstride,st,m, N, m2); break;
#ifndef RADIX_TWO_ONLY
      case 3: ki_bfly3(Fout,fstride,st,m, N, m2); break;
      case 5: ki_bfly5(Fout,fstride,st,m, N, m2); break;
#endif
   }    
}
示例#2
0
void opus_ifft(const kiss_fft_state *st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout)
{
   int m2, m;
   int p;
   int L;
   int fstride[MAXFACTORS];
   int i;
   int shift;

   /* st->shift can be -1 */
   shift = st->shift>0 ? st->shift : 0;
   celt_assert2 (fin != fout, "In-place FFT not supported");
   /* Bit-reverse the input */
   for (i=0;i<st->nfft;i++)
      fout[st->bitrev[i]] = fin[i];

   fstride[0] = 1;
   L=0;
   do {
      p = st->factors[2*L];
      m = st->factors[2*L+1];
      fstride[L+1] = fstride[L]*p;
      L++;
   } while(m!=1);
   m = st->factors[2*L-1];
   for (i=L-1;i>=0;i--)
   {
      if (i!=0)
         m2 = st->factors[2*i-1];
      else
         m2 = 1;
      switch (st->factors[2*i])
      {
      case 2:
         ki_bfly2(fout,fstride[i]<<shift,st,m, fstride[i], m2);
         break;
      case 4:
         ki_bfly4(fout,fstride[i]<<shift,st,m, fstride[i], m2);
         break;
#ifndef RADIX_TWO_ONLY
      case 3:
         ki_bfly3(fout,fstride[i]<<shift,st,m, fstride[i], m2);
         break;
      case 5:
         ki_bfly5(fout,fstride[i]<<shift,st,m, fstride[i], m2);
         break;
#endif
      }
      m = m2;
   }
}