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: decim54.c * 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description:Decimation of 16kHz signal to 12.8kHz * 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/ 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h" 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h" 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cnst.h" 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define FAC5 5 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define DOWN_FAC 26215 /* 4/5 in Q15 */ 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NB_COEF_DOWN 15 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Local functions */ 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void Down_samp( 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * sig, /* input: signal to downsampling */ 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * sig_d, /* output: downsampled signal */ 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 L_frame_d /* input: length of output */ 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ); 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* 1/5 resolution interpolation filter (in Q14) */ 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* -1.5dB @ 6kHz, -6dB @ 6.4kHz, -10dB @ 6.6kHz, -20dB @ 6.9kHz, -25dB @ 7kHz, -55dB @ 8kHz */ 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 fir_down1[4][30] = 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard {-5, 24, -50, 54, 0, -128, 294, -408, 344, 0, -647, 1505, -2379, 3034, 13107, 3034, -2379, 1505, -647, 0, 344, -408, 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 294, -128, 0, 54, -50, 24, -5, 0}, 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard {-6, 19, -26, 0, 77, -188, 270, -233, 0, 434, -964, 1366, -1293, 0, 12254, 6575, -2746, 1030, 0, -507, 601, -441, 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 198, 0, -95, 99, -58, 18, 0, -1}, 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard {-3, 9, 0, -41, 111, -170, 153, 0, -295, 649, -888, 770, 0, -1997, 9894, 9894, -1997, 0, 770, -888, 649, -295, 0, 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 153, -170, 111, -41, 0, 9, -3}, 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard {-1, 0, 18, -58, 99, -95, 0, 198, -441, 601, -507, 0, 1030, -2746, 6575, 12254, 0, -1293, 1366, -964, 434, 0, 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard -233, 270, -188, 77, 0, -26, 19, -6} 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}; 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Init_Decim_12k8( 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */ 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Set_zero(mem, 2 * NB_COEF_DOWN); 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Decim_12k8( 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 sig16k[], /* input: signal to downsampling */ 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 lg, /* input: length of input */ 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 sig12k8[], /* output: decimated signal */ 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */ 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 lg_down; 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 signal[L_FRAME16k + (2 * NB_COEF_DOWN)]; 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Copy(mem, signal, 2 * NB_COEF_DOWN); 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Copy(sig16k, signal + (2 * NB_COEF_DOWN), lg); 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard lg_down = (lg * DOWN_FAC)>>15; 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Down_samp(signal + NB_COEF_DOWN, sig12k8, lg_down); 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Copy(signal + lg, mem, 2 * NB_COEF_DOWN); 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void Down_samp( 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * sig, /* input: signal to downsampling */ 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * sig_d, /* output: downsampled signal */ 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 L_frame_d /* input: length of output */ 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i, j, frac, pos; 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 *x, *y; 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_sum; 99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pos = 0; /* position is in Q2 -> 1/4 resolution */ 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = 0; j < L_frame_d; j++) 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard i = (pos >> 2); /* integer part */ 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard frac = pos & 3; /* fractional part */ 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x = sig + i - NB_COEF_DOWN + 1; 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y = (Word16 *)(fir_down1 + frac); 107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum = vo_mult32((*x++),(*y++)); 109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x++),(*y++)); 137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum += vo_mult32((*x),(*y)); 138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 139b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard L_sum = L_shl2(L_sum, 2); 140b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard sig_d[j] = extract_h(L_add(L_sum, 0x8000)); 141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pos += FAC5; /* pos + 5/4 */ 142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 147