Blame gst-libs/gst/fft/_kiss_fft_guts_f64.h

Packit 0652a1
/*
Packit 0652a1
Copyright (c) 2003-2004, Mark Borgerding
Packit 0652a1
Packit 0652a1
All rights reserved.
Packit 0652a1
Packit 0652a1
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Packit 0652a1
Packit 0652a1
    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Packit 0652a1
    * 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.
Packit 0652a1
    * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
Packit 0652a1
Packit 0652a1
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 COPYRIGHT OWNER 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.
Packit 0652a1
*/
Packit 0652a1
Packit 0652a1
/* kiss_fft.h
Packit 0652a1
   defines kiss_fft_f64_scalar as either short or a float type
Packit 0652a1
   and defines
Packit 0652a1
   typedef struct { kiss_fft_f64_scalar r; kiss_fft_f64_scalar i; }kiss_fft_f64_cpx; */
Packit 0652a1
#include "kiss_fft_f64.h"
Packit 0652a1
#include <limits.h>
Packit 0652a1
Packit 0652a1
/* The 2*sizeof(size_t) alignment here is borrowed from
Packit 0652a1
 * GNU libc, so it should be good most everywhere.
Packit 0652a1
 * It is more conservative than is needed on some 64-bit
Packit 0652a1
 * platforms, but ia64 does require a 16-byte alignment.
Packit 0652a1
 * The SIMD extensions for x86 and ppc32 would want a
Packit 0652a1
 * larger alignment than this, but we don't need to
Packit 0652a1
 * do better than malloc.
Packit 0652a1
 *
Packit 0652a1
 * Borrowed from GLib's gobject/gtype.c
Packit 0652a1
 */
Packit 0652a1
#define STRUCT_ALIGNMENT (2 * sizeof (size_t))
Packit 0652a1
#define ALIGN_STRUCT(offset) \
Packit 0652a1
      ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT)
Packit 0652a1
Packit 0652a1
#define MAXFACTORS 32
Packit 0652a1
/* e.g. an fft of length 128 has 4 factors 
Packit 0652a1
 as far as kissfft is concerned
Packit 0652a1
 4*4*4*2
Packit 0652a1
 */
Packit 0652a1
Packit 0652a1
struct kiss_fft_f64_state{
Packit 0652a1
    int nfft;
Packit 0652a1
    int inverse;
Packit 0652a1
    int factors[2*MAXFACTORS];
Packit 0652a1
    kiss_fft_f64_cpx twiddles[1];
Packit 0652a1
};
Packit 0652a1
Packit 0652a1
/*
Packit 0652a1
  Explanation of macros dealing with complex math:
Packit 0652a1
Packit 0652a1
   C_MUL(m,a,b)         : m = a*b
Packit 0652a1
   C_FIXDIV( c , div )  : if a fixed point impl., c /= div. noop otherwise
Packit 0652a1
   C_SUB( res, a,b)     : res = a - b
Packit 0652a1
   C_SUBFROM( res , a)  : res -= a
Packit 0652a1
   C_ADDTO( res , a)    : res += a
Packit 0652a1
 * */
Packit 0652a1
Packit 0652a1
#define S_MUL(a,b) ( (a)*(b) )
Packit 0652a1
#define C_MUL(m,a,b) \
Packit 0652a1
    do{ (m).r = (a).r*(b).r - (a).i*(b).i;\
Packit 0652a1
        (m).i = (a).r*(b).i + (a).i*(b).r; }while(0)
Packit 0652a1
#define C_FIXDIV(c,div) /* NOOP */
Packit 0652a1
#define C_MULBYSCALAR( c, s ) \
Packit 0652a1
    do{ (c).r *= (s);\
Packit 0652a1
        (c).i *= (s); }while(0)
Packit 0652a1
Packit 0652a1
#ifndef CHECK_OVERFLOW_OP
Packit 0652a1
#  define CHECK_OVERFLOW_OP(a,op,b) /* noop */
Packit 0652a1
#endif
Packit 0652a1
Packit 0652a1
#define  C_ADD( res, a,b)\
Packit 0652a1
    do { \
Packit 0652a1
	    CHECK_OVERFLOW_OP((a).r,+,(b).r)\
Packit 0652a1
	    CHECK_OVERFLOW_OP((a).i,+,(b).i)\
Packit 0652a1
	    (res).r=(a).r+(b).r;  (res).i=(a).i+(b).i; \
Packit 0652a1
    }while(0)
Packit 0652a1
#define  C_SUB( res, a,b)\
Packit 0652a1
    do { \
Packit 0652a1
	    CHECK_OVERFLOW_OP((a).r,-,(b).r)\
Packit 0652a1
	    CHECK_OVERFLOW_OP((a).i,-,(b).i)\
Packit 0652a1
	    (res).r=(a).r-(b).r;  (res).i=(a).i-(b).i; \
Packit 0652a1
    }while(0)
Packit 0652a1
#define C_ADDTO( res , a)\
Packit 0652a1
    do { \
Packit 0652a1
	    CHECK_OVERFLOW_OP((res).r,+,(a).r)\
Packit 0652a1
	    CHECK_OVERFLOW_OP((res).i,+,(a).i)\
Packit 0652a1
	    (res).r += (a).r;  (res).i += (a).i;\
Packit 0652a1
    }while(0)
Packit 0652a1
Packit 0652a1
#define C_SUBFROM( res , a)\
Packit 0652a1
    do {\
Packit 0652a1
	    CHECK_OVERFLOW_OP((res).r,-,(a).r)\
Packit 0652a1
	    CHECK_OVERFLOW_OP((res).i,-,(a).i)\
Packit 0652a1
	    (res).r -= (a).r;  (res).i -= (a).i; \
Packit 0652a1
    }while(0)
Packit 0652a1
Packit 0652a1
Packit 0652a1
#define KISS_FFT_F64_COS(phase) (kiss_fft_f64_scalar) cos(phase)
Packit 0652a1
#define KISS_FFT_F64_SIN(phase) (kiss_fft_f64_scalar) sin(phase)
Packit 0652a1
#define HALF_OF(x) ((x)*.5)
Packit 0652a1
Packit 0652a1
#define  kf_cexp(x,phase) \
Packit 0652a1
	do{ \
Packit 0652a1
		(x)->r = KISS_FFT_F64_COS(phase);\
Packit 0652a1
		(x)->i = KISS_FFT_F64_SIN(phase);\
Packit 0652a1
	}while(0)
Packit 0652a1
Packit 0652a1
Packit 0652a1
/* a debugging function */
Packit 0652a1
#define pcpx(c)\
Packit 0652a1
    fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) )