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 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Syn_filt( 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 x[], /* (i) : input signal */ 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 y[], /* (o) : output signal */ 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 lg, /* (i) : size of filtering */ 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 mem[], /* (i/o) : memory associated with this filtering. */ 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 update /* (i) : 0=no update, 1=update of memory. */ 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i, a0; 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 y_buf[L_SUBFR16k + M16k]; 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_tmp; 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 *yy, *p1, *p2; 42b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard yy = &y_buf[0]; 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* copy initial filter states into synthesis buffer */ 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 16; i++) 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 46b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *yy++ = mem[i]; 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard a0 = (a[0] >> 1); /* input / 2 */ 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* Do the filtering. */ 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < lg; i++) 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p1 = &a[1]; 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p2 = &yy[i-1]; 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp = vo_mult32(a0, x[i]); 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1++), (*p2--)); 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p1), (*p2)); 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp = L_shl2(L_tmp, 4); 73b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard y[i] = yy[i] = extract_h(L_add(L_tmp, 0x8000)); 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* Update memory if required */ 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (update) 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 16; i++) 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard mem[i] = yy[lg - 16 + i]; 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Syn_filt_32( 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 m, /* (i) : order of LP filter */ 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 sig_hi[], /* (o) /16 : synthesis high */ 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 sig_lo[], /* (o) /16 : synthesis low */ 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 lg /* (i) : size of filtering */ 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i,a0; 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_tmp, L_tmp1; 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 *p1, *p2, *p3; 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard a0 = a[0] >> (4 + Qnew); /* input / 16 and >>Qnew */ 99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* Do the filtering. */ 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < lg; i++) 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 102b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard L_tmp = 0; 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 = 0; 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p1 = a; 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p2 = &sig_lo[i - 1]; 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p3 = &sig_hi[i - 1]; 107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp -= vo_mult32((*p2--), (*p1)); 139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp1 -= vo_mult32((*p3--), (*p1++)); 140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 141b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard L_tmp = L_tmp >> 11; 142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp += vo_L_mult(exc[i], a0); 143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* sig_hi = bit16 to bit31 of synthesis */ 145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp = L_tmp - (L_tmp1<<1); 146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp = L_tmp >> 3; /* ai in Q12 */ 148b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard sig_hi[i] = extract_h(L_tmp); 149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* sig_lo = bit4 to bit15 of synthesis */ 151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp >>= 4; /* 4 : sig_lo[i] >> 4 */ 152b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard sig_lo[i] = (Word16)((L_tmp - (sig_hi[i] << 13))); 153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 161