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