shithub: opus

Download patch

ref: 70162a4f8287ab588a9df10d88107accd3ead249
parent: 9901cb9e822e726defa919ab71d07f90ea8ff093
author: Jean-Marc Valin <[email protected]>
date: Fri Mar 21 08:09:27 EDT 2008

fixed-point: Wrapper for the 32-bit complex FFT used in the MDCT so we can use
the TI dsplib FFT.

--- a/libcelt/Makefile.am
+++ b/libcelt/Makefile.am
@@ -25,7 +25,7 @@
 
 noinst_HEADERS = _kiss_fft_guts.h arch.h bands.h fixed_c5x.h \
 	cwrs.h ecintrin.h entcode.h entdec.h entenc.h fixed_generic.h \
-	kfft_single.h kiss_fft.h kiss_fftr.h laplace.h mdct.h mfrngcod.h \
+	kfft_double.h kfft_single.h kiss_fft.h kiss_fftr.h laplace.h mdct.h mfrngcod.h \
 	mathops.h modes.h os_support.h pgain_table.h pitch.h psy.h \
 	quant_bands.h quant_pitch.h rate.h stack_alloc.h vq.h
 
--- /dev/null
+++ b/libcelt/kfft_double.h
@@ -1,0 +1,67 @@
+/* (C) 2008 Jean-Marc Valin, CSIRO
+*/
+/*
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+   
+   - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+   
+   - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+   
+   - Neither the name of the Xiph.org Foundation nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+   
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef KFFT_DOUBLE_H
+#define KFFT_DOUBLE_H
+
+#ifdef ENABLE_TI_DSPLIB
+
+#include "dsplib.h"
+
+#define cpx32_fft_alloc(length) NULL
+#define cpx32_fft_free(state)
+
+#define cpx32_fft(state, X, Y, nx)\
+    (\
+      cfft_SCALE(X,nx),\
+      cbrev(X,X,nx),\
+    )
+
+#define cpx32_ifft(state, X, Y, nx) \
+    (\
+      cifft_NOSCALE(X,nx),\
+      cbrev(X,Y,nx)\
+    )
+
+
+#else /* ENABLE_TI_DSPLIB */
+
+#include "kiss_fft.h"
+#include "_kiss_fft_guts.h"
+
+#define cpx32_fft_alloc(length) kiss_fft_alloc(length, 0, 0);
+#define cpx32_fft_free(state) kiss_fft_free(state)
+#define cpx32_fft(state, X, Y, nx) kiss_fft(state,X, Y)
+#define cpx32_ifft(state, X, Y, nx) kiss_ifft(state,X, Y)
+
+#endif /* !ENABLE_TI_DSPLIB */
+
+#endif /* KFFT_DOUBLE_H */
--- a/libcelt/mdct.c
+++ b/libcelt/mdct.c
@@ -47,10 +47,9 @@
 #endif
 
 #include "mdct.h"
-#include "kiss_fft.h"
+#include "kfft_double.h"
 #include <math.h>
 #include "os_support.h"
-#include "_kiss_fft_guts.h"
 #include "mathops.h"
 #include "stack_alloc.h"
 
@@ -65,7 +64,7 @@
    l->n = N;
    N2 = N/2;
    N4 = N/4;
-   l->kfft = kiss_fft_alloc(N4, NULL, NULL);
+   l->kfft = cpx32_fft_alloc(N4);
    l->trig = (kiss_twiddle_scalar*)celt_alloc(N2*sizeof(kiss_twiddle_scalar));
    /* We have enough points that sine isn't necessary */
 #if defined(FIXED_POINT)
@@ -84,7 +83,7 @@
 
 void mdct_clear(mdct_lookup *l)
 {
-   kiss_fft_free(l->kfft);
+   cpx32_fft_free(l->kfft);
    celt_free(l->trig);
 }
 
@@ -121,7 +120,7 @@
    }
 
    /* N/4 complex FFT, which should normally down-scale by 4/N (but doesn't now) */
-   kiss_fft(l->kfft, (const kiss_fft_cpx *)out, (kiss_fft_cpx *)f);
+   cpx32_fft(l->kfft, (const kiss_fft_cpx *)out, (kiss_fft_cpx *)f, N4);
 
    /* Post-rotate and apply the scaling if the FFT doesn't to it itself */
    for(i=0;i<N4;i++)
@@ -152,7 +151,7 @@
    }
 
    /* Inverse N/4 complex FFT. This one should *not* downscale even in fixed-point */
-   kiss_ifft(l->kfft, (const kiss_fft_cpx *)out, (kiss_fft_cpx *)f);
+   cpx32_ifft(l->kfft, (const kiss_fft_cpx *)out, (kiss_fft_cpx *)f, N4);
    
    /* Post-rotate */
    for(i=0;i<N4;i++)