| OLD | NEW |
| 1 /*********************************************************************** | 1 /*********************************************************************** |
| 2 Copyright (c) 2006-2011, Skype Limited. All rights reserved. | 2 Copyright (c) 2006-2011, Skype Limited. All rights reserved. |
| 3 Redistribution and use in source and binary forms, with or without | 3 Redistribution and use in source and binary forms, with or without |
| 4 modification, are permitted provided that the following conditions | 4 modification, are permitted provided that the following conditions |
| 5 are met: | 5 are met: |
| 6 - Redistributions of source code must retain the above copyright notice, | 6 - Redistributions of source code must retain the above copyright notice, |
| 7 this list of conditions and the following disclaimer. | 7 this list of conditions and the following disclaimer. |
| 8 - Redistributions in binary form must reproduce the above copyright | 8 - Redistributions in binary form must reproduce the above copyright |
| 9 notice, this list of conditions and the following disclaimer in the | 9 notice, this list of conditions and the following disclaimer in the |
| 10 documentation and/or other materials provided with the distribution. | 10 documentation and/or other materials provided with the distribution. |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 const opus_int win_type, /* I Selects a window typ
e */ | 220 const opus_int win_type, /* I Selects a window typ
e */ |
| 221 const opus_int length /* I Window length, multi
ple of 4 */ | 221 const opus_int length /* I Window length, multi
ple of 4 */ |
| 222 ); | 222 ); |
| 223 | 223 |
| 224 /* Compute autocorrelation */ | 224 /* Compute autocorrelation */ |
| 225 void silk_autocorr( | 225 void silk_autocorr( |
| 226 opus_int32 *results, /* O Result (length corre
lationCount) */ | 226 opus_int32 *results, /* O Result (length corre
lationCount) */ |
| 227 opus_int *scale, /* O Scaling of the corre
lation vector */ | 227 opus_int *scale, /* O Scaling of the corre
lation vector */ |
| 228 const opus_int16 *inputData, /* I Input data to correl
ate */ | 228 const opus_int16 *inputData, /* I Input data to correl
ate */ |
| 229 const opus_int inputDataSize, /* I Length of input
*/ | 229 const opus_int inputDataSize, /* I Length of input
*/ |
| 230 const opus_int correlationCount /* I Number of correlatio
n taps to compute */ | 230 const opus_int correlationCount, /* I Number of correlatio
n taps to compute */ |
| 231 int arch /* I Run-time architectur
e */ |
| 231 ); | 232 ); |
| 232 | 233 |
| 233 void silk_decode_pitch( | 234 void silk_decode_pitch( |
| 234 opus_int16 lagIndex, /* I
*/ | 235 opus_int16 lagIndex, /* I
*/ |
| 235 opus_int8 contourIndex, /* O
*/ | 236 opus_int8 contourIndex, /* O
*/ |
| 236 opus_int pitch_lags[], /* O 4 pitch values
*/ | 237 opus_int pitch_lags[], /* O 4 pitch values
*/ |
| 237 const opus_int Fs_kHz, /* I sampling frequency (
kHz) */ | 238 const opus_int Fs_kHz, /* I sampling frequency (
kHz) */ |
| 238 const opus_int nb_subfr /* I number of sub frames
*/ | 239 const opus_int nb_subfr /* I number of sub frames
*/ |
| 239 ); | 240 ); |
| 240 | 241 |
| 241 opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0
voiced, 1 unvoiced */ | 242 opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0
voiced, 1 unvoiced */ |
| 242 const opus_int16 *frame, /* I Signal of length PE_
FRAME_LENGTH_MS*Fs_kHz */ | 243 const opus_int16 *frame, /* I Signal of length PE_
FRAME_LENGTH_MS*Fs_kHz */ |
| 243 opus_int *pitch_out, /* O 4 pitch lag values
*/ | 244 opus_int *pitch_out, /* O 4 pitch lag values
*/ |
| 244 opus_int16 *lagIndex, /* O Lag Index
*/ | 245 opus_int16 *lagIndex, /* O Lag Index
*/ |
| 245 opus_int8 *contourIndex, /* O Pitch contour Index
*/ | 246 opus_int8 *contourIndex, /* O Pitch contour Index
*/ |
| 246 opus_int *LTPCorr_Q15, /* I/O Normalized correlati
on; input: value from previous frame */ | 247 opus_int *LTPCorr_Q15, /* I/O Normalized correlati
on; input: value from previous frame */ |
| 247 opus_int prevLag, /* I Last lag of previous
frame; set to zero is unvoiced */ | 248 opus_int prevLag, /* I Last lag of previous
frame; set to zero is unvoiced */ |
| 248 const opus_int32 search_thres1_Q16, /* I First stage threshol
d for lag candidates 0 - 1 */ | 249 const opus_int32 search_thres1_Q16, /* I First stage threshol
d for lag candidates 0 - 1 */ |
| 249 const opus_int search_thres2_Q13, /* I Final threshold for
lag candidates 0 - 1 */ | 250 const opus_int search_thres2_Q13, /* I Final threshold for
lag candidates 0 - 1 */ |
| 250 const opus_int Fs_kHz, /* I Sample frequency (kH
z) */ | 251 const opus_int Fs_kHz, /* I Sample frequency (kH
z) */ |
| 251 const opus_int complexity, /* I Complexity setting,
0-2, where 2 is highest */ | 252 const opus_int complexity, /* I Complexity setting,
0-2, where 2 is highest */ |
| 252 const opus_int nb_subfr /* I number of 5 ms subfr
ames */ | 253 const opus_int nb_subfr, /* I number of 5 ms subfr
ames */ |
| 254 int arch /* I Run-time architectur
e */ |
| 253 ); | 255 ); |
| 254 | 256 |
| 255 /* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter co
efficients */ | 257 /* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter co
efficients */ |
| 256 /* If not all roots are found, the a_Q16 coefficients are bandwidth expanded unt
il convergence. */ | 258 /* If not all roots are found, the a_Q16 coefficients are bandwidth expanded unt
il convergence. */ |
| 257 void silk_A2NLSF( | 259 void silk_A2NLSF( |
| 258 opus_int16 *NLSF, /* O Normalized Line Spec
tral Frequencies in Q15 (0..2^15-1) [d] */ | 260 opus_int16 *NLSF, /* O Normalized Line Spec
tral Frequencies in Q15 (0..2^15-1) [d] */ |
| 259 opus_int32 *a_Q16, /* I/O Monic whitening filt
er coefficients in Q16 [d] */ | 261 opus_int32 *a_Q16, /* I/O Monic whitening filt
er coefficients in Q16 [d] */ |
| 260 const opus_int d /* I Filter order (must b
e even) */ | 262 const opus_int d /* I Filter order (must b
e even) */ |
| 261 ); | 263 ); |
| 262 | 264 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 | 304 |
| 303 /* Compute reflection coefficients from input signal */ | 305 /* Compute reflection coefficients from input signal */ |
| 304 void silk_burg_modified( | 306 void silk_burg_modified( |
| 305 opus_int32 *res_nrg, /* O Residual energy
*/ | 307 opus_int32 *res_nrg, /* O Residual energy
*/ |
| 306 opus_int *res_nrg_Q, /* O Residual energy Q va
lue */ | 308 opus_int *res_nrg_Q, /* O Residual energy Q va
lue */ |
| 307 opus_int32 A_Q16[], /* O Prediction coefficie
nts (length order) */ | 309 opus_int32 A_Q16[], /* O Prediction coefficie
nts (length order) */ |
| 308 const opus_int16 x[], /* I Input signal, length
: nb_subfr * ( D + subfr_length ) */ | 310 const opus_int16 x[], /* I Input signal, length
: nb_subfr * ( D + subfr_length ) */ |
| 309 const opus_int32 minInvGain_Q30, /* I Inverse of max predi
ction gain */ | 311 const opus_int32 minInvGain_Q30, /* I Inverse of max predi
ction gain */ |
| 310 const opus_int subfr_length, /* I Input signal subfram
e length (incl. D preceding samples) */ | 312 const opus_int subfr_length, /* I Input signal subfram
e length (incl. D preceding samples) */ |
| 311 const opus_int nb_subfr, /* I Number of subframes
stacked in x */ | 313 const opus_int nb_subfr, /* I Number of subframes
stacked in x */ |
| 312 const opus_int D /* I Order
*/ | 314 const opus_int D, /* I Order
*/ |
| 315 int arch /* I Run-time architectur
e */ |
| 313 ); | 316 ); |
| 314 | 317 |
| 315 /* Copy and multiply a vector by a constant */ | 318 /* Copy and multiply a vector by a constant */ |
| 316 void silk_scale_copy_vector16( | 319 void silk_scale_copy_vector16( |
| 317 opus_int16 *data_out, | 320 opus_int16 *data_out, |
| 318 const opus_int16 *data_in, | 321 const opus_int16 *data_in, |
| 319 opus_int32 gain_Q16, /* I Gain in Q16
*/ | 322 opus_int32 gain_Q16, /* I Gain in Q16
*/ |
| 320 const opus_int dataSize /* I Length
*/ | 323 const opus_int dataSize /* I Length
*/ |
| 321 ); | 324 ); |
| 322 | 325 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 351 const opus_int len /* I vector lengths
*/ | 354 const opus_int len /* I vector lengths
*/ |
| 352 ); | 355 ); |
| 353 | 356 |
| 354 /********************************************************************/ | 357 /********************************************************************/ |
| 355 /* MACROS */ | 358 /* MACROS */ |
| 356 /********************************************************************/ | 359 /********************************************************************/ |
| 357 | 360 |
| 358 /* Rotate a32 right by 'rot' bits. Negative rot values result in rotating | 361 /* Rotate a32 right by 'rot' bits. Negative rot values result in rotating |
| 359 left. Output is 32bit int. | 362 left. Output is 32bit int. |
| 360 Note: contemporary compilers recognize the C expression below and | 363 Note: contemporary compilers recognize the C expression below and |
| 361 compile it into a 'ror' instruction if available. No need for inline ASM! */ | 364 compile it into a 'ror' instruction if available. No need for OPUS_INLINE ASM
! */ |
| 362 static inline opus_int32 silk_ROR32( opus_int32 a32, opus_int rot ) | 365 static OPUS_INLINE opus_int32 silk_ROR32( opus_int32 a32, opus_int rot ) |
| 363 { | 366 { |
| 364 opus_uint32 x = (opus_uint32) a32; | 367 opus_uint32 x = (opus_uint32) a32; |
| 365 opus_uint32 r = (opus_uint32) rot; | 368 opus_uint32 r = (opus_uint32) rot; |
| 366 opus_uint32 m = (opus_uint32) -rot; | 369 opus_uint32 m = (opus_uint32) -rot; |
| 367 if( rot == 0 ) { | 370 if( rot == 0 ) { |
| 368 return a32; | 371 return a32; |
| 369 } else if( rot < 0 ) { | 372 } else if( rot < 0 ) { |
| 370 return (opus_int32) ((x << m) | (x >> (32 - m))); | 373 return (opus_int32) ((x << m) | (x >> (32 - m))); |
| 371 } else { | 374 } else { |
| 372 return (opus_int32) ((x << (32 - r)) | (x >> r)); | 375 return (opus_int32) ((x << (32 - r)) | (x >> r)); |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 #define silk_NSHIFT_MUL_16_16(a, b) ( -(15- (16-silk_CLZ16(silk_abs(a))
+ (16-silk_CLZ16(silk_abs(b))))) ) | 504 #define silk_NSHIFT_MUL_16_16(a, b) ( -(15- (16-silk_CLZ16(silk_abs(a))
+ (16-silk_CLZ16(silk_abs(b))))) ) |
| 502 | 505 |
| 503 | 506 |
| 504 #define silk_min(a, b) (((a) < (b)) ? (a) : (b)) | 507 #define silk_min(a, b) (((a) < (b)) ? (a) : (b)) |
| 505 #define silk_max(a, b) (((a) > (b)) ? (a) : (b)) | 508 #define silk_max(a, b) (((a) > (b)) ? (a) : (b)) |
| 506 | 509 |
| 507 /* Macro to convert floating-point constants to fixed-point */ | 510 /* Macro to convert floating-point constants to fixed-point */ |
| 508 #define SILK_FIX_CONST( C, Q ) ((opus_int32)((C) * ((opus_int64)1 <
< (Q)) + 0.5)) | 511 #define SILK_FIX_CONST( C, Q ) ((opus_int32)((C) * ((opus_int64)1 <
< (Q)) + 0.5)) |
| 509 | 512 |
| 510 /* silk_min() versions with typecast in the function call */ | 513 /* silk_min() versions with typecast in the function call */ |
| 511 static inline opus_int silk_min_int(opus_int a, opus_int b) | 514 static OPUS_INLINE opus_int silk_min_int(opus_int a, opus_int b) |
| 512 { | 515 { |
| 513 return (((a) < (b)) ? (a) : (b)); | 516 return (((a) < (b)) ? (a) : (b)); |
| 514 } | 517 } |
| 515 static inline opus_int16 silk_min_16(opus_int16 a, opus_int16 b) | 518 static OPUS_INLINE opus_int16 silk_min_16(opus_int16 a, opus_int16 b) |
| 516 { | 519 { |
| 517 return (((a) < (b)) ? (a) : (b)); | 520 return (((a) < (b)) ? (a) : (b)); |
| 518 } | 521 } |
| 519 static inline opus_int32 silk_min_32(opus_int32 a, opus_int32 b) | 522 static OPUS_INLINE opus_int32 silk_min_32(opus_int32 a, opus_int32 b) |
| 520 { | 523 { |
| 521 return (((a) < (b)) ? (a) : (b)); | 524 return (((a) < (b)) ? (a) : (b)); |
| 522 } | 525 } |
| 523 static inline opus_int64 silk_min_64(opus_int64 a, opus_int64 b) | 526 static OPUS_INLINE opus_int64 silk_min_64(opus_int64 a, opus_int64 b) |
| 524 { | 527 { |
| 525 return (((a) < (b)) ? (a) : (b)); | 528 return (((a) < (b)) ? (a) : (b)); |
| 526 } | 529 } |
| 527 | 530 |
| 528 /* silk_min() versions with typecast in the function call */ | 531 /* silk_min() versions with typecast in the function call */ |
| 529 static inline opus_int silk_max_int(opus_int a, opus_int b) | 532 static OPUS_INLINE opus_int silk_max_int(opus_int a, opus_int b) |
| 530 { | 533 { |
| 531 return (((a) > (b)) ? (a) : (b)); | 534 return (((a) > (b)) ? (a) : (b)); |
| 532 } | 535 } |
| 533 static inline opus_int16 silk_max_16(opus_int16 a, opus_int16 b) | 536 static OPUS_INLINE opus_int16 silk_max_16(opus_int16 a, opus_int16 b) |
| 534 { | 537 { |
| 535 return (((a) > (b)) ? (a) : (b)); | 538 return (((a) > (b)) ? (a) : (b)); |
| 536 } | 539 } |
| 537 static inline opus_int32 silk_max_32(opus_int32 a, opus_int32 b) | 540 static OPUS_INLINE opus_int32 silk_max_32(opus_int32 a, opus_int32 b) |
| 538 { | 541 { |
| 539 return (((a) > (b)) ? (a) : (b)); | 542 return (((a) > (b)) ? (a) : (b)); |
| 540 } | 543 } |
| 541 static inline opus_int64 silk_max_64(opus_int64 a, opus_int64 b) | 544 static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b) |
| 542 { | 545 { |
| 543 return (((a) > (b)) ? (a) : (b)); | 546 return (((a) > (b)) ? (a) : (b)); |
| 544 } | 547 } |
| 545 | 548 |
| 546 #define silk_LIMIT( a, limit1, limit2) ((limit1) > (limit2) ? ((a) > (limit
1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ | 549 #define silk_LIMIT( a, limit1, limit2) ((limit1) > (limit2) ? ((a) > (limit
1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ |
| 547 : ((a) > (limit
2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))) | 550 : ((a) > (limit
2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))) |
| 548 | 551 |
| 549 #define silk_LIMIT_int silk_LIMIT | 552 #define silk_LIMIT_int silk_LIMIT |
| 550 #define silk_LIMIT_16 silk_LIMIT | 553 #define silk_LIMIT_16 silk_LIMIT |
| 551 #define silk_LIMIT_32 silk_LIMIT | 554 #define silk_LIMIT_32 silk_LIMIT |
| (...skipping 17 matching lines...) Expand all Loading... |
| 569 ARMv6 2 instruction cycles. | 572 ARMv6 2 instruction cycles. |
| 570 ARMv3M+ 3 instruction cycles. use SMULL and ignore LSB registers.
(except xM)*/ | 573 ARMv3M+ 3 instruction cycles. use SMULL and ignore LSB registers.
(except xM)*/ |
| 571 /*#define silk_SMMUL(a32, b32) (opus_int32)silk_RSHIFT(silk_SMLAL
(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16)), 16)*/ | 574 /*#define silk_SMMUL(a32, b32) (opus_int32)silk_RSHIFT(silk_SMLAL
(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16)), 16)*/ |
| 572 /* the following seems faster on x86 */ | 575 /* the following seems faster on x86 */ |
| 573 #define silk_SMMUL(a32, b32) (opus_int32)silk_RSHIFT64(silk_SMULL
((a32), (b32)), 32) | 576 #define silk_SMMUL(a32, b32) (opus_int32)silk_RSHIFT64(silk_SMULL
((a32), (b32)), 32) |
| 574 | 577 |
| 575 #include "Inlines.h" | 578 #include "Inlines.h" |
| 576 #include "MacroCount.h" | 579 #include "MacroCount.h" |
| 577 #include "MacroDebug.h" | 580 #include "MacroDebug.h" |
| 578 | 581 |
| 579 #ifdef ARMv4_ASM | 582 #ifdef OPUS_ARM_INLINE_ASM |
| 580 #include "arm/SigProc_FIX_armv4.h" | 583 #include "arm/SigProc_FIX_armv4.h" |
| 581 #endif | 584 #endif |
| 582 | 585 |
| 583 #ifdef ARMv5E_ASM | 586 #ifdef OPUS_ARM_INLINE_EDSP |
| 584 #include "arm/SigProc_FIX_armv5e.h" | 587 #include "arm/SigProc_FIX_armv5e.h" |
| 585 #endif | 588 #endif |
| 586 | 589 |
| 587 #ifdef __cplusplus | 590 #ifdef __cplusplus |
| 588 } | 591 } |
| 589 #endif | 592 #endif |
| 590 | 593 |
| 591 #endif /* SILK_SIGPROC_FIX_H */ | 594 #endif /* SILK_SIGPROC_FIX_H */ |
| OLD | NEW |