1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* 2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc. 3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License"); 5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License. 6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at 7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** http://www.apache.org/licenses/LICENSE-2.0 9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software 11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS, 12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and 14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License. 15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */ 16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*********************************************************************** 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* File: autocorr.c * 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description:Compute autocorrelations of signal with windowing * 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/ 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h" 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "oper_32b.h" 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h" 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "ham_wind.tab" 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 3184333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber#define UNUSED(x) (void)(x) 3284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Autocorr( 345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 x[], /* (i) : Input signal */ 355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 m, /* (i) : LPC order */ 365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 r_h[], /* (o) Q15: Autocorrelations (msb) */ 375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 r_l[] /* (o) : Autocorrelations (lsb) */ 385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i, norm, shift; 415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 y[L_WINDOW]; 425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_sum, L_sum1, L_tmp, F_LEN; 435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 *p1,*p2,*p3; 445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen const Word16 *p4; 4584333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber UNUSED(m); 4684333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber 475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Windowing of signal */ 485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p1 = x; 495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p4 = vo_window; 505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p3 = y; 515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < L_WINDOW; i+=4) 535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *p3++ = vo_mult_r((*p1++), (*p4++)); 555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *p3++ = vo_mult_r((*p1++), (*p4++)); 565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *p3++ = vo_mult_r((*p1++), (*p4++)); 575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *p3++ = vo_mult_r((*p1++), (*p4++)); 585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* calculate energy of signal */ 615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum = vo_L_deposit_h(16); /* sqrt(256), avoid overflow after rounding */ 625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < L_WINDOW; i++) 635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = vo_L_mult(y[i], y[i]); 655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = (L_tmp >> 8); 665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum += L_tmp; 675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* scale signal to avoid overflow in autocorrelation */ 705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen norm = norm_l(L_sum); 715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen shift = 4 - (norm >> 1); 725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if(shift > 0) 735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p1 = y; 755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < L_WINDOW; i+=4) 765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *p1 = vo_shr_r(*p1, shift); 785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p1++; 795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *p1 = vo_shr_r(*p1, shift); 805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p1++; 815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *p1 = vo_shr_r(*p1, shift); 825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p1++; 835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *p1 = vo_shr_r(*p1, shift); 845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p1++; 855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Compute and normalize r[0] */ 895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum = 1; 905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < L_WINDOW; i+=4) 915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum += vo_L_mult(y[i], y[i]); 935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum += vo_L_mult(y[i+1], y[i+1]); 945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum += vo_L_mult(y[i+2], y[i+2]); 955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum += vo_L_mult(y[i+3], y[i+3]); 965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen norm = norm_l(L_sum); 995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum = (L_sum << norm); 1005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen r_h[0] = L_sum >> 16; 1025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen r_l[0] = (L_sum & 0xffff)>>1; 1035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Compute r[1] to r[m] */ 1055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 1; i <= 8; i++) 1065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum1 = 0; 1085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum = 0; 1095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen F_LEN = (Word32)(L_WINDOW - 2*i); 1105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p1 = y; 1115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p2 = y + (2*i)-1; 1125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen do{ 1135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum1 += *p1 * *p2++; 1145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum += *p1++ * *p2; 1155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen }while(--F_LEN!=0); 1165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum1 += *p1 * *p2++; 1185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum1 = L_sum1<<norm; 1205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum = L_sum<<norm; 1215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen r_h[(2*i)-1] = L_sum1 >> 15; 1235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen r_l[(2*i)-1] = L_sum1 & 0x00007fff; 1245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen r_h[(2*i)] = L_sum >> 15; 1255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen r_l[(2*i)] = L_sum & 0x00007fff; 1265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return; 128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 132