cwrs.c links to derf's article on pulse vector encoding.
[opus.git] / libcelt / kiss_fftr.c
index 613a262..52c0a38 100644 (file)
@@ -33,7 +33,7 @@ struct kiss_fftr_state{
 #endif    
 };
 
-kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem)
+kiss_fftr_cfg kiss_fftr_alloc(int nfft,void * mem,size_t * lenmem)
 {
     int i;
     kiss_fftr_cfg st = NULL;
@@ -45,7 +45,7 @@ kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem,size_t * lenme
     }
     nfft >>= 1;
 
-    kiss_fft_alloc (nfft, inverse_fft, NULL, &subsize);
+    kiss_fft_alloc (nfft, NULL, &subsize);
     memneeded = sizeof(struct kiss_fftr_state) + subsize + sizeof(kiss_fft_cpx) * ( nfft * 2);
 
     if (lenmem == NULL) {
@@ -61,7 +61,7 @@ kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem,size_t * lenme
     st->substate = (kiss_fft_cfg) (st + 1); /*just beyond kiss_fftr_state struct */
     st->tmpbuf = (kiss_fft_cpx *) (((char *) st->substate) + subsize);
     st->super_twiddles = st->tmpbuf + nfft;
-    kiss_fft_alloc(nfft, inverse_fft, st->substate, &subsize);
+    kiss_fft_alloc(nfft, st->substate, &subsize);
 
 #ifdef FIXED_POINT
     for (i=0;i<nfft;++i) {
@@ -85,14 +85,10 @@ void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_scalar
    kiss_fft_cpx f2k,tdc;
    celt_word32_t f1kr, f1ki, twr, twi;
 
-   if ( st->substate->inverse) {
-      celt_fatal("kiss fft usage error: improper alloc\n");
-   }
-
    ncfft = st->substate->nfft;
 
    /*perform the parallel fft of two real signals packed in real,imag*/
-   kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf );
+   kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, (kiss_fft_cpx *)freqdata );
     /* The real part of the DC element of the frequency spectrum in st->tmpbuf
    * contains the sum of the even-numbered elements of the input time sequence
    * The imag part is the sum of the odd-numbered elements
@@ -103,35 +99,35 @@ void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_scalar
    *      yielding Nyquist bin of input time sequence
     */
  
-   tdc.r = st->tmpbuf[0].r;
-   tdc.i = st->tmpbuf[0].i;
+   tdc.r = freqdata[0];
+   tdc.i = freqdata[1];
    C_FIXDIV(tdc,2);
    CHECK_OVERFLOW_OP(tdc.r ,+, tdc.i);
    CHECK_OVERFLOW_OP(tdc.r ,-, tdc.i);
    freqdata[0] = tdc.r + tdc.i;
-   freqdata[2*ncfft-1] = tdc.r - tdc.i;
+   freqdata[1] = tdc.r - tdc.i;
 
    for ( k=1;k <= ncfft/2 ; ++k )
    {
-      f2k.r = SHR32(SUB32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),1);
-      f2k.i = PSHR32(ADD32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),1);
+      f2k.r = SHR32(SUB32(EXTEND32(freqdata[2*k]), EXTEND32(freqdata[2*(ncfft-k)])),1);
+      f2k.i = PSHR32(ADD32(EXTEND32(freqdata[2*k+1]), EXTEND32(freqdata[2*(ncfft-k)+1])),1);
       
-      f1kr = SHL32(ADD32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),13);
-      f1ki = SHL32(SUB32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),13);
+      f1kr = SHL32(ADD32(EXTEND32(freqdata[2*k]), EXTEND32(freqdata[2*(ncfft-k)])),13);
+      f1ki = SHL32(SUB32(EXTEND32(freqdata[2*k+1]), EXTEND32(freqdata[2*(ncfft-k)+1])),13);
       
       twr = SHR32(ADD32(MULT16_16(f2k.r,st->super_twiddles[k].r),MULT16_16(f2k.i,st->super_twiddles[k].i)), 1);
       twi = SHR32(SUB32(MULT16_16(f2k.i,st->super_twiddles[k].r),MULT16_16(f2k.r,st->super_twiddles[k].i)), 1);
       
 #ifdef FIXED_POINT
-      freqdata[2*k-1] = PSHR32(f1kr + twr, 15);
-      freqdata[2*k] = PSHR32(f1ki + twi, 15);
-      freqdata[2*(ncfft-k)-1] = PSHR32(f1kr - twr, 15);
-      freqdata[2*(ncfft-k)] = PSHR32(twi - f1ki, 15);
+      freqdata[2*k] = PSHR32(f1kr + twr, 15);
+      freqdata[2*k+1] = PSHR32(f1ki + twi, 15);
+      freqdata[2*(ncfft-k)] = PSHR32(f1kr - twr, 15);
+      freqdata[2*(ncfft-k)+1] = PSHR32(twi - f1ki, 15);
 #else
-      freqdata[2*k-1] = .5f*(f1kr + twr);
-      freqdata[2*k] = .5f*(f1ki + twi);
-      freqdata[2*(ncfft-k)-1] = .5f*(f1kr - twr);
-      freqdata[2*(ncfft-k)] = .5f*(twi - f1ki);
+      freqdata[2*k] = .5f*(f1kr + twr);
+      freqdata[2*k+1] = .5f*(f1ki + twi);
+      freqdata[2*(ncfft-k)] = .5f*(f1kr - twr);
+      freqdata[2*(ncfft-k)+1] = .5f*(twi - f1ki);
       
 #endif
    }
@@ -142,21 +138,17 @@ void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_scalar *freqdata,kiss_fft_scalar
    /* input buffer timedata is stored row-wise */
    int k, ncfft;
 
-   if (st->substate->inverse == 0) {
-      celt_fatal ("kiss fft usage error: improper alloc\n");
-   }
-
    ncfft = st->substate->nfft;
 
-   st->tmpbuf[0].r = freqdata[0] + freqdata[2*ncfft-1];
-   st->tmpbuf[0].i = freqdata[0] - freqdata[2*ncfft-1];
+   st->tmpbuf[0].r = freqdata[0] + freqdata[1];
+   st->tmpbuf[0].i = freqdata[0] - freqdata[1];
 
    for (k = 1; k <= ncfft / 2; ++k) {
       kiss_fft_cpx fk, fnkc, fek, fok, tmp;
-      fk.r = freqdata[2*k-1];
-      fk.i = freqdata[2*k];
-      fnkc.r = freqdata[2*(ncfft - k)-1];
-      fnkc.i = -freqdata[2*(ncfft - k)];
+      fk.r = freqdata[2*k];
+      fk.i = freqdata[2*k+1];
+      fnkc.r = freqdata[2*(ncfft - k)];
+      fnkc.i = -freqdata[2*(ncfft - k)+1];
 
       C_ADD (fek, fk, fnkc);
       C_SUB (tmp, fk, fnkc);
@@ -169,5 +161,5 @@ void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_scalar *freqdata,kiss_fft_scalar
       st->tmpbuf[ncfft - k].i *= -1;
 #endif
    }
-   kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata);
+   kiss_ifft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata);
 }