annotate src/opus-1.3/celt/_kiss_fft_guts.h @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 4664ac0c1032
children
rev   line source
cannam@154 1 /*Copyright (c) 2003-2004, Mark Borgerding
cannam@154 2
cannam@154 3 All rights reserved.
cannam@154 4
cannam@154 5 Redistribution and use in source and binary forms, with or without
cannam@154 6 modification, are permitted provided that the following conditions are met:
cannam@154 7
cannam@154 8 * Redistributions of source code must retain the above copyright notice,
cannam@154 9 this list of conditions and the following disclaimer.
cannam@154 10 * Redistributions in binary form must reproduce the above copyright notice,
cannam@154 11 this list of conditions and the following disclaimer in the
cannam@154 12 documentation and/or other materials provided with the distribution.
cannam@154 13
cannam@154 14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
cannam@154 15 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
cannam@154 16 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
cannam@154 17 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
cannam@154 18 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
cannam@154 19 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
cannam@154 20 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
cannam@154 21 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
cannam@154 22 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
cannam@154 23 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
cannam@154 24 POSSIBILITY OF SUCH DAMAGE.*/
cannam@154 25
cannam@154 26 #ifndef KISS_FFT_GUTS_H
cannam@154 27 #define KISS_FFT_GUTS_H
cannam@154 28
cannam@154 29 #define MIN(a,b) ((a)<(b) ? (a):(b))
cannam@154 30 #define MAX(a,b) ((a)>(b) ? (a):(b))
cannam@154 31
cannam@154 32 /* kiss_fft.h
cannam@154 33 defines kiss_fft_scalar as either short or a float type
cannam@154 34 and defines
cannam@154 35 typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */
cannam@154 36 #include "kiss_fft.h"
cannam@154 37
cannam@154 38 /*
cannam@154 39 Explanation of macros dealing with complex math:
cannam@154 40
cannam@154 41 C_MUL(m,a,b) : m = a*b
cannam@154 42 C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise
cannam@154 43 C_SUB( res, a,b) : res = a - b
cannam@154 44 C_SUBFROM( res , a) : res -= a
cannam@154 45 C_ADDTO( res , a) : res += a
cannam@154 46 * */
cannam@154 47 #ifdef FIXED_POINT
cannam@154 48 #include "arch.h"
cannam@154 49
cannam@154 50
cannam@154 51 #define SAMP_MAX 2147483647
cannam@154 52 #define TWID_MAX 32767
cannam@154 53 #define TRIG_UPSCALE 1
cannam@154 54
cannam@154 55 #define SAMP_MIN -SAMP_MAX
cannam@154 56
cannam@154 57
cannam@154 58 # define S_MUL(a,b) MULT16_32_Q15(b, a)
cannam@154 59
cannam@154 60 # define C_MUL(m,a,b) \
cannam@154 61 do{ (m).r = SUB32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \
cannam@154 62 (m).i = ADD32_ovflw(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0)
cannam@154 63
cannam@154 64 # define C_MULC(m,a,b) \
cannam@154 65 do{ (m).r = ADD32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \
cannam@154 66 (m).i = SUB32_ovflw(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0)
cannam@154 67
cannam@154 68 # define C_MULBYSCALAR( c, s ) \
cannam@154 69 do{ (c).r = S_MUL( (c).r , s ) ;\
cannam@154 70 (c).i = S_MUL( (c).i , s ) ; }while(0)
cannam@154 71
cannam@154 72 # define DIVSCALAR(x,k) \
cannam@154 73 (x) = S_MUL( x, (TWID_MAX-((k)>>1))/(k)+1 )
cannam@154 74
cannam@154 75 # define C_FIXDIV(c,div) \
cannam@154 76 do { DIVSCALAR( (c).r , div); \
cannam@154 77 DIVSCALAR( (c).i , div); }while (0)
cannam@154 78
cannam@154 79 #define C_ADD( res, a,b)\
cannam@154 80 do {(res).r=ADD32_ovflw((a).r,(b).r); (res).i=ADD32_ovflw((a).i,(b).i); \
cannam@154 81 }while(0)
cannam@154 82 #define C_SUB( res, a,b)\
cannam@154 83 do {(res).r=SUB32_ovflw((a).r,(b).r); (res).i=SUB32_ovflw((a).i,(b).i); \
cannam@154 84 }while(0)
cannam@154 85 #define C_ADDTO( res , a)\
cannam@154 86 do {(res).r = ADD32_ovflw((res).r, (a).r); (res).i = ADD32_ovflw((res).i,(a).i);\
cannam@154 87 }while(0)
cannam@154 88
cannam@154 89 #define C_SUBFROM( res , a)\
cannam@154 90 do {(res).r = ADD32_ovflw((res).r,(a).r); (res).i = SUB32_ovflw((res).i,(a).i); \
cannam@154 91 }while(0)
cannam@154 92
cannam@154 93 #if defined(OPUS_ARM_INLINE_ASM)
cannam@154 94 #include "arm/kiss_fft_armv4.h"
cannam@154 95 #endif
cannam@154 96
cannam@154 97 #if defined(OPUS_ARM_INLINE_EDSP)
cannam@154 98 #include "arm/kiss_fft_armv5e.h"
cannam@154 99 #endif
cannam@154 100 #if defined(MIPSr1_ASM)
cannam@154 101 #include "mips/kiss_fft_mipsr1.h"
cannam@154 102 #endif
cannam@154 103
cannam@154 104 #else /* not FIXED_POINT*/
cannam@154 105
cannam@154 106 # define S_MUL(a,b) ( (a)*(b) )
cannam@154 107 #define C_MUL(m,a,b) \
cannam@154 108 do{ (m).r = (a).r*(b).r - (a).i*(b).i;\
cannam@154 109 (m).i = (a).r*(b).i + (a).i*(b).r; }while(0)
cannam@154 110 #define C_MULC(m,a,b) \
cannam@154 111 do{ (m).r = (a).r*(b).r + (a).i*(b).i;\
cannam@154 112 (m).i = (a).i*(b).r - (a).r*(b).i; }while(0)
cannam@154 113
cannam@154 114 #define C_MUL4(m,a,b) C_MUL(m,a,b)
cannam@154 115
cannam@154 116 # define C_FIXDIV(c,div) /* NOOP */
cannam@154 117 # define C_MULBYSCALAR( c, s ) \
cannam@154 118 do{ (c).r *= (s);\
cannam@154 119 (c).i *= (s); }while(0)
cannam@154 120 #endif
cannam@154 121
cannam@154 122 #ifndef CHECK_OVERFLOW_OP
cannam@154 123 # define CHECK_OVERFLOW_OP(a,op,b) /* noop */
cannam@154 124 #endif
cannam@154 125
cannam@154 126 #ifndef C_ADD
cannam@154 127 #define C_ADD( res, a,b)\
cannam@154 128 do { \
cannam@154 129 CHECK_OVERFLOW_OP((a).r,+,(b).r)\
cannam@154 130 CHECK_OVERFLOW_OP((a).i,+,(b).i)\
cannam@154 131 (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \
cannam@154 132 }while(0)
cannam@154 133 #define C_SUB( res, a,b)\
cannam@154 134 do { \
cannam@154 135 CHECK_OVERFLOW_OP((a).r,-,(b).r)\
cannam@154 136 CHECK_OVERFLOW_OP((a).i,-,(b).i)\
cannam@154 137 (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \
cannam@154 138 }while(0)
cannam@154 139 #define C_ADDTO( res , a)\
cannam@154 140 do { \
cannam@154 141 CHECK_OVERFLOW_OP((res).r,+,(a).r)\
cannam@154 142 CHECK_OVERFLOW_OP((res).i,+,(a).i)\
cannam@154 143 (res).r += (a).r; (res).i += (a).i;\
cannam@154 144 }while(0)
cannam@154 145
cannam@154 146 #define C_SUBFROM( res , a)\
cannam@154 147 do {\
cannam@154 148 CHECK_OVERFLOW_OP((res).r,-,(a).r)\
cannam@154 149 CHECK_OVERFLOW_OP((res).i,-,(a).i)\
cannam@154 150 (res).r -= (a).r; (res).i -= (a).i; \
cannam@154 151 }while(0)
cannam@154 152 #endif /* C_ADD defined */
cannam@154 153
cannam@154 154 #ifdef FIXED_POINT
cannam@154 155 /*# define KISS_FFT_COS(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase))))
cannam@154 156 # define KISS_FFT_SIN(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase))))*/
cannam@154 157 # define KISS_FFT_COS(phase) floor(.5+TWID_MAX*cos (phase))
cannam@154 158 # define KISS_FFT_SIN(phase) floor(.5+TWID_MAX*sin (phase))
cannam@154 159 # define HALF_OF(x) ((x)>>1)
cannam@154 160 #elif defined(USE_SIMD)
cannam@154 161 # define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) )
cannam@154 162 # define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) )
cannam@154 163 # define HALF_OF(x) ((x)*_mm_set1_ps(.5f))
cannam@154 164 #else
cannam@154 165 # define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase)
cannam@154 166 # define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase)
cannam@154 167 # define HALF_OF(x) ((x)*.5f)
cannam@154 168 #endif
cannam@154 169
cannam@154 170 #define kf_cexp(x,phase) \
cannam@154 171 do{ \
cannam@154 172 (x)->r = KISS_FFT_COS(phase);\
cannam@154 173 (x)->i = KISS_FFT_SIN(phase);\
cannam@154 174 }while(0)
cannam@154 175
cannam@154 176 #define kf_cexp2(x,phase) \
cannam@154 177 do{ \
cannam@154 178 (x)->r = TRIG_UPSCALE*celt_cos_norm((phase));\
cannam@154 179 (x)->i = TRIG_UPSCALE*celt_cos_norm((phase)-32768);\
cannam@154 180 }while(0)
cannam@154 181
cannam@154 182 #endif /* KISS_FFT_GUTS_H */