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* File: syn_filt.c * 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description: Do the synthesis filtering 1/A(z) * 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/ 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h" 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "math_op.h" 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cnst.h" 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 2984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber#define UNUSED(x) (void)(x) 3084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Syn_filt( 325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ 335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 x[], /* (i) : input signal */ 345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 y[], /* (o) : output signal */ 355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 lg, /* (i) : size of filtering */ 365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 mem[], /* (i/o) : memory associated with this filtering. */ 375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 update /* (i) : 0=no update, 1=update of memory. */ 385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i, a0; 415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 y_buf[L_SUBFR16k + M16k]; 425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_tmp; 435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 *yy, *p1, *p2; 445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen yy = &y_buf[0]; 455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* copy initial filter states into synthesis buffer */ 465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 16; i++) 475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *yy++ = mem[i]; 495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen a0 = (a[0] >> 1); /* input / 2 */ 515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Do the filtering. */ 525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < lg; i++) 535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p1 = &a[1]; 555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p2 = &yy[i-1]; 565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = vo_mult32(a0, x[i]); 575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1++), (*p2--)); 725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p1), (*p2)); 735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = L_shl2(L_tmp, 4); 755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen y[i] = yy[i] = extract_h(L_add(L_tmp, 0x8000)); 765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Update memory if required */ 785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (update) 795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 16; i++) 805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen mem[i] = yy[lg - 16 + i]; 825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return; 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Syn_filt_32( 885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ 895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 m, /* (i) : order of LP filter */ 905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ 915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ 925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 sig_hi[], /* (o) /16 : synthesis high */ 935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 sig_lo[], /* (o) /16 : synthesis low */ 945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 lg /* (i) : size of filtering */ 955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i,a0; 985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_tmp, L_tmp1; 995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 *p1, *p2, *p3; 10084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber UNUSED(m); 10184333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber 1025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen a0 = a[0] >> (4 + Qnew); /* input / 16 and >>Qnew */ 1035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Do the filtering. */ 1045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < lg; i++) 1055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = 0; 1075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 = 0; 1085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p1 = a; 1095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p2 = &sig_lo[i - 1]; 1105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p3 = &sig_hi[i - 1]; 1115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp -= vo_mult32((*p2--), (*p1)); 1435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp1 -= vo_mult32((*p3--), (*p1++)); 1445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = L_tmp >> 11; 1465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp += vo_L_mult(exc[i], a0); 1475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* sig_hi = bit16 to bit31 of synthesis */ 1495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = L_tmp - (L_tmp1<<1); 1505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = L_tmp >> 3; /* ai in Q12 */ 1525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen sig_hi[i] = extract_h(L_tmp); 1535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* sig_lo = bit4 to bit15 of synthesis */ 1555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp >>= 4; /* 4 : sig_lo[i] >> 4 */ 1565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen sig_lo[i] = (Word16)((L_tmp - (sig_hi[i] << 13))); 1575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return; 160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 165