Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(964)

Side by Side Diff: silk/fixed/pitch_analysis_core_FIX.c

Issue 107243004: Updating Opus to release 1.1 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/opus
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « silk/fixed/noise_shape_analysis_FIX.c ('k') | silk/fixed/prefilter_FIX.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 55
56 /************************************************************/ 56 /************************************************************/
57 /* Internally used functions */ 57 /* Internally used functions */
58 /************************************************************/ 58 /************************************************************/
59 static void silk_P_Ana_calc_corr_st3( 59 static void silk_P_Ana_calc_corr_st3(
60 silk_pe_stage3_vals cross_corr_st3[], /* O 3 DIM correlation ar ray */ 60 silk_pe_stage3_vals cross_corr_st3[], /* O 3 DIM correlation ar ray */
61 const opus_int16 frame[], /* I vector to correlate */ 61 const opus_int16 frame[], /* I vector to correlate */
62 opus_int start_lag, /* I lag offset to search around */ 62 opus_int start_lag, /* I lag offset to search around */
63 opus_int sf_length, /* I length of a 5 ms sub frame */ 63 opus_int sf_length, /* I length of a 5 ms sub frame */
64 opus_int nb_subfr, /* I number of subframes */ 64 opus_int nb_subfr, /* I number of subframes */
65 opus_int complexity /* I Complexity setting */ 65 opus_int complexity, /* I Complexity setting */
66 int arch /* I Run-time architectur e */
66 ); 67 );
67 68
68 static void silk_P_Ana_calc_energy_st3( 69 static void silk_P_Ana_calc_energy_st3(
69 silk_pe_stage3_vals energies_st3[], /* O 3 DIM energy array * / 70 silk_pe_stage3_vals energies_st3[], /* O 3 DIM energy array * /
70 const opus_int16 frame[], /* I vector to calc energ y in */ 71 const opus_int16 frame[], /* I vector to calc energ y in */
71 opus_int start_lag, /* I lag offset to search around */ 72 opus_int start_lag, /* I lag offset to search around */
72 opus_int sf_length, /* I length of one 5 ms s ubframe */ 73 opus_int sf_length, /* I length of one 5 ms s ubframe */
73 opus_int nb_subfr, /* I number of subframes */ 74 opus_int nb_subfr, /* I number of subframes */
74 opus_int complexity /* I Complexity setting */ 75 opus_int complexity /* I Complexity setting */
75 ); 76 );
76 77
77 /*************************************************************/ 78 /*************************************************************/
78 /* FIXED POINT CORE PITCH ANALYSIS FUNCTION */ 79 /* FIXED POINT CORE PITCH ANALYSIS FUNCTION */
79 /*************************************************************/ 80 /*************************************************************/
80 opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */ 81 opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */
81 const opus_int16 *frame, /* I Signal of length PE_ FRAME_LENGTH_MS*Fs_kHz */ 82 const opus_int16 *frame, /* I Signal of length PE_ FRAME_LENGTH_MS*Fs_kHz */
82 opus_int *pitch_out, /* O 4 pitch lag values */ 83 opus_int *pitch_out, /* O 4 pitch lag values */
83 opus_int16 *lagIndex, /* O Lag Index */ 84 opus_int16 *lagIndex, /* O Lag Index */
84 opus_int8 *contourIndex, /* O Pitch contour Index */ 85 opus_int8 *contourIndex, /* O Pitch contour Index */
85 opus_int *LTPCorr_Q15, /* I/O Normalized correlati on; input: value from previous frame */ 86 opus_int *LTPCorr_Q15, /* I/O Normalized correlati on; input: value from previous frame */
86 opus_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */ 87 opus_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */
87 const opus_int32 search_thres1_Q16, /* I First stage threshol d for lag candidates 0 - 1 */ 88 const opus_int32 search_thres1_Q16, /* I First stage threshol d for lag candidates 0 - 1 */
88 const opus_int search_thres2_Q13, /* I Final threshold for lag candidates 0 - 1 */ 89 const opus_int search_thres2_Q13, /* I Final threshold for lag candidates 0 - 1 */
89 const opus_int Fs_kHz, /* I Sample frequency (kH z) */ 90 const opus_int Fs_kHz, /* I Sample frequency (kH z) */
90 const opus_int complexity, /* I Complexity setting, 0-2, where 2 is highest */ 91 const opus_int complexity, /* I Complexity setting, 0-2, where 2 is highest */
91 const opus_int nb_subfr /* I number of 5 ms subfr ames */ 92 const opus_int nb_subfr, /* I number of 5 ms subfr ames */
93 int arch /* I Run-time architectur e */
92 ) 94 )
93 { 95 {
94 VARDECL( opus_int16, frame_8kHz ); 96 VARDECL( opus_int16, frame_8kHz );
95 VARDECL( opus_int16, frame_4kHz ); 97 VARDECL( opus_int16, frame_4kHz );
96 opus_int32 filt_state[ 6 ]; 98 opus_int32 filt_state[ 6 ];
97 const opus_int16 *input_frame_ptr; 99 const opus_int16 *input_frame_ptr;
98 opus_int i, k, d, j; 100 opus_int i, k, d, j;
99 VARDECL( opus_int16, C ); 101 VARDECL( opus_int16, C );
100 VARDECL( opus_int32, xcorr32 ); 102 VARDECL( opus_int32, xcorr32 );
101 const opus_int16 *target_ptr, *basis_ptr; 103 const opus_int16 *target_ptr, *basis_ptr;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 /* Check that we are within range of the array */ 184 /* Check that we are within range of the array */
183 silk_assert( target_ptr >= frame_4kHz ); 185 silk_assert( target_ptr >= frame_4kHz );
184 silk_assert( target_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4k Hz ); 186 silk_assert( target_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4k Hz );
185 187
186 basis_ptr = target_ptr - MIN_LAG_4KHZ; 188 basis_ptr = target_ptr - MIN_LAG_4KHZ;
187 189
188 /* Check that we are within range of the array */ 190 /* Check that we are within range of the array */
189 silk_assert( basis_ptr >= frame_4kHz ); 191 silk_assert( basis_ptr >= frame_4kHz );
190 silk_assert( basis_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4kH z ); 192 silk_assert( basis_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4kH z );
191 193
192 celt_pitch_xcorr( target_ptr, target_ptr - MAX_LAG_4KHZ, xcorr32, SF_LEN GTH_8KHZ, MAX_LAG_4KHZ - MIN_LAG_4KHZ + 1 ); 194 celt_pitch_xcorr( target_ptr, target_ptr - MAX_LAG_4KHZ, xcorr32, SF_LEN GTH_8KHZ, MAX_LAG_4KHZ - MIN_LAG_4KHZ + 1, arch );
193 195
194 /* Calculate first vector products before loop */ 196 /* Calculate first vector products before loop */
195 cross_corr = xcorr32[ MAX_LAG_4KHZ - MIN_LAG_4KHZ ]; 197 cross_corr = xcorr32[ MAX_LAG_4KHZ - MIN_LAG_4KHZ ];
196 normalizer = silk_inner_prod_aligned( target_ptr, target_ptr, SF_LENGTH_ 8KHZ ); 198 normalizer = silk_inner_prod_aligned( target_ptr, target_ptr, SF_LENGTH_ 8KHZ );
197 normalizer = silk_ADD32( normalizer, silk_inner_prod_aligned( basis_ptr, basis_ptr, SF_LENGTH_8KHZ ) ); 199 normalizer = silk_ADD32( normalizer, silk_inner_prod_aligned( basis_ptr, basis_ptr, SF_LENGTH_8KHZ ) );
198 normalizer = silk_ADD32( normalizer, silk_SMULBB( SF_LENGTH_8KHZ, 4000 ) ); 200 normalizer = silk_ADD32( normalizer, silk_SMULBB( SF_LENGTH_8KHZ, 4000 ) );
199 201
200 matrix_ptr( C, k, 0, CSTRIDE_4KHZ ) = 202 matrix_ptr( C, k, 0, CSTRIDE_4KHZ ) =
201 (opus_int16)silk_DIV32_varQ( cross_corr, normalizer, 13 + 1 ); /* Q13 */ 203 (opus_int16)silk_DIV32_varQ( cross_corr, normalizer, 13 + 1 ); /* Q13 */
202 204
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 *LTPCorr_Q15 = (opus_int)silk_LSHIFT( silk_DIV32_16( CCmax, nb_subfr ), 2 ); 460 *LTPCorr_Q15 = (opus_int)silk_LSHIFT( silk_DIV32_16( CCmax, nb_subfr ), 2 );
459 silk_assert( *LTPCorr_Q15 >= 0 ); 461 silk_assert( *LTPCorr_Q15 >= 0 );
460 462
461 if( Fs_kHz > 8 ) { 463 if( Fs_kHz > 8 ) {
462 VARDECL( opus_int16, scratch_mem ); 464 VARDECL( opus_int16, scratch_mem );
463 /*********************************************************************** ****/ 465 /*********************************************************************** ****/
464 /* Scale input signal down to avoid correlations measures from overflowi ng */ 466 /* Scale input signal down to avoid correlations measures from overflowi ng */
465 /*********************************************************************** ****/ 467 /*********************************************************************** ****/
466 /* find scaling as max scaling for each subframe */ 468 /* find scaling as max scaling for each subframe */
467 silk_sum_sqr_shift( &energy, &shift, frame, frame_length ); 469 silk_sum_sqr_shift( &energy, &shift, frame, frame_length );
468 ALLOC( scratch_mem, shift > 0 ? frame_length : 0, opus_int16 ); 470 ALLOC( scratch_mem, shift > 0 ? frame_length : ALLOC_NONE, opus_int16 );
469 if( shift > 0 ) { 471 if( shift > 0 ) {
470 /* Move signal to scratch mem because the input signal should be unc hanged */ 472 /* Move signal to scratch mem because the input signal should be unc hanged */
471 shift = silk_RSHIFT( shift, 1 ); 473 shift = silk_RSHIFT( shift, 1 );
472 for( i = 0; i < frame_length; i++ ) { 474 for( i = 0; i < frame_length; i++ ) {
473 scratch_mem[ i ] = silk_RSHIFT( frame[ i ], shift ); 475 scratch_mem[ i ] = silk_RSHIFT( frame[ i ], shift );
474 } 476 }
475 input_frame_ptr = scratch_mem; 477 input_frame_ptr = scratch_mem;
476 } else { 478 } else {
477 input_frame_ptr = frame; 479 input_frame_ptr = frame;
478 } 480 }
(...skipping 30 matching lines...) Expand all
509 Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; 511 Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ];
510 } else { 512 } else {
511 nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; 513 nb_cbk_search = PE_NB_CBKS_STAGE3_10MS;
512 cbk_size = PE_NB_CBKS_STAGE3_10MS; 514 cbk_size = PE_NB_CBKS_STAGE3_10MS;
513 Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; 515 Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ];
514 } 516 }
515 517
516 /* Calculate the correlations and energies needed in stage 3 */ 518 /* Calculate the correlations and energies needed in stage 3 */
517 ALLOC( energies_st3, nb_subfr * nb_cbk_search, silk_pe_stage3_vals ); 519 ALLOC( energies_st3, nb_subfr * nb_cbk_search, silk_pe_stage3_vals );
518 ALLOC( cross_corr_st3, nb_subfr * nb_cbk_search, silk_pe_stage3_vals ); 520 ALLOC( cross_corr_st3, nb_subfr * nb_cbk_search, silk_pe_stage3_vals );
519 silk_P_Ana_calc_corr_st3( cross_corr_st3, input_frame_ptr, start_lag, s f_length, nb_subfr, complexity ); 521 silk_P_Ana_calc_corr_st3( cross_corr_st3, input_frame_ptr, start_lag, s f_length, nb_subfr, complexity, arch );
520 silk_P_Ana_calc_energy_st3( energies_st3, input_frame_ptr, start_lag, sf _length, nb_subfr, complexity ); 522 silk_P_Ana_calc_energy_st3( energies_st3, input_frame_ptr, start_lag, sf _length, nb_subfr, complexity );
521 523
522 lag_counter = 0; 524 lag_counter = 0;
523 silk_assert( lag == silk_SAT16( lag ) ); 525 silk_assert( lag == silk_SAT16( lag ) );
524 contour_bias_Q15 = silk_DIV32_16( SILK_FIX_CONST( PE_FLATCONTOUR_BIAS, 1 5 ), lag ); 526 contour_bias_Q15 = silk_DIV32_16( SILK_FIX_CONST( PE_FLATCONTOUR_BIAS, 1 5 ), lag );
525 527
526 target_ptr = &input_frame_ptr[ PE_LTP_MEM_LENGTH_MS * Fs_kHz ]; 528 target_ptr = &input_frame_ptr[ PE_LTP_MEM_LENGTH_MS * Fs_kHz ];
527 energy_target = silk_ADD32( silk_inner_prod_aligned( target_ptr, target_ ptr, nb_subfr * sf_length ), 1 ); 529 energy_target = silk_ADD32( silk_inner_prod_aligned( target_ptr, target_ ptr, nb_subfr * sf_length ), 1 );
528 for( d = start_lag; d <= end_lag; d++ ) { 530 for( d = start_lag; d <= end_lag; d++ ) {
529 for( j = 0; j < nb_cbk_search; j++ ) { 531 for( j = 0; j < nb_cbk_search; j++ ) {
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 * 592 *
591 * In total 48 correlations. The direct implementation computed in worst 593 * In total 48 correlations. The direct implementation computed in worst
592 * case 4*12*5 = 240 correlations, but more likely around 120. 594 * case 4*12*5 = 240 correlations, but more likely around 120.
593 ***********************************************************************/ 595 ***********************************************************************/
594 static void silk_P_Ana_calc_corr_st3( 596 static void silk_P_Ana_calc_corr_st3(
595 silk_pe_stage3_vals cross_corr_st3[], /* O 3 DIM correlation ar ray */ 597 silk_pe_stage3_vals cross_corr_st3[], /* O 3 DIM correlation ar ray */
596 const opus_int16 frame[], /* I vector to correlate */ 598 const opus_int16 frame[], /* I vector to correlate */
597 opus_int start_lag, /* I lag offset to search around */ 599 opus_int start_lag, /* I lag offset to search around */
598 opus_int sf_length, /* I length of a 5 ms sub frame */ 600 opus_int sf_length, /* I length of a 5 ms sub frame */
599 opus_int nb_subfr, /* I number of subframes */ 601 opus_int nb_subfr, /* I number of subframes */
600 opus_int complexity /* I Complexity setting */ 602 opus_int complexity, /* I Complexity setting */
603 int arch /* I Run-time architectur e */
601 ) 604 )
602 { 605 {
603 const opus_int16 *target_ptr; 606 const opus_int16 *target_ptr;
604 opus_int i, j, k, lag_counter, lag_low, lag_high; 607 opus_int i, j, k, lag_counter, lag_low, lag_high;
605 opus_int nb_cbk_search, delta, idx, cbk_size; 608 opus_int nb_cbk_search, delta, idx, cbk_size;
606 VARDECL( opus_int32, scratch_mem ); 609 VARDECL( opus_int32, scratch_mem );
607 VARDECL( opus_int32, xcorr32 ); 610 VARDECL( opus_int32, xcorr32 );
608 const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; 611 const opus_int8 *Lag_range_ptr, *Lag_CB_ptr;
609 SAVE_STACK; 612 SAVE_STACK;
610 613
(...skipping 16 matching lines...) Expand all
627 ALLOC( xcorr32, SCRATCH_SIZE, opus_int32 ); 630 ALLOC( xcorr32, SCRATCH_SIZE, opus_int32 );
628 631
629 target_ptr = &frame[ silk_LSHIFT( sf_length, 2 ) ]; /* Pointer to middle of frame */ 632 target_ptr = &frame[ silk_LSHIFT( sf_length, 2 ) ]; /* Pointer to middle of frame */
630 for( k = 0; k < nb_subfr; k++ ) { 633 for( k = 0; k < nb_subfr; k++ ) {
631 lag_counter = 0; 634 lag_counter = 0;
632 635
633 /* Calculate the correlations for each subframe */ 636 /* Calculate the correlations for each subframe */
634 lag_low = matrix_ptr( Lag_range_ptr, k, 0, 2 ); 637 lag_low = matrix_ptr( Lag_range_ptr, k, 0, 2 );
635 lag_high = matrix_ptr( Lag_range_ptr, k, 1, 2 ); 638 lag_high = matrix_ptr( Lag_range_ptr, k, 1, 2 );
636 silk_assert(lag_high-lag_low+1 <= SCRATCH_SIZE); 639 silk_assert(lag_high-lag_low+1 <= SCRATCH_SIZE);
637 celt_pitch_xcorr( target_ptr, target_ptr - start_lag - lag_high, xcorr32 , sf_length, lag_high - lag_low + 1 ); 640 celt_pitch_xcorr( target_ptr, target_ptr - start_lag - lag_high, xcorr32 , sf_length, lag_high - lag_low + 1, arch );
638 for( j = lag_low; j <= lag_high; j++ ) { 641 for( j = lag_low; j <= lag_high; j++ ) {
639 silk_assert( lag_counter < SCRATCH_SIZE ); 642 silk_assert( lag_counter < SCRATCH_SIZE );
640 scratch_mem[ lag_counter ] = xcorr32[ lag_high - j ]; 643 scratch_mem[ lag_counter ] = xcorr32[ lag_high - j ];
641 lag_counter++; 644 lag_counter++;
642 } 645 }
643 646
644 delta = matrix_ptr( Lag_range_ptr, k, 0, 2 ); 647 delta = matrix_ptr( Lag_range_ptr, k, 0, 2 );
645 for( i = 0; i < nb_cbk_search; i++ ) { 648 for( i = 0; i < nb_cbk_search; i++ ) {
646 /* Fill out the 3 dim array that stores the correlations for */ 649 /* Fill out the 3 dim array that stores the correlations for */
647 /* each code_book vector for each start lag */ 650 /* each code_book vector for each start lag */
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 matrix_ptr( energies_st3, k, i, nb_cbk_search )[ j ] = 735 matrix_ptr( energies_st3, k, i, nb_cbk_search )[ j ] =
733 scratch_mem[ idx + j ]; 736 scratch_mem[ idx + j ];
734 silk_assert( 737 silk_assert(
735 matrix_ptr( energies_st3, k, i, nb_cbk_search )[ j ] >= 0 ); 738 matrix_ptr( energies_st3, k, i, nb_cbk_search )[ j ] >= 0 );
736 } 739 }
737 } 740 }
738 target_ptr += sf_length; 741 target_ptr += sf_length;
739 } 742 }
740 RESTORE_STACK; 743 RESTORE_STACK;
741 } 744 }
OLDNEW
« no previous file with comments | « silk/fixed/noise_shape_analysis_FIX.c ('k') | silk/fixed/prefilter_FIX.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698