/* | |
** Copyright 2003-2010, VisualOn, Inc. | |
** | |
** Licensed under the Apache License, Version 2.0 (the "License"); | |
** you may not use this file except in compliance with the License. | |
** You may obtain a copy of the License at | |
** | |
** http://www.apache.org/licenses/LICENSE-2.0 | |
** | |
** Unless required by applicable law or agreed to in writing, software | |
** distributed under the License is distributed on an "AS IS" BASIS, | |
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
** See the License for the specific language governing permissions and | |
** limitations under the License. | |
*/ | |
/*********************************************************************** | |
* File: decim54.c * | |
* * | |
* Description:Decimation of 16kHz signal to 12.8kHz * | |
* * | |
************************************************************************/ | |
#include "typedef.h" | |
#include "basic_op.h" | |
#include "acelp.h" | |
#include "cnst.h" | |
#define FAC5 5 | |
#define DOWN_FAC 26215 /* 4/5 in Q15 */ | |
#define NB_COEF_DOWN 15 | |
/* Local functions */ | |
static void Down_samp( | |
Word16 * sig, /* input: signal to downsampling */ | |
Word16 * sig_d, /* output: downsampled signal */ | |
Word16 L_frame_d /* input: length of output */ | |
); | |
/* 1/5 resolution interpolation filter (in Q14) */ | |
/* -1.5dB @ 6kHz, -6dB @ 6.4kHz, -10dB @ 6.6kHz, -20dB @ 6.9kHz, -25dB @ 7kHz, -55dB @ 8kHz */ | |
static Word16 fir_down1[4][30] = | |
{ | |
{-5, 24, -50, 54, 0, -128, 294, -408, 344, 0, -647, 1505, -2379, 3034, 13107, 3034, -2379, 1505, -647, 0, 344, -408, | |
294, -128, 0, 54, -50, 24, -5, 0}, | |
{-6, 19, -26, 0, 77, -188, 270, -233, 0, 434, -964, 1366, -1293, 0, 12254, 6575, -2746, 1030, 0, -507, 601, -441, | |
198, 0, -95, 99, -58, 18, 0, -1}, | |
{-3, 9, 0, -41, 111, -170, 153, 0, -295, 649, -888, 770, 0, -1997, 9894, 9894, -1997, 0, 770, -888, 649, -295, 0, | |
153, -170, 111, -41, 0, 9, -3}, | |
{-1, 0, 18, -58, 99, -95, 0, 198, -441, 601, -507, 0, 1030, -2746, 6575, 12254, 0, -1293, 1366, -964, 434, 0, | |
-233, 270, -188, 77, 0, -26, 19, -6} | |
}; | |
void Init_Decim_12k8( | |
Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */ | |
) | |
{ | |
Set_zero(mem, 2 * NB_COEF_DOWN); | |
return; | |
} | |
void Decim_12k8( | |
Word16 sig16k[], /* input: signal to downsampling */ | |
Word16 lg, /* input: length of input */ | |
Word16 sig12k8[], /* output: decimated signal */ | |
Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */ | |
) | |
{ | |
Word16 lg_down; | |
Word16 signal[L_FRAME16k + (2 * NB_COEF_DOWN)]; | |
Copy(mem, signal, 2 * NB_COEF_DOWN); | |
Copy(sig16k, signal + (2 * NB_COEF_DOWN), lg); | |
lg_down = (lg * DOWN_FAC)>>15; | |
Down_samp(signal + NB_COEF_DOWN, sig12k8, lg_down); | |
Copy(signal + lg, mem, 2 * NB_COEF_DOWN); | |
return; | |
} | |
static void Down_samp( | |
Word16 * sig, /* input: signal to downsampling */ | |
Word16 * sig_d, /* output: downsampled signal */ | |
Word16 L_frame_d /* input: length of output */ | |
) | |
{ | |
Word32 i, j, frac, pos; | |
Word16 *x, *y; | |
Word32 L_sum; | |
pos = 0; /* position is in Q2 -> 1/4 resolution */ | |
for (j = 0; j < L_frame_d; j++) | |
{ | |
i = (pos >> 2); /* integer part */ | |
frac = pos & 3; /* fractional part */ | |
x = sig + i - NB_COEF_DOWN + 1; | |
y = (Word16 *)(fir_down1 + frac); | |
L_sum = vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x++),(*y++)); | |
L_sum += vo_mult32((*x),(*y)); | |
L_sum = L_shl2(L_sum, 2); | |
sig_d[j] = extract_h(L_add(L_sum, 0x8000)); | |
pos += FAC5; /* pos + 5/4 */ | |
} | |
return; | |
} | |