1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*Copyright (c) 2003-2004, Mark Borgerding 2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org All rights reserved. 4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org Redistribution and use in source and binary forms, with or without 6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org modification, are permitted provided that the following conditions are met: 7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * Redistributions of source code must retain the above copyright notice, 9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org this list of conditions and the following disclaimer. 10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * Redistributions in binary form must reproduce the above copyright notice, 11885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org this list of conditions and the following disclaimer in the 12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org documentation and/or other materials provided with the distribution. 13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org POSSIBILITY OF SUCH DAMAGE.*/ 25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef KISS_FFT_GUTS_H 27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define KISS_FFT_GUTS_H 28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define MIN(a,b) ((a)<(b) ? (a):(b)) 30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define MAX(a,b) ((a)>(b) ? (a):(b)) 31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* kiss_fft.h 33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org defines kiss_fft_scalar as either short or a float type 34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org and defines 35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ 36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "kiss_fft.h" 37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* 39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org Explanation of macros dealing with complex math: 40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org C_MUL(m,a,b) : m = a*b 42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise 43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org C_SUB( res, a,b) : res = a - b 44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org C_SUBFROM( res , a) : res -= a 45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org C_ADDTO( res , a) : res += a 46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * */ 47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef FIXED_POINT 48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "arch.h" 49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define SAMP_MAX 2147483647 52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define TWID_MAX 32767 53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define TRIG_UPSCALE 1 54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define SAMP_MIN -SAMP_MAX 56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define S_MUL(a,b) MULT16_32_Q15(b, a) 59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define C_MUL(m,a,b) \ 61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do{ (m).r = SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ 62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (m).i = ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0) 63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define C_MULC(m,a,b) \ 65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do{ (m).r = ADD32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ 66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (m).i = SUB32(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0) 67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define C_MUL4(m,a,b) \ 69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do{ (m).r = SHR32(SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)),2); \ 70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (m).i = SHR32(ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)),2); }while(0) 71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define C_MULBYSCALAR( c, s ) \ 73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do{ (c).r = S_MUL( (c).r , s ) ;\ 74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (c).i = S_MUL( (c).i , s ) ; }while(0) 75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define DIVSCALAR(x,k) \ 77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (x) = S_MUL( x, (TWID_MAX-((k)>>1))/(k)+1 ) 78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define C_FIXDIV(c,div) \ 80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do { DIVSCALAR( (c).r , div); \ 81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org DIVSCALAR( (c).i , div); }while (0) 82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define C_ADD( res, a,b)\ 84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do {(res).r=ADD32((a).r,(b).r); (res).i=ADD32((a).i,(b).i); \ 85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org }while(0) 86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define C_SUB( res, a,b)\ 87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do {(res).r=SUB32((a).r,(b).r); (res).i=SUB32((a).i,(b).i); \ 88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org }while(0) 89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define C_ADDTO( res , a)\ 90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do {(res).r = ADD32((res).r, (a).r); (res).i = ADD32((res).i,(a).i);\ 91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org }while(0) 92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define C_SUBFROM( res , a)\ 94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do {(res).r = ADD32((res).r,(a).r); (res).i = SUB32((res).i,(a).i); \ 95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org }while(0) 96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 973c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com#if defined(OPUS_ARM_INLINE_ASM) 98e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "arm/kiss_fft_armv4.h" 99e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 100e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 1013c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com#if defined(OPUS_ARM_INLINE_EDSP) 102e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "arm/kiss_fft_armv5e.h" 103e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 104e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#else /* not FIXED_POINT*/ 106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define S_MUL(a,b) ( (a)*(b) ) 108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define C_MUL(m,a,b) \ 109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ 110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) 111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define C_MULC(m,a,b) \ 112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do{ (m).r = (a).r*(b).r + (a).i*(b).i;\ 113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (m).i = (a).i*(b).r - (a).r*(b).i; }while(0) 114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 115885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define C_MUL4(m,a,b) C_MUL(m,a,b) 116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 117885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define C_FIXDIV(c,div) /* NOOP */ 118885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define C_MULBYSCALAR( c, s ) \ 119885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do{ (c).r *= (s);\ 120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (c).i *= (s); }while(0) 121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif 122885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 123885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef CHECK_OVERFLOW_OP 124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define CHECK_OVERFLOW_OP(a,op,b) /* noop */ 125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif 126885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 127885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef C_ADD 128885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define C_ADD( res, a,b)\ 129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do { \ 130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org CHECK_OVERFLOW_OP((a).r,+,(b).r)\ 131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org CHECK_OVERFLOW_OP((a).i,+,(b).i)\ 132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ 133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org }while(0) 134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define C_SUB( res, a,b)\ 135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do { \ 136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org CHECK_OVERFLOW_OP((a).r,-,(b).r)\ 137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org CHECK_OVERFLOW_OP((a).i,-,(b).i)\ 138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ 139885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org }while(0) 140885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define C_ADDTO( res , a)\ 141885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do { \ 142885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org CHECK_OVERFLOW_OP((res).r,+,(a).r)\ 143885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org CHECK_OVERFLOW_OP((res).i,+,(a).i)\ 144885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (res).r += (a).r; (res).i += (a).i;\ 145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org }while(0) 146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 147885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define C_SUBFROM( res , a)\ 148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do {\ 149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org CHECK_OVERFLOW_OP((res).r,-,(a).r)\ 150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org CHECK_OVERFLOW_OP((res).i,-,(a).i)\ 151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (res).r -= (a).r; (res).i -= (a).i; \ 152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org }while(0) 153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif /* C_ADD defined */ 154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef FIXED_POINT 156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*# define KISS_FFT_COS(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase)))) 157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define KISS_FFT_SIN(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase))))*/ 158885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define KISS_FFT_COS(phase) floor(.5+TWID_MAX*cos (phase)) 159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define KISS_FFT_SIN(phase) floor(.5+TWID_MAX*sin (phase)) 160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define HALF_OF(x) ((x)>>1) 161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#elif defined(USE_SIMD) 162885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) 163885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) 164885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define HALF_OF(x) ((x)*_mm_set1_ps(.5f)) 165885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#else 166885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) 167885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) 168885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org# define HALF_OF(x) ((x)*.5f) 169885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif 170885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 171885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define kf_cexp(x,phase) \ 172885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do{ \ 173885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (x)->r = KISS_FFT_COS(phase);\ 174885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (x)->i = KISS_FFT_SIN(phase);\ 175885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org }while(0) 176885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 177885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define kf_cexp2(x,phase) \ 178885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org do{ \ 179885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (x)->r = TRIG_UPSCALE*celt_cos_norm((phase));\ 180885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (x)->i = TRIG_UPSCALE*celt_cos_norm((phase)-32768);\ 181885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}while(0) 182885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 183885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif /* KISS_FFT_GUTS_H */ 184