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