annotate libgsmhr1/sp_dec.c @ 603:27df1cef042c

libgsmhr1: put aToRc() only in dec_func.c This function was originally static in sp_dec.c, but now it is needed both in sp_dec.c and in dec_func.c shared decoder+encoder functions. Solution: give it intermodule linkage, and let it reside in dec_func.c only.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 04 Dec 2025 19:05:38 +0000
parents c7c03231002d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * File Name: sp_dec.c
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * Purpose:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * Contains all functions for decoding speech. It does not
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 * include those routines needed to decode channel information.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 * Since the GSM half-rate speech coder is an analysis-by-synthesis
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 * coder, many of the routines in this file are also called by the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 * encoder. Functions are included for coded-parameter lookup,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 * LPC filter coefficient interpolation, excitation vector lookup
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 * and construction, vector quantized gain lookup, and LPC synthesis
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 * filtering. In addition, some post-processing functions are
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 * included.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 * Below is a listing of all the functions appearing in the file.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 * The functions are arranged according to their purpose. Under
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 * each heading, the ordering is hierarchical.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 * The entire speech decoder, under which all these routines fall,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 * except were noted:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 * speechDecoder()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 * Spectral Smoothing of LPC:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 * a_sst()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 * aFlatRcDp()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 * rcToCorrDpL()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 * aToRc()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 * rcToADp()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 * VSELP codevector construction:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 * b_con()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 * v_con()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 * LTP vector contruction:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 * fp_ex()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 * get_ipjj()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 * lagDecode()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 * LPC contruction
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 * getSfrmLpc()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 * interpolateCheck()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 * res_eng()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 * lookupVq()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 * Excitation scaling:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 * rs_rr()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 * g_corr1() (no scaling)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 * rs_rrNs()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 * g_corr1s() (g_corr1 with scaling)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 * scaleExcite()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 * Post filtering:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 * pitchPreFilt()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 * agcGain()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 * lpcIir()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 * r0BasedEnergyShft()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 * spectralPostFilter()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 * lpcFir()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 * Routines not referenced by speechDecoder()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 * Filtering routines:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 * lpcIrZsIir()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 * lpcZiIir()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 * lpcZsFir()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 * lpcZsIir()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 * lpcZsIirP()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 * Square root:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 * sqroot()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 **************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 | Include Files |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
76 #include <stddef.h>
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
77 #include <stdint.h>
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
78 #include <string.h>
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 #include "typedefs.h"
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
80 #include "tw_gsmhr.h"
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
81 #include "namespace.h"
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 #include "mathhalf.h"
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
83 #include "dec_func.h"
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
84 #include "dec_state.h"
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
85 #include "dtx_const.h"
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
86 #include "dtx_dec.h"
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
87 #include "err_conc.h"
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
88 #include "rxfe.h"
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 #include "sp_rom.h"
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 | Local Functions (scope is limited to this file) |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 static void a_sst(Shortword swAshift, Shortword swAscale,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 Shortword pswDirectFormCoefIn[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 Shortword pswDirectFormCoefOut[]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
102 static Shortword lagDecode(Shortword swDeltaLag, Shortword *pswLastLag,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
103 Shortword subfrm);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
104
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 static Shortword agcGain(Shortword pswStateCurr[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 struct NormSw snsInSigEnergy,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 Shortword swEngyRShft);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 static void lookupVq(Shortword pswVqCodeWds[], Shortword pswRCOut[]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 static void pitchPreFilt(Shortword pswExcite[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 Shortword swRxGsp0,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 Shortword swRxLag,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 Shortword swUvCode,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 Shortword swSemiBeta,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 struct NormSw snsSqrtRs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 Shortword pswExciteOut[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 Shortword pswPPreState[]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
120 static void spectralPostFilter(struct gsmhr_decoder_state *st,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
121 Shortword swEngyRShift,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
122 Shortword pswSPFIn[], Shortword pswNumCoef[],
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
123 Shortword pswDenomCoef[],
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
124 Shortword pswSPFOut[]);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 | Local Defines |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 #define P_INT_MACS 10
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 #define ASCALE 0x0800
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 #define ASHIFT 4
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 #define DELTA_LEVELS 16
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 #define GSP0_SCALE 1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 #define C_BITS_V 9 /* number of bits in any voiced VSELP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 * codeword */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 #define C_BITS_UV 7 /* number of bits in a unvoiced VSELP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 * codeword */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 #define MAXBITS C_BITS_V /* max number of bits in any VSELP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 * codeword */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 #define SQRT_ONEHALF 0x5a82 /* the 0.5 ** 0.5 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 #define LPC_ROUND 0x00000800L /* 0x8000 >> ASHIFT */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 #define AFSHIFT 2 /* number of right shifts to be
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 * applied to the autocorrelation
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 * sequence in aFlatRcDp */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
149 #define PCM_MASK 0xfff8 /* 16 to 13 bit linear PCM mask */
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 * FUNCTION NAME: a_sst
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 * The purpose of this function is to perform spectral smoothing of the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 * direct form filter coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 * swAshift
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 * number of shift for coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 * swAscale
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 * scaling factor for coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 * pswDirectFormCoefIn[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 * array of input direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 * pswDirectFormCoefOut[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 * array of output direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 * In a_sst() direct form coefficients are converted to
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 * autocorrelations, and smoothed in that domain. The function is
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 * used in the spectral postfilter. A description can be found in
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 * section 3.2.4 as well as in the reference by Y. Tohkura et al.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 * "Spectral Smoothing Technique in PARCOR Speech
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 * Analysis-Synthesis", IEEE Trans. ASSP, vol. ASSP-26, pp. 591-596,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 * Dec. 1978.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 * After smoothing is performed conversion back to direct form
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 * coefficients is done by calling aFlatRc(), followed by rcToADp().
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 * The spectral smoothing filter coefficients with bandwidth set to 300
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 * and a sampling rate of 8000 be :
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 * static ShortwordRom psrSST[NP+1] = { 0x7FFF,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 * 0x7F5C, 0x7D76, 0x7A5B, 0x7622, 0x70EC,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 * 0x6ADD, 0x641F, 0x5CDD, 0x5546, 0x4D86
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 * }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 * REFERENCES: Sub_Clause 4.2.4 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 * KEYWORDS: spectral smoothing, direct form coef, sst, atorc, atocor
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 * KEYWORDS: levinson
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 static void a_sst(Shortword swAshift, Shortword swAscale,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 Shortword pswDirectFormCoefIn[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 Shortword pswDirectFormCoefOut[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 | Local Static Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
220 static const ShortwordRom psrSST[NP + 1] = {0x7FFF,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 0x7F5C, 0x7D76, 0x7A5B, 0x7622, 0x70EC,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 0x6ADD, 0x641F, 0x5CDD, 0x5546, 0x4D86,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 };
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 Longword pL_CorrTemp[NP + 1];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 Shortword pswRCNum[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 pswRCDenom[NP];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236 short int siLoopCnt;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 /* convert direct form coefs to reflection coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 /* --------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 aToRc(swAshift, pswDirectFormCoefIn, pswRCDenom);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 /* convert to autocorrelation coefficients */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250 /* --------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 rcToCorrDpL(swAshift, swAscale, pswRCDenom, pL_CorrTemp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 /* do spectral smoothing technique */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255 /* ------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257 for (siLoopCnt = 1; siLoopCnt <= NP; siLoopCnt++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 pL_CorrTemp[siLoopCnt] = L_mpy_ls(pL_CorrTemp[siLoopCnt],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260 psrSST[siLoopCnt]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263 /* Compute the reflection coefficients via AFLAT */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 /*-----------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 aFlatRcDp(pL_CorrTemp, pswRCNum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 /* Convert reflection coefficients to direct form filter coefficients */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270 /*-------------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272 rcToADp(swAscale, pswRCNum, pswDirectFormCoefOut);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275 /**************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277 * FUNCTION NAME: agcGain
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
279 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281 * Figure out what the agc gain should be to make the energy in the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282 * output signal match that of the input signal. Used in the post
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 * filters.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285 * INPUT:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 * pswStateCurr[0:39]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288 * Input signal into agc block whose energy is
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289 * to be modified using the gain returned. Signal is not
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290 * modified in this routine.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292 * snsInSigEnergy
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 * Normalized number with shift count - the energy in
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294 * the input signal.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296 * swEngyRShft
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297 * Number of right shifts to apply to the vectors energy
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298 * to ensure that it remains less than 1.0
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 * (swEngyRShft is always positive or zero)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 * OUTPUT:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305 * RETURN:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 * the agc's gain/2 note DIVIDED by 2
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 * REFERENCES: Sub_Clause 4.2.2 and 4.2.4 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312 * KEYWORDS: postfilter, agc, automaticgaincontrol, leveladjust
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316 static Shortword agcGain(Shortword pswStateCurr[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 struct NormSw snsInSigEnergy, Shortword swEngyRShft)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
319
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
320 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
321 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 Longword L_OutEnergy,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327 L_AgcGain;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
328
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 struct NormSw snsOutEnergy,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 snsAgc;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
331
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
332 Shortword swAgcOut,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
333 swAgcShftCnt;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
334
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
335 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
336 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
337 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
338 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
339 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
340
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
341 /* Calculate the energy in the output vector divided by 2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
342 /*--------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
343
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
344 snsOutEnergy.sh = g_corr1s(pswStateCurr, swEngyRShft, &L_OutEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
345
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
346 /* reduce energy by a factor of 2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347 snsOutEnergy.sh = add(snsOutEnergy.sh, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
348
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
349 /* if waveform has nonzero energy, find AGC gain */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
350 /*-----------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
351
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
352 if (L_OutEnergy == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
353 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
354 swAgcOut = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
355 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
356 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
357 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
358
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
359 snsOutEnergy.man = round(L_OutEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
360
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
361 /* divide input energy by 2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
362 snsInSigEnergy.man = shr(snsInSigEnergy.man, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
363
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
364
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
365 /* Calculate AGC gain squared */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
366 /*----------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
367
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
368 snsAgc.man = divide_s(snsInSigEnergy.man, snsOutEnergy.man);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
369 swAgcShftCnt = norm_s(snsAgc.man);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
370 snsAgc.man = shl(snsAgc.man, swAgcShftCnt);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
371
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
372 /* find shift count for G^2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
373 /*--------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
374
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
375 snsAgc.sh = add(sub(snsInSigEnergy.sh, snsOutEnergy.sh),
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
376 swAgcShftCnt);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
377 L_AgcGain = L_deposit_h(snsAgc.man);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
378
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
379
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
380 /* Calculate AGC gain */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
381 /*--------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
382
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
383 snsAgc.man = sqroot(L_AgcGain);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
384
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
385
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
386 /* check if 1/2 sqrt(G^2) >= 1.0 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
387 /* This is equivalent to checking if shiftCnt/2+1 < 0 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
388 /*----------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
389
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
390 if (add(snsAgc.sh, 2) < 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
391 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
392 swAgcOut = SW_MAX;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
393 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
394 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
395 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
396
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
397 if (0x1 & snsAgc.sh)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
398 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
399 snsAgc.man = mult(snsAgc.man, SQRT_ONEHALF);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
400 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
401
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
402 snsAgc.sh = shr(snsAgc.sh, 1); /* shiftCnt/2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
403 snsAgc.sh = add(snsAgc.sh, 1); /* shiftCnt/2 + 1 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
404
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
405 if (snsAgc.sh > 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
406 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
407 snsAgc.man = shr(snsAgc.man, snsAgc.sh);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
408 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
409 swAgcOut = snsAgc.man;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
410 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
411 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
412
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
413 return (swAgcOut);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
414 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
415
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
416 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
417 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
418 * FUNCTION NAME: lagDecode
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
419 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
420 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
421 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
422 * The purpose of this function is to decode the lag received from the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
423 * speech encoder into a full resolution lag for the speech decoder
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
424 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
425 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
426 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
427 * swDeltaLag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
428 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
429 * lag received from channel decoder
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
430 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
431 * giSfrmCnt
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
432 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
433 * current sub-frame count
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
434 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
435 * swLastLag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
436 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
437 * previous lag to un-delta this sub-frame's lag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
438 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
439 * psrLagTbl[0:255]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
440 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
441 * table used to look up full resolution lag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
442 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
443 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
444 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
445 * swLastLag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
446 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
447 * new previous lag for next sub-frame
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
448 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
449 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
450 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
451 * swLag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
452 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
453 * decoded full resolution lag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
454 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
455 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
456 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
457 * If first subframe, use lag as index to look up table directly.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
458 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
459 * If it is one of the other subframes, the codeword represents a
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
460 * delta offset. The previously decoded lag is used as a starting
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
461 * point for decoding the current lag.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
462 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
463 * REFERENCES: Sub-clause 4.2.1 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
464 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
465 * KEYWORDS: deltalags, lookup lag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
466 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
467 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
468
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
469 static Shortword lagDecode(Shortword swDeltaLag, Shortword *pswLastLag,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
470 Shortword subfrm)
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
471 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
472
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
473 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
474 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
475 | Local Constants |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
476 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
477 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
478
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
479 #define DELTA_LEVELS_D2 DELTA_LEVELS/2
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
480 #define MAX_LAG 0x00ff
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
481 #define MIN_LAG 0x0000
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
482
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
483 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
484 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
485 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
486 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
487 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
488
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
489 Shortword swLag;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
490
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
491 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
492 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
493 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
494 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
495 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
496
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
497 /* first sub-frame */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
498 /* --------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
499
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
500 if (subfrm == 0)
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
501 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
502 *pswLastLag = swDeltaLag;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
503 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
504
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
505 /* remaining sub-frames */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
506 /* -------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
507
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
508 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
509 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
510
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
511 /* get lag biased around 0 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
512 /* ----------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
513
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
514 swLag = sub(swDeltaLag, DELTA_LEVELS_D2);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
515
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
516 /* get real lag relative to last */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
517 /* ----------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
518
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
519 swLag = add(swLag, *pswLastLag);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
520
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
521 /* clip to max or min */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
522 /* ------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
523
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
524 if (sub(swLag, MAX_LAG) > 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
525 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
526 *pswLastLag = MAX_LAG;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
527 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
528 else if (sub(swLag, MIN_LAG) < 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
529 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
530 *pswLastLag = MIN_LAG;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
531 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
532 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
533 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
534 *pswLastLag = swLag;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
535 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
536 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
537
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
538 /* return lag after look up */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
539 /* ------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
540
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
541 swLag = psrLagTbl[*pswLastLag];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
542 return (swLag);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
543 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
544
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
545 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
546 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
547 * FUNCTION NAME: lookupVq
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
548 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
549 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
550 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
551 * The purpose of this function is to recover the reflection coeffs from
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
552 * the received LPC codewords.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
553 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
554 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
555 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
556 * pswVqCodeWds[0:2]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
557 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
558 * the codewords for each of the segments
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
559 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
560 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
561 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
562 * pswRCOut[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
563 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
564 * the decoded reflection coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
565 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
566 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
567 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
568 * none.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
569 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
570 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
571 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
572 * For each segment do the following:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
573 * setup the retrieval pointers to the correct vector
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
574 * get that vector
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
575 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
576 * REFERENCES: Sub-clause 4.2.3 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
577 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
578 * KEYWORDS: vq, vectorquantizer, lpc
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
579 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
580 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
581
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
582 static void lookupVq(Shortword pswVqCodeWds[], Shortword pswRCOut[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
583 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
584 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
585 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
586 | Local Constants |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
587 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
588 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
589
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
590 #define LSP_MASK 0x00ff
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
591
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
592 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
593 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
594 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
595 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
596 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
597
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
598 short int siSeg,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
599 siIndex,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
600 siVector,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
601 siVector1,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
602 siVector2,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
603 siWordPtr;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
604
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
605 const ShortwordRom *psrQTable;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
606
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
607 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
608 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
609 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
610 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
611 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
612
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
613 /* for each segment */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
614 /* ---------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
615
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
616 for (siSeg = 0; siSeg < QUANT_NUM_OF_TABLES; siSeg++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
617 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
618
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
619 siVector = pswVqCodeWds[siSeg];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
620 siIndex = psvqIndex[siSeg].l;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
621
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
622 if (sub(siSeg, 2) == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
623 { /* segment 3 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
624
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
625 /* set table */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
626 /* --------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
627
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
628 psrQTable = psrQuant3;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
629
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
630 /* set offset into table */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
631 /* ---------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
632
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
633 siWordPtr = add(siVector, siVector);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
634
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
635 /* look up coeffs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
636 /* -------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
637
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
638 siVector1 = psrQTable[siWordPtr];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
639 siVector2 = psrQTable[siWordPtr + 1];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
640
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
641 pswRCOut[siIndex - 1] = psrSQuant[shr(siVector1, 8) & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
642 pswRCOut[siIndex] = psrSQuant[siVector1 & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
643 pswRCOut[siIndex + 1] = psrSQuant[shr(siVector2, 8) & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
644 pswRCOut[siIndex + 2] = psrSQuant[siVector2 & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
645 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
646 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
647 { /* segments 1 and 2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
648
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
649 /* set tables */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
650 /* ---------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
651
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
652 if (siSeg == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
653 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
654 psrQTable = psrQuant1;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
655 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
656 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
657 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
658 psrQTable = psrQuant2;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
659
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
660 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
661
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
662 /* set offset into table */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
663 /* --------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
664
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
665 siWordPtr = add(siVector, siVector);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
666 siWordPtr = add(siWordPtr, siVector);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
667 siWordPtr = shr(siWordPtr, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
668
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
669 /* look up coeffs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
670 /* -------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
671
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
672 siVector1 = psrQTable[siWordPtr];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
673 siVector2 = psrQTable[siWordPtr + 1];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
674
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
675 if ((siVector & 0x0001) == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
676 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
677 pswRCOut[siIndex - 1] = psrSQuant[shr(siVector1, 8) & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
678 pswRCOut[siIndex] = psrSQuant[siVector1 & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
679 pswRCOut[siIndex + 1] = psrSQuant[shr(siVector2, 8) & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
680 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
681 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
682 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
683 pswRCOut[siIndex - 1] = psrSQuant[siVector1 & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
684 pswRCOut[siIndex] = psrSQuant[shr(siVector2, 8) & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
685 pswRCOut[siIndex + 1] = psrSQuant[siVector2 & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
686 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
687 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
688 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
689 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
690
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
691 /**************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
692 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
693 * FUNCTION NAME: pitchPreFilt
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
694 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
695 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
696 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
697 * Performs pitch pre-filter on excitation in speech decoder.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
698 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
699 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
700 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
701 * pswExcite[0:39]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
702 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
703 * Synthetic residual signal to be filtered, a subframe-
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
704 * length vector.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
705 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
706 * ppsrPVecIntFilt[0:9][0:5] ([tap][phase])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
707 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
708 * Interpolation filter coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
709 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
710 * ppsrSqtrP0[0:2][0:31] ([voicing level-1][gain code])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
711 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
712 * Sqrt(P0) look-up table, used to determine pitch
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
713 * pre-filtering coefficient.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
714 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
715 * swRxGsp0
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
716 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
717 * Coded value from gain quantizer, used to look up
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
718 * sqrt(P0).
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
719 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
720 * swRxLag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
721 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
722 * Full-resolution lag value (fractional lag *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
723 * oversampling factor), used to index pitch pre-filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
724 * state.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
725 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
726 * swUvCode
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
727 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
728 * Coded voicing level, used to distinguish between
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
729 * voiced and unvoiced conditions, and to look up
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
730 * sqrt(P0).
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
731 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
732 * swSemiBeta
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
733 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
734 * The gain applied to the adaptive codebook excitation
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
735 * (long-term predictor excitation) limited to a maximum
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
736 * of 1.0, used to determine the pitch pre-filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
737 * coefficient.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
738 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
739 * snsSqrtRs
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
740 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
741 * The estimate of the energy in the residual, used only
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
742 * for scaling.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
743 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
744 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
745 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
746 * pswExciteOut[0:39]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
747 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
748 * The output pitch pre-filtered excitation.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
749 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
750 * pswPPreState[0:44]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
751 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
752 * Contains the state of the pitch pre-filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
753 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
754 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
755 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
756 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
757 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
758 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
759 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
760 * If the voicing mode for the frame is unvoiced, then the pitch pre-
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
761 * filter state is updated with the input excitation, and the input
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
762 * excitation is copied to the output.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
763 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
764 * If voiced: first the energy in the input excitation is calculated.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
765 * Then, the coefficient of the pitch pre-filter is obtained:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
766 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
767 * PpfCoef = POST_EPSILON * min(beta, sqrt(P0)).
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
768 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
769 * Then, the pitch pre-filter is performed:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
770 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
771 * ex_p(n) = ex(n) + PpfCoef * ex_p(n-L)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
772 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
773 * The ex_p(n-L) sample is interpolated from the surrounding samples,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
774 * even for integer values of L.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
775 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
776 * Note: The coefficients of the interpolating filter are multiplied
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
777 * by PpfCoef, rather multiplying ex_p(n_L) after interpolation.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
778 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
779 * Finally, the energy in the output excitation is calculated, and
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
780 * automatic gain control is applied to the output signal so that
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
781 * its energy matches the original.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
782 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
783 * The pitch pre-filter is described in section 4.2.2.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
784 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
785 * REFERENCES: Sub-clause 4.2.2 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
786 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
787 * KEYWORDS: prefilter, pitch, pitchprefilter, excitation, residual
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
788 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
789 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
790
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
791 static void pitchPreFilt(Shortword pswExcite[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
792 Shortword swRxGsp0,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
793 Shortword swRxLag, Shortword swUvCode,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
794 Shortword swSemiBeta, struct NormSw snsSqrtRs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
795 Shortword pswExciteOut[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
796 Shortword pswPPreState[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
797 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
798
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
799 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
800 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
801 | Local Constants |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
802 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
803 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
804
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
805 #define POST_EPSILON 0x2666
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
806
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
807 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
808 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
809 | Local Static Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
810 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
811 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
812
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
813
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
814 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
815 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
816 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
817 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
818 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
819
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
820 Longword L_1,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
821 L_OrigEnergy;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
822
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
823 Shortword swScale,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
824 swSqrtP0,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
825 swIntLag,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
826 swRemain,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
827 swEnergy,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
828 pswInterpCoefs[P_INT_MACS];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
829
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
830 short int i,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
831 j;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
832
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
833 struct NormSw snsOrigEnergy;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
834
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
835 Shortword *pswPPreCurr = &pswPPreState[LTP_LEN];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
836
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
837 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
838 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
839 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
840 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
841 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
842
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
843 /* Initialization */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
844 /*----------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
845
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
846 swEnergy = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
847
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
848 /* Check voicing level */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
849 /*---------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
850
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
851 if (swUvCode == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
852 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
853
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
854 /* Unvoiced: perform one subframe of delay on state, copy input to */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
855 /* state, copy input to output (if not same) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
856 /*-----------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
857
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
858 for (i = 0; i < LTP_LEN - S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
859 pswPPreState[i] = pswPPreState[i + S_LEN];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
860
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
861 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
862 pswPPreState[i + LTP_LEN - S_LEN] = pswExcite[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
863
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
864 if (pswExciteOut != pswExcite)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
865 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
866
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
867 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
868 pswExciteOut[i] = pswExcite[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
869 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
870 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
871 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
872 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
873
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
874 /* Voiced: calculate energy in input, filter, calculate energy in */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
875 /* output, scale */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
876 /*----------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
877
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
878 /* Get energy in input excitation vector */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
879 /*---------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
880
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
881 swEnergy = add(negate(shl(snsSqrtRs.sh, 1)), 3);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
882
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
883 if (swEnergy > 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
884 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
885
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
886 /* High-energy residual: scale input vector during energy */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
887 /* calculation. The shift count + 1 of the energy of the */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
888 /* residual estimate is used as an estimate of the shift */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
889 /* count needed for the excitation energy */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
890 /*--------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
891
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
892
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
893 snsOrigEnergy.sh = g_corr1s(pswExcite, swEnergy, &L_OrigEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
894 snsOrigEnergy.man = round(L_OrigEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
895
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
896 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
897 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
898 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
899
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
900 /* set shift count to zero for AGC later */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
901 /*---------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
902
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
903 swEnergy = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
904
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
905 /* Lower-energy residual: no overflow protection needed */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
906 /*------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
907
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
908 L_OrigEnergy = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
909 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
910 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
911
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
912 L_OrigEnergy = L_mac(L_OrigEnergy, pswExcite[i], pswExcite[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
913 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
914
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
915 snsOrigEnergy.sh = norm_l(L_OrigEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
916 snsOrigEnergy.man = round(L_shl(L_OrigEnergy, snsOrigEnergy.sh));
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
917 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
918
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
919 /* Determine pitch pre-filter coefficient, and scale the appropriate */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
920 /* phase of the interpolating filter by it */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
921 /*-------------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
922
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
923 swSqrtP0 = ppsrSqrtP0[swUvCode - 1][swRxGsp0];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
924
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
925 if (sub(swSqrtP0, swSemiBeta) > 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
926 swScale = swSemiBeta;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
927 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
928 swScale = swSqrtP0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
929
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
930 swScale = mult_r(POST_EPSILON, swScale);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
931
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
932 get_ipjj(swRxLag, &swIntLag, &swRemain);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
933
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
934 for (i = 0; i < P_INT_MACS; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
935 pswInterpCoefs[i] = mult_r(ppsrPVecIntFilt[i][swRemain], swScale);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
936
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
937 /* Perform filter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
938 /*----------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
939
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
940 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
941 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
942
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
943 L_1 = L_deposit_h(pswExcite[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
944
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
945 for (j = 0; j < P_INT_MACS - 1; j++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
946 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
947
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
948 L_1 = L_mac(L_1, pswPPreCurr[i - swIntLag - P_INT_MACS / 2 + j],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
949 pswInterpCoefs[j]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
950 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
951
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
952 pswPPreCurr[i] = mac_r(L_1,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
953 pswPPreCurr[i - swIntLag + P_INT_MACS / 2 - 1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
954 pswInterpCoefs[P_INT_MACS - 1]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
955 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
956
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
957 /* Get energy in filtered vector, determine automatic-gain-control */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
958 /* scale factor */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
959 /*-----------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
960
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
961 swScale = agcGain(pswPPreCurr, snsOrigEnergy, swEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
962
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
963 /* Scale filtered vector by AGC, put out. NOTE: AGC scale returned */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
964 /* by routine above is divided by two, hence the shift below */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
965 /*------------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
966
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
967 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
968 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
969
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
970 L_1 = L_mult(pswPPreCurr[i], swScale);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
971 L_1 = L_shl(L_1, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
972 pswExciteOut[i] = round(L_1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
973 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
974
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
975 /* Update pitch pre-filter state */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
976 /*-------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
977
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
978 for (i = 0; i < LTP_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
979 pswPPreState[i] = pswPPreState[i + S_LEN];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
980 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
981 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
982
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
983 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
984 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
985 * FUNCTION NAME: spectralPostFilter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
986 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
987 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
988 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
989 * Perform spectral post filter on the output of the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
990 * synthesis filter.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
991 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
992 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
993 * INPUT:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
994 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
995 * S_LEN a global constant
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
996 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
997 * pswSPFIn[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
998 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
999 * input to the routine. Unmodified
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1000 * pswSPFIn[0] is the oldest point (first to be filtered),
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1001 * pswSPFIn[iLen-1] is the last pointer filtered,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1002 * the newest.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1003 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1004 * pswNumCoef[0:NP-1],pswDenomCoef[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1005 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1006 * numerator and denominator
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1007 * direct form coeffs used by postfilter.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1008 * Exactly like lpc coefficients in format. Shifted down
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1009 * by iAShift to ensure that they are < 1.0.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1010 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1011 * gpswPostFiltStateNum[0:NP-1], gpswPostFiltStateDenom[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1012 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1013 * array of the filter state.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1014 * Same format as coefficients: *praState = state of
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1015 * filter for delay n = -1 praState[NP] = state of
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1016 * filter for delay n = -NP These numbers are not
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1017 * shifted at all. These states are static to this
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1018 * file.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1019 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1020 * OUTPUT:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1021 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1022 * gpswPostFiltStateNum[0:NP-1], gpswPostFiltStateDenom[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1023 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1024 * See above for description. These are updated.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1025 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1026 * pswSPFOut[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1027 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1028 * same format as pswSPFIn,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1029 * *pswSPFOut is oldest point. The filtered output.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1030 * Note this routine can handle pswSPFOut = pswSPFIn.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1031 * output can be the same as input. i.e. in place
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1032 * calculation.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1033 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1034 * RETURN:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1035 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1036 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1037 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1038 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1039 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1040 * find energy in input,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1041 * perform the numerator fir
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1042 * perform the denominator iir
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1043 * perform the post emphasis
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1044 * find energy in signal,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1045 * perform the agc using energy in and energy in signam after
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1046 * post emphasis signal
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1047 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1048 * The spectral postfilter is described in section 4.2.4.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1049 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1050 * REFERENCES: Sub-clause 4.2.4 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1051 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1052 * KEYWORDS: postfilter, emphasis, postemphasis, brightness,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1053 * KEYWORDS: numerator, deminator, filtering, lpc,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1054 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1055 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1056
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1057 static void spectralPostFilter(struct gsmhr_decoder_state *st,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1058 Shortword swEngyRShift,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1059 Shortword pswSPFIn[], Shortword pswNumCoef[],
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1060 Shortword pswDenomCoef[],
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1061 Shortword pswSPFOut[])
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1062 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1063 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1064 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1065 | Local Constants |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1066 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1067 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1068
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1069 #define AGC_COEF (Shortword)0x19a /* (1.0 - POST_AGC_COEF)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1070 * 1.0-.9875 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1071 #define POST_EMPHASIS (Shortword)0x199a /* 0.2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1072
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1073 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1074 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1075 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1076 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1077 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1078
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1079 short int i;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1080
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1081 Longword L_OrigEnergy,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1082 L_runningGain,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1083 L_Output;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1084
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1085 Shortword swAgcGain,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1086 swRunningGain,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1087 swTemp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1088
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1089 struct NormSw snsOrigEnergy;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1090
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1091 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1092 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1093 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1094 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1095 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1096
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1097 /* calculate the energy in the input and save it */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1098 /*-----------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1099
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1100 snsOrigEnergy.sh = g_corr1s(pswSPFIn, swEngyRShift, &L_OrigEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1101 snsOrigEnergy.man = round(L_OrigEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1102
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1103 /* numerator of the postfilter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1104 /*-----------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1105
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1106 lpcFir(pswSPFIn, pswNumCoef, st->gpswPostFiltStateNum, pswSPFOut);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1107
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1108 /* denominator of the postfilter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1109 /*-------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1110
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1111 lpcIir(pswSPFOut, pswDenomCoef, st->gpswPostFiltStateDenom, pswSPFOut);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1112
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1113 /* postemphasis section of postfilter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1114 /*------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1115
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1116 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1117 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1118 swTemp = msu_r(L_deposit_h(pswSPFOut[i]), st->swPostEmphasisState,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1119 POST_EMPHASIS);
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1120 st->swPostEmphasisState = pswSPFOut[i];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1121 pswSPFOut[i] = swTemp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1122 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1123
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1124 swAgcGain = agcGain(pswSPFOut, snsOrigEnergy, swEngyRShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1125
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1126 /* scale the speech vector */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1127 /*-----------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1128
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1129 swRunningGain = st->gswPostFiltAgcGain;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1130 L_runningGain = L_deposit_h(st->gswPostFiltAgcGain);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1131 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1132 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1133 L_runningGain = L_msu(L_runningGain, swRunningGain, AGC_COEF);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1134 L_runningGain = L_mac(L_runningGain, swAgcGain, AGC_COEF);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1135 swRunningGain = extract_h(L_runningGain);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1136
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1137 /* now scale input with gain */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1138
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1139 L_Output = L_mult(swRunningGain, pswSPFOut[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1140 pswSPFOut[i] = extract_h(L_shl(L_Output, 2));
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1141 }
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1142 st->gswPostFiltAgcGain = swRunningGain;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1143
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1144 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1145
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1146 void gsmhr_decode_frame(struct gsmhr_decoder_state *st,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1147 const int16_t *param_in, int16_t *pcm_out)
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1148 {
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1149 int16_t param_preened[GSMHR_NUM_PARAMS];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1150
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1151 Shortword *pswLtpStateOut = &st->pswLtpStateBaseDec[LTP_LEN];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1152 Shortword pswSythAsSpace[NP * N_SUB];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1153 Shortword pswPFNumAsSpace[NP * N_SUB];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1154 Shortword pswPFDenomAsSpace[NP * N_SUB];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1155
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1156 Shortword *ppswSynthAs[N_SUB] = {
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1157 &pswSythAsSpace[0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1158 &pswSythAsSpace[10],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1159 &pswSythAsSpace[20],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1160 &pswSythAsSpace[30],
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1161 };
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1162
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1163 Shortword *ppswPFNumAs[N_SUB] = {
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1164 &pswPFNumAsSpace[0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1165 &pswPFNumAsSpace[10],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1166 &pswPFNumAsSpace[20],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1167 &pswPFNumAsSpace[30],
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1168 };
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1169
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1170 Shortword *ppswPFDenomAs[N_SUB] = {
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1171 &pswPFDenomAsSpace[0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1172 &pswPFDenomAsSpace[10],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1173 &pswPFDenomAsSpace[20],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1174 &pswPFDenomAsSpace[30],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1175 };
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1176
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1177 static const ShortwordRom psrSPFDenomWidenCf[NP] = {
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1178 0x6000, 0x4800, 0x3600, 0x2880, 0x1E60,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1179 0x16C8, 0x1116, 0x0CD0, 0x099C, 0x0735,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1180 };
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1181
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1182 short int i, j,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1183 giSfrmCnt,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1184 siLagCode,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1185 siGsp0Code,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1186 psiVselpCw[2],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1187 siVselpCw,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1188 siNumBits,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1189 siCodeBook;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1190
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1191 Shortword pswFrmKs[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1192 pswFrmAs[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1193 pswFrmPFNum[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1194 pswFrmPFDenom[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1195 pswPVec[S_LEN],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1196 ppswVselpEx[2][S_LEN],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1197 pswExcite[S_LEN],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1198 pswPPFExcit[S_LEN],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1199 pswSynthFiltOut[S_LEN],
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1200 swDecoMode,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1201 swR0Index,
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1202 swR0Dec,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1203 swLag,
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1204 swLastLag,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1205 swSemiBeta,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1206 pswBitArray[MAXBITS];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1207
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1208 struct NormSw psnsSqrtRs[N_SUB],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1209 snsRs00,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1210 snsRs11,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1211 snsRs22;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1212
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1213 Shortword swMutePermit,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1214 swLevelMean,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1215 swLevelMax, /* error concealment */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1216 swMuteFlag; /* error concealment */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1217
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1218 Shortword swVoicingMode, /* MODE */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1219 swSi, /* INT_LPC */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1220 swEngyRShift; /* for use by spectral postfilter */
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1221
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1222 /* initial home state processing must be done first */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1223 if (st->is_homed) {
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1224 /*
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1225 * If we got a BFI, there is no point in taking the decoder out of the
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1226 * initial state. Emit all zeros and stay homed. Most forms of
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1227 * invalid SID will also be caught here.
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1228 */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1229 if (param_in[18]) {
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1230 memset(pcm_out, 0, sizeof(int16_t) * F_LEN);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1231 return;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1232 }
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1233 /*
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1234 * Do the spec-mandated check for partial DHF. Note how we check for
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1235 * non-SID, after having weeded out BFI above.
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1236 */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1237 if (param_in[20] == 0 &&
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1238 memcmp(param_in, gsmhr_dhf_params, sizeof(int16_t) * 9) == 0) {
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1239 /* EHF output */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1240 for (i = 0; i < F_LEN; i++)
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1241 pcm_out[i] = 0x0008;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1242 return;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1243 }
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1244 }
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1245
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1246 /* integration with factored-out RxFE - different from ETSI original code */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1247 rxfe_main(&st->rxfe, param_in, param_preened, 0, &swDecoMode, &swMutePermit,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1248 NULL);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1249 swR0Index = param_preened[0]; /* R0 Index */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1250 swR0Dec = psrR0DecTbl[swR0Index * 2]; /* R0 */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1251 if (swDecoMode != CNIBFI)
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1252 lookupVq(param_preened + 1, pswFrmKs);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1253 swSi = param_preened[4]; /* INT_LPC */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1254 swVoicingMode = param_preened[5]; /* MODE */
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1255
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1256 switch (swDecoMode) {
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1257 case SPEECH:
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1258 st->swRxDTXState = CNINTPER - 1;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1259 break;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1260 case CNIFIRSTSID:
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1261 st->swRxDTXState = CNINTPER - 1;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1262 Init_CN_interpolation(st, swDecoMode, pswFrmKs);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1263 swR0Dec = CN_Interpolate_R0(st, swR0Dec);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1264 CN_Interpolate_LPC(st, pswFrmKs);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1265 break;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1266 case CNICONT:
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1267 st->swRxDTXState = 0;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1268 Init_CN_interpolation(st, swDecoMode, pswFrmKs);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1269 swR0Dec = CN_Interpolate_R0(st, swR0Dec);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1270 CN_Interpolate_LPC(st, pswFrmKs);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1271 break;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1272 case CNIBFI:
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1273 if (st->swRxDTXState < (CNINTPER - 1))
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1274 st->swRxDTXState++;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1275 swR0Dec = CN_Interpolate_R0(st, swR0Dec);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1276 CN_Interpolate_LPC(st, pswFrmKs);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1277 break;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1278 }
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1279
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1280 /* ------------------- */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1281 /* do frame processing */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1282 /* ------------------- */
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1283
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1284 /* This flag indicates whether muting is performed in the actual frame */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1285 /* ------------------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1286 swMuteFlag = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1287
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1288 /* generate the direct form coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1289 /* ------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1290
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1291 if (!rcToADp(ASCALE, pswFrmKs, pswFrmAs))
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1292 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1293 /* widen direct form coefficients using the widening coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1294 /* ------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1295
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1296 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1297 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1298 pswFrmPFDenom[i] = mult_r(pswFrmAs[i], psrSPFDenomWidenCf[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1299 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1300
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1301 a_sst(ASHIFT, ASCALE, pswFrmPFDenom, pswFrmPFNum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1302 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1303 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1304 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1305 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1306 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1307 pswFrmKs[i] = st->pswOldFrmKsDec[i];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1308 pswFrmAs[i] = st->pswOldFrmAsDec[i];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1309 pswFrmPFDenom[i] = st->pswOldFrmPFDenom[i];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1310 pswFrmPFNum[i] = st->pswOldFrmPFNum[i];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1311 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1312 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1313
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1314 /* interpolate, or otherwise get sfrm reflection coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1315 /* --------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1316
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1317 getSfrmLpc(swSi, st->swOldR0Dec, swR0Dec, st->pswOldFrmKsDec,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1318 st->pswOldFrmAsDec, st->pswOldFrmPFNum, st->pswOldFrmPFDenom,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1319 pswFrmKs, pswFrmAs,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1320 pswFrmPFNum, pswFrmPFDenom, psnsSqrtRs, ppswSynthAs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1321 ppswPFNumAs, ppswPFDenomAs);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1322
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1323 /* calculate shift for spectral postfilter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1324 /* --------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1325
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1326 swEngyRShift = r0BasedEnergyShft(swR0Index);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1327
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1328
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1329 /* ----------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1330 /* do sub-frame processing */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1331 /* ----------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1332
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1333 for (giSfrmCnt = 0; giSfrmCnt < 4; giSfrmCnt++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1334 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1335
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1336 /* copy this sub-frame's parameters */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1337 /* -------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1338
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1339 if (swVoicingMode == 0)
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1340 { /* unvoiced */
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1341 psiVselpCw[0] = param_preened[(giSfrmCnt * 3) + 6]; /* CODE_1 */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1342 psiVselpCw[1] = param_preened[(giSfrmCnt * 3) + 7]; /* CODE_2 */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1343 siGsp0Code = param_preened[(giSfrmCnt * 3) + 8]; /* GSP0 */
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1344 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1345 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1346 { /* voiced */
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1347 siLagCode = param_preened[(giSfrmCnt * 3) + 6]; /* LAG */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1348 psiVselpCw[0] = param_preened[(giSfrmCnt * 3) + 7]; /* CODE */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1349 siGsp0Code = param_preened[(giSfrmCnt * 3) + 8]; /* GSP0 */
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1350 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1351
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1352 /* for voiced mode, reconstruct the pitch vector */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1353 /* --------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1354
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1355 if (swVoicingMode)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1356 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1357
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1358 /* convert delta lag to lag and convert to fractional lag */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1359 /* ------------------------------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1360
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1361 swLag = lagDecode(siLagCode, &swLastLag, giSfrmCnt);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1362
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1363 /* state followed by out */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1364 /* --------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1365
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1366 fp_ex(swLag, pswLtpStateOut);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1367
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1368 /* extract a piece of pswLtpStateOut into newly named vector pswPVec */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1369 /* ----------------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1370
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1371 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1372 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1373 pswPVec[i] = pswLtpStateOut[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1374 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1375 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1376
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1377 /* for unvoiced, do not reconstruct a pitch vector */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1378 /* ----------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1379
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1380 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1381 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1382 swLag = 0; /* indicates invalid lag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1383 * and unvoiced */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1384 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1385
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1386 /* now work on the VSELP codebook excitation output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1387 /* x_vec, x_a_vec here named ppswVselpEx[0] and [1] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1388 /* ------------------------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1389
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1390 if (swVoicingMode)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1391 { /* voiced */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1392
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1393 siNumBits = C_BITS_V;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1394 siVselpCw = psiVselpCw[0];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1395
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1396 b_con(siVselpCw, siNumBits, pswBitArray);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1397
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1398 v_con(pppsrVcdCodeVec[0][0], ppswVselpEx[0], pswBitArray, siNumBits);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1399 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1400
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1401 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1402 { /* unvoiced */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1403
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1404 siNumBits = C_BITS_UV;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1405
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1406 for (siCodeBook = 0; siCodeBook < 2; siCodeBook++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1407 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1408
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1409 siVselpCw = psiVselpCw[siCodeBook];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1410
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1411 b_con(siVselpCw, siNumBits, (Shortword *) pswBitArray);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1412
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1413 v_con(pppsrUvCodeVec[siCodeBook][0], ppswVselpEx[siCodeBook],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1414 pswBitArray, siNumBits);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1415 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1416 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1417
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1418 /* all excitation vectors have been created: ppswVselpEx and pswPVec */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1419 /* if voiced compute rs00 and rs11; if unvoiced cmpute rs11 and rs22 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1420 /* ------------------------------------------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1421
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1422 if (swLag)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1423 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1424 rs_rr(pswPVec, psnsSqrtRs[giSfrmCnt], &snsRs00);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1425 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1426
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1427 rs_rrNs(ppswVselpEx[0], psnsSqrtRs[giSfrmCnt], &snsRs11);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1428
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1429 if (!swVoicingMode)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1430 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1431 rs_rrNs(ppswVselpEx[1], psnsSqrtRs[giSfrmCnt], &snsRs22);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1432 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1433
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1434 /* now implement synthesis - combine the excitations */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1435 /* ------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1436
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1437 if (swVoicingMode)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1438 { /* voiced */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1439
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1440 /* scale pitch and codebook excitations and get beta */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1441 /* ------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1442 swSemiBeta = scaleExcite(pswPVec,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1443 pppsrGsp0[swVoicingMode][siGsp0Code][0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1444 snsRs00, pswPVec);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1445 scaleExcite(ppswVselpEx[0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1446 pppsrGsp0[swVoicingMode][siGsp0Code][1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1447 snsRs11, ppswVselpEx[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1448
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1449 /* combine the two scaled excitations */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1450 /* ---------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1451 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1452 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1453 pswExcite[i] = add(pswPVec[i], ppswVselpEx[0][i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1454 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1455 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1456 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1457 { /* unvoiced */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1458
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1459 /* scale codebook excitations and set beta to 0 as not applicable */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1460 /* -------------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1461 swSemiBeta = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1462 scaleExcite(ppswVselpEx[0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1463 pppsrGsp0[swVoicingMode][siGsp0Code][0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1464 snsRs11, ppswVselpEx[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1465 scaleExcite(ppswVselpEx[1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1466 pppsrGsp0[swVoicingMode][siGsp0Code][1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1467 snsRs22, ppswVselpEx[1]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1468
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1469 /* combine the two scaled excitations */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1470 /* ---------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1471 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1472 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1473 pswExcite[i] = add(ppswVselpEx[1][i], ppswVselpEx[0][i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1474 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1475 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1476
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1477 /* now update the pitch state using the combined/scaled excitation */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1478 /* --------------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1479
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1480 for (i = 0; i < LTP_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1481 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1482 st->pswLtpStateBaseDec[i] = st->pswLtpStateBaseDec[i + S_LEN];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1483 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1484
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1485 /* add the current sub-frames data to the state */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1486 /* -------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1487
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1488 for (i = -S_LEN, j = 0; j < S_LEN; i++, j++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1489 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1490 pswLtpStateOut[i] = pswExcite[j];/* add new frame at t = -S_LEN */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1491 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1492
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1493 /* given the excitation perform pitch prefiltering */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1494 /* ----------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1495
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1496 pitchPreFilt(pswExcite, siGsp0Code, swLag,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1497 swVoicingMode, swSemiBeta, psnsSqrtRs[giSfrmCnt],
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1498 pswPPFExcit, st->pswPPreState);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1499
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1500
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1501 /* Concealment on subframe signal level: */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1502 /* ------------------------------------- */
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1503 level_estimator_det(st, &swLevelMean, &swLevelMax);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1504
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1505 signal_conceal_sub(pswPPFExcit, ppswSynthAs[giSfrmCnt],
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1506 st->pswSynthFiltState, &pswLtpStateOut[-S_LEN],
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1507 &st->pswPPreState[LTP_LEN - S_LEN],
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1508 swLevelMean, swLevelMax,
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1509 param_in[19], st->swMuteFlagOld,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1510 &swMuteFlag, swMutePermit);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1511
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1512
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1513 /* synthesize the speech through the synthesis filter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1514 /* -------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1515
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1516 lpcIir(pswPPFExcit, ppswSynthAs[giSfrmCnt], st->pswSynthFiltState,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1517 pswSynthFiltOut);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1518
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1519 /* pass reconstructed speech through adaptive spectral postfilter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1520 /* -------------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1521
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1522 spectralPostFilter(st, swEngyRShift,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1523 pswSynthFiltOut, ppswPFNumAs[giSfrmCnt],
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1524 ppswPFDenomAs[giSfrmCnt],
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1525 &pcm_out[giSfrmCnt * S_LEN]);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1526
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1527 level_estimator_upd(st, &pcm_out[giSfrmCnt * S_LEN]);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1528
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1529 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1530
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1531 /* truncate the 16 bit linear pcm to 13 bits */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1532 /* ----------------------------------------- */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1533
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1534 for (i = 0; i < F_LEN; i++)
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1535 {
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1536 pcm_out[i] &= PCM_MASK;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1537 }
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1538
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1539 /* Nothing but state updates left - do homing logic here. */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1540 if (param_in[18] == 0 && param_in[20] == 0 &&
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1541 memcmp(param_in, gsmhr_dhf_params, sizeof(int16_t) * 18) == 0) {
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1542 gsmhr_decoder_reset(st);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1543 return;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1544 }
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1545 st->is_homed = 0;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1546
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1547 /* Save muting information for next frame */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1548 /* -------------------------------------- */
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1549 st->swMuteFlagOld = swMuteFlag;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1550
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1551 /* end of frame processing - save this frame's frame energy, */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1552 /* reflection coefs, direct form coefs, and post filter coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1553 /* ---------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1554
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1555 st->swOldR0Dec = swR0Dec;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1556
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1557 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1558 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1559 st->pswOldFrmKsDec[i] = pswFrmKs[i];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1560 st->pswOldFrmAsDec[i] = pswFrmAs[i];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1561 st->pswOldFrmPFNum[i] = pswFrmPFNum[i];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1562 st->pswOldFrmPFDenom[i] = pswFrmPFDenom[i];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1563 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1564 }