You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

72 lines
3.8 KiB

/*
* Copyright (c) 2011-2019 Belledonne Communications SARL.
*
* This file is part of bcg729.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "typedef.h"
#include "codecParameters.h"
#include "basicOperationsMacros.h"
/*****************************************************************************/
/* decodeFixedCodeVector : compute the fixed codebook vector as in spec 4.1.4*/
/* parameters: */
/* -(i) signs: parameter S(4 signs bit) eq61 */
/* -(i) positions: parameter C(4 3bits position and jx bit) eq62 */
/* -(i) intPitchDelay: integer part of pitch Delay (T) */
/* -(i) boundedPitchGain: Beta in eq47 and eq48, in Q14 */
/* -(o) fixedCodebookVector: 40 values in Q13, range: [-1.8,+1.8] */
/* */
/*****************************************************************************/
void decodeFixedCodeVector(uint16_t signs, uint16_t positions, int16_t intPitchDelay, word16_t boundedPitchGain,
word16_t *fixedCodebookVector)
{
uint16_t positionsArray[4];
uint16_t jx;
int i;
/* get the positions into an array: mapping according to eq62 and table7 in spec 3.8 */
positionsArray[0] = (positions&(uint16_t)7)*5; /* m0 = 5*C, do not use macro here as whatever fixed or floating point computation we use, these are integers */
positions = SHR(positions, 3); /* shift right by 3 to get the 3 next bits(m1/5) as LSB */
positionsArray[1] = ((positions&(uint16_t)7)*5) + 1; /* m1 = 5*C + 1, do not use macro here as whatever fixed or floating point computation we use, these are integers */
positions = SHR(positions, 3); /* shift right by 3 to get the 3 next bits(m2/5) as LSB */
positionsArray[2] = ((positions&(uint16_t)7)*5) + 2; /* m2 = 5*C + 2, do not use macro here as whatever fixed or floating point computation we use, these are integers */
positions = SHR(positions, 3); /* shift right by 3 to get the last 4 bits(m3/5 and jx) as LSB */
jx = positions&(uint16_t)1; /* jx from eq62 is the last bit */
positions = SHR(positions, 1); /* shift right by 1 to get the last 3 bits as LSB */
positionsArray[3] = ((positions&(uint16_t)7)*5) + 3 + jx; /* m3 = 5*C + 3 + jx, do not use macro here as whatever fixed or floating point computation we use, these are integers */
/* initialise the output Vector */
for (i=0; i<L_SUBFRAME; i++) {
fixedCodebookVector[i]=0;
}
/* get the signs and compute the fixedCodebookVector */
for (i=0; i<4; i++) {
if ((signs&(uint16_t)1) != 0) { /* sign bit is 1 */
fixedCodebookVector[positionsArray[i]] = 8192; /* +1 in Q13 */
} else {
fixedCodebookVector[positionsArray[i]] = -8192; /* -1 in Q13 */
}
signs = SHR(signs, 1); /* shift signs right by one to get the next sign bit at next loop */
}
/* if intPitchDelay is smaller than subframe length, give some correction using boundedPitchGain according to eq48 */
for (i=intPitchDelay; i<L_SUBFRAME; i++) {
/* fixedCodebookVector[i] = fixedCodebookVector[i] + fixedCodebookVector[i-intPitchDelay]*boundedPitchGain */
fixedCodebookVector[i] = ADD16(fixedCodebookVector[i], MULT16_16_P14(fixedCodebookVector[i-intPitchDelay], boundedPitchGain));
}
}