First public contribution.
1 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
21 ** LPC analysis part of the RPE-LTP-coder
25 ** unprocessed sample frame
30 ** coded reflection coefficients
32 ** decision of tx DTX (boolean)
34 ** decision of VAD (boolean)
39 void LPC_analysis(CGSM610FR_Encoder* aEncoder, int2 ibuf[], struct codes *ecodes)
43 int2 LAR[8]; /* used for r[], LAR[], LARpp */
44 int2 rp[8]; /* used for LARp[], rp[] */
45 // int2 scalauto; /* returned from autoc to be used by vad */
48 prepr( aEncoder, ibuf, ibuf ); /* sof <- so */
49 preemp( aEncoder, ibuf, ibuf ); /* s <- sof */
50 // scalauto = autoc( L_ACF, ibuf ); /* L_ACF <- , s <- s */
51 autoc( L_ACF, ibuf ); /* L_ACF <- , s <- s */
54 ** VAD decision could be computed here when L_ACF and scalauto are available.
55 ** In current version vad is executed after LAR computation
58 schur( LAR, L_ACF ); /* r <- L_ACF */
60 larcomp( LAR, LAR ); /* LAR <- r */
62 codlar( ecodes->LARc, LAR ); /* LARc <- LAR */
63 declar( LAR, ecodes->LARc ); /* LARpp <- LARc */
65 cparc1( rp, aEncoder->LARpp_prev, LAR ); /* LARp <- LARpp_prev, LARpp */
66 crp( rp, rp ); /* rp <- LARp */
67 invfil( aEncoder, ibuf, ibuf, rp, 0, 12 ); /* d <- s */
69 cparc2( rp, aEncoder->LARpp_prev, LAR ); /* LARp <- LARpp_prev, LARpp */
70 crp( rp, rp ); /* rp <- LARp */
71 invfil( aEncoder, ibuf, ibuf, rp, 13, 26 ); /* d <- s */
73 cparc3( rp, aEncoder->LARpp_prev, LAR ); /* LARp <- LARpp_prev, LARpp */
74 crp( rp, rp ); /* rp <- LARp */
75 invfil( aEncoder, ibuf, ibuf, rp, 27, 39 ); /* d <- s*/
77 cparc4( rp, aEncoder->LARpp_prev, LAR ); /* LARp <- LARpp_prev, LARpp */
78 crp( rp, rp ); /* rp <- LARp */
79 invfil( aEncoder, ibuf, ibuf, rp, 40, 159 ); /* d <- s */
84 ** Encoding of the residual signal of the LPC analysis filter
87 ** d[k_start..k_start+39]
88 ** LPC residual (output of LPC analysis filter)
93 ** encoded LTP parameters (gain and lag)
95 ** block maximum of the encoded subframe.
97 ** coded normalized RPE pulses
99 ** return xmax for SID computation
101 int2 residual_encoder( CGSM610FR_Encoder* aEncoder, int sf_nro, int2 d[], struct sfcodes *sfc )
104 int2 xmax; /* return value */
106 /* Note: d[] is used also for for x[] and e[] */
108 int2 xM[13]; /* used for xM[], xMp[] */
109 /* xM[] is required simultaneously with xMc because LTP
112 int2 dpp[40]; /* required simultaneously with ep[] that is
118 k_start = sf_nro * 40;
120 ltpcomp( aEncoder, &(sfc->Nc), &(sfc->bc), d, k_start );
121 ltpfil( aEncoder, &d[k_start], dpp, d, sfc->bc, sfc->Nc, k_start ); /* e, dpp <- d */
122 weight( &d[k_start], &d[k_start] ); /* x <- e */
123 sfc->Mc = gridsel( xM, &d[k_start] ); /* xM <- x */
126 ** quatize residual and store unquantized xmax for SID
129 xmax = apcm( &(sfc->xmaxc), xM, sfc->xMc, &Exp, &mant);
130 /* EXP, mant computed int APCM */
132 iapcm( xM, sfc->xMc, Exp, mant ); /* xMp <- xMc */
133 gridpos( &d[k_start], xM, sfc->Mc ); /* ep <- xMc,Mc */
134 ltpupd( aEncoder, dpp, &d[k_start] ); /* dp <- dpp, x */
141 ** Decoding of the coded LPC-residual
145 ** coded block maxmimum
147 ** coded normalized RPE pulses
150 ** drp[k_start..k_start+39]
151 ** decoded LPC residual (input signal for LPC-synthesis filter)
153 void residual_decoder(CGSM610FR_Decoder* aDecoder, int sf_nro, struct sfcodes *sfc, int2 wt[])
162 k_start = sf_nro * 40;
164 /* in decoder EXP ja mant must be computed from xmaxcr */
165 expman( &EXP, &mant, sfc->xmaxc ); /* EXP, mant <- xmaxc */
166 iapcm( xMrp, sfc->xMc, EXP, mant ); /* xMrp <- xMc */
167 gridpos( erp, xMrp, sfc->Mc ); /* erp <- xMc,Mc */
169 ltpsyn( aDecoder, erp, &wt[k_start], sfc->bc, sfc->Nc );
173 ** LPC synthesis part of the RPE-LTP-coder
177 ** coded reflection coefficients
185 void LPC_synthesis(CGSM610FR_Decoder* aDecoder, struct codes *dcodes, int2 wt[], int2 obuf[])
187 int2 LARr[8]; /* used for LARr[], LARpp */
188 int2 rrp[8]; /* used for LARp[], rrp[] */
190 declar(LARr, dcodes->LARc); /* LARrpp <- LARc */
192 cparc1( rrp, aDecoder->LARrpp_prev, LARr ); /* LARp <- LARrpp_prev, LARr */
193 crp( rrp, rrp ); /* rrp <- LARp */
194 synfil( aDecoder, obuf, wt, rrp, 0, 12 ); /* sr <- wt */
196 cparc2( rrp, aDecoder->LARrpp_prev, LARr ); /* LARp <- LARrpp_prev, LARr */
197 crp( rrp, rrp ); /* rrp <- LARp */
198 synfil( aDecoder, obuf, wt, rrp, 13, 26 ); /* sr <- wt */
200 cparc3( rrp, aDecoder->LARrpp_prev, LARr ); /* LARp <- LARrpp_prev, LARr */
201 crp( rrp, rrp ); /* rrp <- LARp */
202 synfil( aDecoder, obuf, wt, rrp, 27, 39 ); /* sr <- wt */
204 cparc4( rrp, aDecoder->LARrpp_prev, LARr ); /* LARp <- LARrpp_prev, LARr */
205 crp( rrp, rrp ); /* rrp <- LARp */
206 synfil( aDecoder, obuf, wt, rrp, 40, 159 ); /* sr <- wt */
207 postpr( aDecoder, obuf, obuf );
208 /* combines deemphasis, upscaling and truncation */
216 ** void RPELTP_encoder(CGSM610FR_Encoder* aEncoder, int2 ibuf[], struct codes *ecodes)
220 ** Original speech to be coded
224 ** encoded speech stored as codewords
226 void RPELTP_encoder(CGSM610FR_Encoder* aEncoder, int2 ibuf[], struct codes *ecodes)
229 // int2 xmax[4]; /* collect unquantized xmax data for dtx */
231 LPC_analysis( aEncoder, ibuf, ecodes );
232 for (i = 0; i < 4; i++)
233 // xmax[i] = residual_encoder( aEncoder, i, ibuf, &(ecodes->sfc[i]) );
234 residual_encoder( aEncoder, i, ibuf, &(ecodes->sfc[i]) );
241 ** void RPELTP_decoder(struct codes *dcodes, int2 obuf[])
244 ** encoded speech stored as codewords to be decoded
250 void RPELTP_decoder(CGSM610FR_Decoder* aDecoder, struct codes *dcodes, int2 obuf[])
254 dcodes->LARc[0] &= 0x7fff; /* VAD flag in sequences */
255 dcodes->LARc[1] &= 0x7fff; /* SP flag in sequences */
257 for (i = 0; i < 4; i++)
258 residual_decoder(aDecoder, i, &(dcodes->sfc[i]), obuf); /* -> wt */
260 LPC_synthesis(aDecoder, dcodes, obuf, obuf); /* wt -> srop */