1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*********************************************************************** 2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCopyright (c) 2006-2011, Skype Limited. All rights reserved. 3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgRedistribution and use in source and binary forms, with or without 4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgmodification, are permitted provided that the following conditions 5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgare met: 6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions of source code must retain the above copyright notice, 7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgthis list of conditions and the following disclaimer. 8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions in binary form must reproduce the above copyright 9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnotice, this list of conditions and the following disclaimer in the 10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgdocumentation and/or other materials provided with the distribution. 11e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org- Neither the name of Internet Society, IETF or IETF Trust, nor the 12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnames of specific contributors, may be used to endorse or promote 13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgproducts derived from this software without specific prior written 14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgpermission. 15e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgPOSSIBILITY OF SUCH DAMAGE. 26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org***********************************************************************/ 27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef HAVE_CONFIG_H 29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "config.h" 30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif 31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/********************************************************************** 33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * Correlation matrix computations for LS estimate. 34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org **********************************************************************/ 35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "main_FLP.h" 37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Calculates correlation vector X'*t */ 39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_corrVector_FLP( 40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float *x, /* I x vector [L+order-1] used to create X */ 41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float *t, /* I Target vector [L] */ 42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int L, /* I Length of vecors */ 43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int Order, /* I Max lag for correlation */ 44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float *Xt /* O X'*t correlation vector [order] */ 45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int lag; 48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float *ptr1; 49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ptr1 = &x[ Order - 1 ]; /* Points to first sample of column 0 of X: X[:,0] */ 51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( lag = 0; lag < Order; lag++ ) { 52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* Calculate X[:,lag]'*t */ 53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org Xt[ lag ] = (silk_float)silk_inner_product_FLP( ptr1, t, L ); 54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ptr1--; /* Next column of X */ 55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Calculates correlation matrix X'*X */ 59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_corrMatrix_FLP( 60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float *x, /* I x vector [ L+order-1 ] used to create X */ 61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int L, /* I Length of vectors */ 62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int Order, /* I Max lag for correlation */ 63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float *XX /* O X'*X correlation matrix [order x order] */ 64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int j, lag; 67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org double energy; 68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float *ptr1, *ptr2; 69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ptr1 = &x[ Order - 1 ]; /* First sample of column 0 of X */ 71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org energy = silk_energy_FLP( ptr1, L ); /* X[:,0]'*X[:,0] */ 72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org matrix_ptr( XX, 0, 0, Order ) = ( silk_float )energy; 73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( j = 1; j < Order; j++ ) { 74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* Calculate X[:,j]'*X[:,j] */ 75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org energy += ptr1[ -j ] * ptr1[ -j ] - ptr1[ L - j ] * ptr1[ L - j ]; 76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org matrix_ptr( XX, j, j, Order ) = ( silk_float )energy; 77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ptr2 = &x[ Order - 2 ]; /* First sample of column 1 of X */ 80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( lag = 1; lag < Order; lag++ ) { 81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* Calculate X[:,0]'*X[:,lag] */ 82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org energy = silk_inner_product_FLP( ptr1, ptr2, L ); 83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org matrix_ptr( XX, lag, 0, Order ) = ( silk_float )energy; 84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org matrix_ptr( XX, 0, lag, Order ) = ( silk_float )energy; 85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* Calculate X[:,j]'*X[:,j + lag] */ 86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( j = 1; j < ( Order - lag ); j++ ) { 87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org energy += ptr1[ -j ] * ptr2[ -j ] - ptr1[ L - j ] * ptr2[ L - j ]; 88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org matrix_ptr( XX, lag + j, j, Order ) = ( silk_float )energy; 89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org matrix_ptr( XX, j, lag + j, Order ) = ( silk_float )energy; 90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ptr2--; /* Next column of X */ 92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 94