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

Side by Side Diff: third_party/opus/src/silk/fixed/corrMatrix_FIX.c

Issue 2962373002: [Opus] Update to v1.2.1 (Closed)
Patch Set: Include minor updates including fix for win_clang Created 3 years, 5 months 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
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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 opus_int32 inner_prod; 51 opus_int32 inner_prod;
52 52
53 ptr1 = &x[ order - 1 ]; /* Points to first sample of column 0 of X: X[:,0] * / 53 ptr1 = &x[ order - 1 ]; /* Points to first sample of column 0 of X: X[:,0] * /
54 ptr2 = t; 54 ptr2 = t;
55 /* Calculate X'*t */ 55 /* Calculate X'*t */
56 if( rshifts > 0 ) { 56 if( rshifts > 0 ) {
57 /* Right shifting used */ 57 /* Right shifting used */
58 for( lag = 0; lag < order; lag++ ) { 58 for( lag = 0; lag < order; lag++ ) {
59 inner_prod = 0; 59 inner_prod = 0;
60 for( i = 0; i < L; i++ ) { 60 for( i = 0; i < L; i++ ) {
61 inner_prod += silk_RSHIFT32( silk_SMULBB( ptr1[ i ], ptr2[i] ), rshifts ); 61 inner_prod = silk_ADD_RSHIFT32( inner_prod, silk_SMULBB( ptr1[ i ], ptr2[i] ), rshifts );
62 } 62 }
63 Xt[ lag ] = inner_prod; /* X[:,lag]'*t */ 63 Xt[ lag ] = inner_prod; /* X[:,lag]'*t */
64 ptr1--; /* Go to next column of X */ 64 ptr1--; /* Go to next column of X */
65 } 65 }
66 } else { 66 } else {
67 silk_assert( rshifts == 0 ); 67 silk_assert( rshifts == 0 );
68 for( lag = 0; lag < order; lag++ ) { 68 for( lag = 0; lag < order; lag++ ) {
69 Xt[ lag ] = silk_inner_prod_aligned( ptr1, ptr2, L, arch ); /* X[:,l ag]'*t */ 69 Xt[ lag ] = silk_inner_prod_aligned( ptr1, ptr2, L, arch ); /* X[:,l ag]'*t */
70 ptr1--; /* Go to next column of X */ 70 ptr1--; /* Go to next column of X */
71 } 71 }
72 } 72 }
73 } 73 }
74 74
75 /* Calculates correlation matrix X'*X */ 75 /* Calculates correlation matrix X'*X */
76 void silk_corrMatrix_FIX( 76 void silk_corrMatrix_FIX(
77 const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ 77 const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */
78 const opus_int L, /* I Length of vectors */ 78 const opus_int L, /* I Length of vectors */
79 const opus_int order, /* I Max lag for correlation */ 79 const opus_int order, /* I Max lag for correlation */
80 const opus_int head_room, /* I Desired headroom */
81 opus_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ] */ 80 opus_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ] */
82 opus_int *rshifts, /* I /O Right shifts of correlations */ 81 opus_int32 *nrg, /* O Energy of x vector */
82 opus_int *rshifts, /* O Right shifts of correlations and energy */
83 int arch /* I Run-time architecture */ 83 int arch /* I Run-time architecture */
84 ) 84 )
85 { 85 {
86 opus_int i, j, lag, rshifts_local, head_room_rshifts; 86 opus_int i, j, lag;
87 opus_int32 energy; 87 opus_int32 energy;
88 const opus_int16 *ptr1, *ptr2; 88 const opus_int16 *ptr1, *ptr2;
89 89
90 /* Calculate energy to find shift used to fit in 32 bits */ 90 /* Calculate energy to find shift used to fit in 32 bits */
91 silk_sum_sqr_shift( &energy, &rshifts_local, x, L + order - 1 ); 91 silk_sum_sqr_shift( nrg, rshifts, x, L + order - 1 );
92 /* Add shifts to get the desired head room */ 92 energy = *nrg;
93 head_room_rshifts = silk_max( head_room - silk_CLZ32( energy ), 0 );
94
95 energy = silk_RSHIFT32( energy, head_room_rshifts );
96 rshifts_local += head_room_rshifts;
97 93
98 /* Calculate energy of first column (0) of X: X[:,0]'*X[:,0] */ 94 /* Calculate energy of first column (0) of X: X[:,0]'*X[:,0] */
99 /* Remove contribution of first order - 1 samples */ 95 /* Remove contribution of first order - 1 samples */
100 for( i = 0; i < order - 1; i++ ) { 96 for( i = 0; i < order - 1; i++ ) {
101 energy -= silk_RSHIFT32( silk_SMULBB( x[ i ], x[ i ] ), rshifts_local ); 97 energy -= silk_RSHIFT32( silk_SMULBB( x[ i ], x[ i ] ), *rshifts );
102 }
103 if( rshifts_local < *rshifts ) {
104 /* Adjust energy */
105 energy = silk_RSHIFT32( energy, *rshifts - rshifts_local );
106 rshifts_local = *rshifts;
107 } 98 }
108 99
109 /* Calculate energy of remaining columns of X: X[:,j]'*X[:,j] */ 100 /* Calculate energy of remaining columns of X: X[:,j]'*X[:,j] */
110 /* Fill out the diagonal of the correlation matrix */ 101 /* Fill out the diagonal of the correlation matrix */
111 matrix_ptr( XX, 0, 0, order ) = energy; 102 matrix_ptr( XX, 0, 0, order ) = energy;
103 silk_assert( energy >= 0 );
112 ptr1 = &x[ order - 1 ]; /* First sample of column 0 of X */ 104 ptr1 = &x[ order - 1 ]; /* First sample of column 0 of X */
113 for( j = 1; j < order; j++ ) { 105 for( j = 1; j < order; j++ ) {
114 energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr1[ L - j ] ), rshifts_local ) ); 106 energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr1[ L - j ] ), *rshifts ) );
115 energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr 1[ -j ] ), rshifts_local ) ); 107 energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr 1[ -j ] ), *rshifts ) );
116 matrix_ptr( XX, j, j, order ) = energy; 108 matrix_ptr( XX, j, j, order ) = energy;
109 silk_assert( energy >= 0 );
117 } 110 }
118 111
119 ptr2 = &x[ order - 2 ]; /* First sample of column 1 of X */ 112 ptr2 = &x[ order - 2 ]; /* First sample of column 1 of X */
120 /* Calculate the remaining elements of the correlation matrix */ 113 /* Calculate the remaining elements of the correlation matrix */
121 if( rshifts_local > 0 ) { 114 if( *rshifts > 0 ) {
122 /* Right shifting used */ 115 /* Right shifting used */
123 for( lag = 1; lag < order; lag++ ) { 116 for( lag = 1; lag < order; lag++ ) {
124 /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */ 117 /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */
125 energy = 0; 118 energy = 0;
126 for( i = 0; i < L; i++ ) { 119 for( i = 0; i < L; i++ ) {
127 energy += silk_RSHIFT32( silk_SMULBB( ptr1[ i ], ptr2[i] ), rshi fts_local ); 120 energy += silk_RSHIFT32( silk_SMULBB( ptr1[ i ], ptr2[i] ), *rsh ifts );
128 } 121 }
129 /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */ 122 /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */
130 matrix_ptr( XX, lag, 0, order ) = energy; 123 matrix_ptr( XX, lag, 0, order ) = energy;
131 matrix_ptr( XX, 0, lag, order ) = energy; 124 matrix_ptr( XX, 0, lag, order ) = energy;
132 for( j = 1; j < ( order - lag ); j++ ) { 125 for( j = 1; j < ( order - lag ); j++ ) {
133 energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ), rshifts_local ) ); 126 energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ), *rshifts ) );
134 energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ - j ], ptr2[ -j ] ), rshifts_local ) ); 127 energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ - j ], ptr2[ -j ] ), *rshifts ) );
135 matrix_ptr( XX, lag + j, j, order ) = energy; 128 matrix_ptr( XX, lag + j, j, order ) = energy;
136 matrix_ptr( XX, j, lag + j, order ) = energy; 129 matrix_ptr( XX, j, lag + j, order ) = energy;
137 } 130 }
138 ptr2--; /* Update pointer to first sample of next column (lag) in X */ 131 ptr2--; /* Update pointer to first sample of next column (lag) in X */
139 } 132 }
140 } else { 133 } else {
141 for( lag = 1; lag < order; lag++ ) { 134 for( lag = 1; lag < order; lag++ ) {
142 /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */ 135 /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */
143 energy = silk_inner_prod_aligned( ptr1, ptr2, L, arch ); 136 energy = silk_inner_prod_aligned( ptr1, ptr2, L, arch );
144 matrix_ptr( XX, lag, 0, order ) = energy; 137 matrix_ptr( XX, lag, 0, order ) = energy;
145 matrix_ptr( XX, 0, lag, order ) = energy; 138 matrix_ptr( XX, 0, lag, order ) = energy;
146 /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */ 139 /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */
147 for( j = 1; j < ( order - lag ); j++ ) { 140 for( j = 1; j < ( order - lag ); j++ ) {
148 energy = silk_SUB32( energy, silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ) ); 141 energy = silk_SUB32( energy, silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ) );
149 energy = silk_SMLABB( energy, ptr1[ -j ], ptr2[ -j ] ); 142 energy = silk_SMLABB( energy, ptr1[ -j ], ptr2[ -j ] );
150 matrix_ptr( XX, lag + j, j, order ) = energy; 143 matrix_ptr( XX, lag + j, j, order ) = energy;
151 matrix_ptr( XX, j, lag + j, order ) = energy; 144 matrix_ptr( XX, j, lag + j, order ) = energy;
152 } 145 }
153 ptr2--;/* Update pointer to first sample of next column (lag) in X * / 146 ptr2--;/* Update pointer to first sample of next column (lag) in X * /
154 } 147 }
155 } 148 }
156 *rshifts = rshifts_local;
157 } 149 }
158 150
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698