- Timestamp:
- Jul 26, 2006 5:04:54 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjmedia/src/pjmedia-codec/speex/pseudofloat.h
r278 r628 46 46 } spx_float_t; 47 47 48 #define FLOAT_ZERO ((spx_float_t){0,0}) 49 #define FLOAT_ONE ((spx_float_t){16384,-14}) 50 #define FLOAT_HALF ((spx_float_t){16384,-15}) 48 static const spx_float_t FLOAT_ZERO = {0,0}; 49 static const spx_float_t FLOAT_ONE = {16384,-14}; 50 static const spx_float_t FLOAT_HALF = {16384,-15}; 51 51 52 52 #define MIN(a,b) ((a)<(b)?(a):(b)) … … 61 61 } 62 62 if (x==0) 63 return (spx_float_t) {0,0}; 63 { 64 spx_float_t r = {0,0}; 65 return r; 66 } 64 67 while (x>32767) 65 68 { … … 75 78 } 76 79 if (sign) 77 return (spx_float_t) {-x,e}; 80 { 81 spx_float_t r; 82 r.m = -x; 83 r.e = e; 84 return r; 85 } 78 86 else 79 return (spx_float_t) {x,e}; 87 { 88 spx_float_t r; 89 r.m = x; 90 r.e = e; 91 return r; 92 } 80 93 } 81 94 … … 88 101 else if (b.m==0) 89 102 return a; 90 r = (a).e > (b).e ? (spx_float_t) {((a).m>>1) + ((b).m>>MIN(15,(a).e-(b).e+1)),(a).e+1} : (spx_float_t) {((b).m>>1) + ((a).m>>MIN(15,(b).e-(a).e+1)),(b).e+1}; 103 if ((a).e > (b).e) 104 { 105 r.m = ((a).m>>1) + ((b).m>>MIN(15,(a).e-(b).e+1)); 106 r.e = (a).e+1; 107 } 108 else 109 { 110 r.m = ((b).m>>1) + ((a).m>>MIN(15,(b).e-(a).e+1)); 111 r.e = (b).e+1; 112 } 91 113 if (r.m>0) 92 114 { … … 114 136 else if (b.m==0) 115 137 return a; 116 r = (a).e > (b).e ? (spx_float_t) {((a).m>>1) - ((b).m>>MIN(15,(a).e-(b).e+1)),(a).e+1} : (spx_float_t) {((a).m>>MIN(15,(b).e-(a).e+1)) - ((b).m>>1) ,(b).e+1}; 138 if ((a).e > (b).e) 139 { 140 r.m = ((a).m>>1) - ((b).m>>MIN(15,(a).e-(b).e+1)); 141 r.e = (a).e+1; 142 } 143 else 144 { 145 r.m = ((a).m>>MIN(15,(b).e-(a).e+1)) - ((b).m>>1); 146 r.e = (b).e+1; 147 } 117 148 if (r.m>0) 118 149 { … … 153 184 static inline spx_float_t FLOAT_MULT(spx_float_t a, spx_float_t b) 154 185 { 155 spx_float_t r = (spx_float_t) {(spx_int16_t)((spx_int32_t)(a).m*(b).m>>15), (a).e+(b).e+15}; 186 spx_float_t r; 187 r.m = (spx_int16_t)((spx_int32_t)(a).m*(b).m>>15); 188 r.e = (a).e+(b).e+15; 156 189 if (r.m>0) 157 190 { … … 175 208 static inline spx_float_t FLOAT_SHL(spx_float_t a, int b) 176 209 { 177 return (spx_float_t) {a.m,a.e+b}; 210 spx_float_t r; 211 r.m = a.m; 212 r.e = a.e+b; 213 return r; 178 214 } 179 215 … … 181 217 { 182 218 if (a.e<0) 183 return (a.m+(1<<(-a.e-1)))>>-a.e;219 return EXTRACT16((EXTEND32(a.m)+(1<<(-a.e-1)))>>-a.e); 184 220 else 185 221 return a.m<<a.e; … … 197 233 { 198 234 int e=0; 235 spx_float_t r; 199 236 /* FIXME: Handle the sign */ 200 237 if (a==0) 201 return (spx_float_t) {0,0}; 238 { 239 return FLOAT_ZERO; 240 } 202 241 while (a>32767) 203 242 { … … 220 259 e--; 221 260 } 222 return (spx_float_t) {MULT16_16_Q15(a,b),e+15}; 261 r.m = MULT16_16_Q15(a,b); 262 r.e = e+15; 263 return r; 223 264 } 224 265 … … 226 267 { 227 268 int e=0; 269 spx_float_t r; 228 270 /* FIXME: Handle the sign */ 229 271 if (a==0) 230 return (spx_float_t) {0,0}; 231 while (a<SHL32(b.m,14)) 272 { 273 return FLOAT_ZERO; 274 } 275 while (a<SHL32(EXTEND32(b.m),14)) 232 276 { 233 277 a <<= 1; 234 278 e--; 235 279 } 236 while (a>=SHL32( b.m-1,15))280 while (a>=SHL32(EXTEND32(b.m-1),15)) 237 281 { 238 282 a >>= 1; 239 283 e++; 240 284 } 241 return (spx_float_t) {DIV32_16(a,b.m),e-b.e}; 285 r.m = DIV32_16(a,b.m); 286 r.e = e-b.e; 287 return r; 242 288 } 243 289 … … 246 292 { 247 293 int e=0; 294 spx_float_t r; 248 295 /* FIXME: Handle the sign */ 249 296 if (a==0) 250 return (spx_float_t) {0,0}; 297 { 298 return FLOAT_ZERO; 299 } 251 300 while (b>32767) 252 301 { … … 264 313 e++; 265 314 } 266 return (spx_float_t) {DIV32_16(a,b),e}; 315 r.m = DIV32_16(a,b); 316 r.e = e; 317 return r; 267 318 } 268 319 … … 271 322 int e=0; 272 323 spx_int32_t num; 324 spx_float_t r; 273 325 num = a.m; 274 326 while (a.m >= b.m) … … 278 330 } 279 331 num = num << (15-e); 280 return (spx_float_t) {DIV32_16(num,b.m),a.e-b.e-15+e}; 332 r.m = DIV32_16(num,b.m); 333 r.e = a.e-b.e-15+e; 334 return r; 281 335 } 282 336
Note: See TracChangeset
for help on using the changeset viewer.