annotate libgsmhr1/sp_dec.c @ 601:c7c03231002d

libgsmhr1: integrate main body of speech decoder
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 04 Dec 2025 12:49:19 +0000
parents 83d46a16db1b
children 27df1cef042c
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 short aToRc(Shortword swAshift, Shortword pswAin[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 Shortword pswRc[]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 static Shortword agcGain(Shortword pswStateCurr[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 struct NormSw snsInSigEnergy,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 Shortword swEngyRShft);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 static void lookupVq(Shortword pswVqCodeWds[], Shortword pswRCOut[]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 static void pitchPreFilt(Shortword pswExcite[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 Shortword swRxGsp0,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 Shortword swRxLag,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 Shortword swUvCode,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 Shortword swSemiBeta,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 struct NormSw snsSqrtRs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 Shortword pswExciteOut[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 Shortword pswPPreState[]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
123 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
124 Shortword swEngyRShift,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
125 Shortword pswSPFIn[], Shortword pswNumCoef[],
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
126 Shortword pswDenomCoef[],
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
127 Shortword pswSPFOut[]);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128
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 | Local Defines |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 #define P_INT_MACS 10
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 #define ASCALE 0x0800
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 #define ASHIFT 4
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 #define DELTA_LEVELS 16
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 #define GSP0_SCALE 1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 #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
141 * codeword */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 #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
143 * codeword */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 #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
145 * codeword */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 #define SQRT_ONEHALF 0x5a82 /* the 0.5 ** 0.5 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 #define LPC_ROUND 0x00000800L /* 0x8000 >> ASHIFT */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 #define AFSHIFT 2 /* number of right shifts to be
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 * applied to the autocorrelation
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 * sequence in aFlatRcDp */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
152 #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
153
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 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 * FUNCTION NAME: aToRc
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 * PURPOSE:
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 * This subroutine computes a vector of reflection coefficients, given
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 * an input vector of direct form LPC filter coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 * INPUTS:
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 * NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 * order of the LPC filter (global constant)
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 * swAshift
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 * The number of right shifts applied externally
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 * to the direct form filter 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 * pswAin[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 * The input vector of direct form LPC filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 * coefficients.
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 * OUTPUTS:
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 * pswRc[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 * Array containing the reflection coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 * siUnstableFlt
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 * If stable reflection coefficients 0, 1 if unstable.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 * This function performs the conversion from direct form
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 * coefficients to reflection coefficients. It is used in a_sst()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 * and interpolateCheck(). In a_sst() reflection coefficients used
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 * as a transitional data format. aToRc() is used for this
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 * conversion.
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 * When performing interpolation, a stability check must be
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 * performed. interpolateCheck() does this by calling aToRc().
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 * First coefficients are shifted down by iAshift. NP, the filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 * order is 10. The a's and rc's each have NP elements in them. An
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 * elaborate algorithm description can be found on page 443, of
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 * "Digital Processing of Speech Signals" by L.R. Rabiner and R.W.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 * Schafer; Prentice-Hall; Englewood Cliffs, NJ (USA). 1978.
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 * REFERENCES: Sub_Clause 4.1.6, and 4.2.3 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 * KEYWORDS: reflectioncoefficients, parcors, conversion, atorc, ks, as
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 * KEYWORDS: parcorcoefficients, lpc, flat, vectorquantization
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 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 static short aToRc(Shortword swAshift, Shortword pswAin[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 Shortword pswRc[])
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 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 | Constants |
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 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 | Automatic Variables |
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 Shortword pswTmpSpace[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 pswASpace[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 swNormShift,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 swActShift,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 swNormProd,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 swRcOverE,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 swDiv,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 *pswSwap,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 *pswTmp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236 *pswA;
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 Longword L_temp;
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 short int siUnstableFlt,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 i,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 j; /* Loop control variables */
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 /*_________________________________________________________________________
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 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 |_________________________________________________________________________|
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250 /* Initialize starting addresses for temporary buffers */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 pswA = pswASpace;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 pswTmp = pswTmpSpace;
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 /* Copy the direct form filter coefficients to a temporary array */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257 /*---------------------------------------------------------------*/
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 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 pswA[i] = pswAin[i];
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 /* Initialize the flag for filter stability check */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267 siUnstableFlt = 0;
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 /* Start computation of the reflection coefficients, Rc[9],...,Rc[1] */
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 for (i = NP - 1; i >= 1; i--)
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 pswRc[i] = shl(pswA[i], swAshift); /* write Rc[i] to output array */
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 /* Check the stability of i-th reflection coefficient */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280 siUnstableFlt = siUnstableFlt | isSwLimit(pswRc[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282 /* Precompute intermediate variables for needed for the computation */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 /* of direct form filter of order i-1 */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286 if (sub(pswRc[i], SW_MIN) == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288 siUnstableFlt = 1;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289 swRcOverE = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290 swDiv = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 swActShift = 2;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 L_temp = LW_MAX; /* Load ~1.0 into accum */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296 L_temp = L_msu(L_temp, pswRc[i], pswRc[i]); /* 1.-Rc[i]*Rc[i] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297 swNormShift = norm_l(L_temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298 L_temp = L_shl(L_temp, swNormShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 swNormProd = extract_h(L_temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300 swActShift = add(2, swNormShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 swDiv = divide_s(0x2000, swNormProd);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 swRcOverE = mult_r(pswRc[i], swDiv);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304 /* Check stability */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305 /*---------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306 siUnstableFlt = siUnstableFlt | isSwLimit(swRcOverE);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 /* Compute direct form filter coefficients corresponding to */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309 /* a direct form filter of order i-1 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 /*----------------------------------------------------------*/
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 for (j = 0; j <= i - 1; j++)
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 L_temp = L_mult(pswA[j], swDiv);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315 L_temp = L_msu(L_temp, pswA[i - j - 1], swRcOverE);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316 L_temp = L_shl(L_temp, swActShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 pswTmp[j] = round(L_temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 siUnstableFlt = siUnstableFlt | isSwLimit(pswTmp[j]);
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 /* Swap swA and swTmp buffers */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 /*----------------------------*/
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 pswSwap = pswA;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325 pswA = pswTmp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 pswTmp = pswSwap;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327 }
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 /* Compute reflection coefficient Rc[0] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 /*--------------------------------------*/
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 pswRc[0] = shl(pswA[0], swAshift); /* write Rc[0] to output array */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
333
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
334 /* Check the stability of 0-th reflection coefficient */
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 siUnstableFlt = siUnstableFlt | isSwLimit(pswRc[0]);
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 return (siUnstableFlt);
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
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 * FUNCTION NAME: a_sst
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 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
348 * 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
349 * direct form filter coefficients
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 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
352 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
353 * swAshift
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
354 * number of shift for coefficients
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 * swAscale
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
357 * scaling factor for coefficients
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 * pswDirectFormCoefIn[0:NP-1]
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 * array of input direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
362 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
363 * OUTPUTS:
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 * pswDirectFormCoefOut[0:NP-1]
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 * array of output direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
368 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
369 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
370 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
371 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
372 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
373 * DESCRIPTION:
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 * In a_sst() direct form coefficients are converted to
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
376 * autocorrelations, and smoothed in that domain. The function is
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
377 * 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
378 * 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
379 * "Spectral Smoothing Technique in PARCOR Speech
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
380 * 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
381 * Dec. 1978.
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 * After smoothing is performed conversion back to direct form
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
384 * coefficients is done by calling aFlatRc(), followed by rcToADp().
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 * 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
387 * and a sampling rate of 8000 be :
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
388 * static ShortwordRom psrSST[NP+1] = { 0x7FFF,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
389 * 0x7F5C, 0x7D76, 0x7A5B, 0x7622, 0x70EC,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
390 * 0x6ADD, 0x641F, 0x5CDD, 0x5546, 0x4D86
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 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
393 * 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
394 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
395 * KEYWORDS: spectral smoothing, direct form coef, sst, atorc, atocor
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
396 * KEYWORDS: levinson
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
397 *
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
400 static void a_sst(Shortword swAshift, Shortword swAscale,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
401 Shortword pswDirectFormCoefIn[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
402 Shortword pswDirectFormCoefOut[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
403 {
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 /*_________________________________________________________________________
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 | Local Static Variables |
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 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
410
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
411 static const ShortwordRom psrSST[NP + 1] = {0x7FFF,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
412 0x7F5C, 0x7D76, 0x7A5B, 0x7622, 0x70EC,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
413 0x6ADD, 0x641F, 0x5CDD, 0x5546, 0x4D86,
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 | Automatic Variables |
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 */
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 Longword pL_CorrTemp[NP + 1];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
423
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
424 Shortword pswRCNum[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
425 pswRCDenom[NP];
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 short int siLoopCnt;
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 /*_________________________________________________________________________
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 | Executable Code |
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 */
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 /* convert direct form coefs to reflection coefs */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
438 aToRc(swAshift, pswDirectFormCoefIn, pswRCDenom);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
439
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
440 /* convert to autocorrelation coefficients */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
441 /* --------------------------------------- */
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 rcToCorrDpL(swAshift, swAscale, pswRCDenom, pL_CorrTemp);
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 /* do spectral smoothing technique */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
448 for (siLoopCnt = 1; siLoopCnt <= NP; siLoopCnt++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
449 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
450 pL_CorrTemp[siLoopCnt] = L_mpy_ls(pL_CorrTemp[siLoopCnt],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
451 psrSST[siLoopCnt]);
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
454 /* Compute the reflection coefficients via AFLAT */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
455 /*-----------------------------------------------*/
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 aFlatRcDp(pL_CorrTemp, pswRCNum);
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
460 /* Convert reflection coefficients to direct form filter coefficients */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
461 /*-------------------------------------------------------------------*/
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 rcToADp(swAscale, pswRCNum, pswDirectFormCoefOut);
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
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 * FUNCTION NAME: agcGain
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
469 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
470 * PURPOSE:
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 * 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
473 * 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
474 * filters.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
475 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
476 * INPUT:
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 * pswStateCurr[0:39]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
479 * Input signal into agc block whose energy is
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
480 * 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
481 * modified in this routine.
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 * snsInSigEnergy
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
484 * Normalized number with shift count - the energy in
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
485 * the input signal.
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 * swEngyRShft
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
488 * 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
489 * to ensure that it remains less than 1.0
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
490 * (swEngyRShft is always positive or zero)
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 * OUTPUT:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
493 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
494 * none
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 * RETURN:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
497 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
498 * the agc's gain/2 note DIVIDED by 2
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
499 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
500 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
501 * 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
502 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
503 * KEYWORDS: postfilter, agc, automaticgaincontrol, leveladjust
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 *************************************************************************/
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 static Shortword agcGain(Shortword pswStateCurr[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
508 struct NormSw snsInSigEnergy, Shortword swEngyRShft)
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 /*_________________________________________________________________________
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 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
514 |_________________________________________________________________________|
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
517 Longword L_OutEnergy,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
518 L_AgcGain;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
519
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
520 struct NormSw snsOutEnergy,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
521 snsAgc;
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 Shortword swAgcOut,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
524 swAgcShftCnt;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
525
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
526 /*_________________________________________________________________________
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 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
529 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
530 */
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 /* 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
533 /*--------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
534
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
535 snsOutEnergy.sh = g_corr1s(pswStateCurr, swEngyRShft, &L_OutEnergy);
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 /* reduce energy by a factor of 2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
538 snsOutEnergy.sh = add(snsOutEnergy.sh, 1);
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 /* if waveform has nonzero energy, find AGC gain */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
541 /*-----------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
542
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
543 if (L_OutEnergy == 0)
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 swAgcOut = 0;
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 else
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
550 snsOutEnergy.man = round(L_OutEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
551
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
552 /* divide input energy by 2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
553 snsInSigEnergy.man = shr(snsInSigEnergy.man, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
554
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 /* Calculate AGC gain squared */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
559 snsAgc.man = divide_s(snsInSigEnergy.man, snsOutEnergy.man);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
560 swAgcShftCnt = norm_s(snsAgc.man);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
561 snsAgc.man = shl(snsAgc.man, swAgcShftCnt);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
562
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
563 /* find shift count for G^2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
564 /*--------------------------*/
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 snsAgc.sh = add(sub(snsInSigEnergy.sh, snsOutEnergy.sh),
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
567 swAgcShftCnt);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
568 L_AgcGain = L_deposit_h(snsAgc.man);
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
571 /* Calculate AGC gain */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
572 /*--------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
573
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
574 snsAgc.man = sqroot(L_AgcGain);
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
577 /* check if 1/2 sqrt(G^2) >= 1.0 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
578 /* 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
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 if (add(snsAgc.sh, 2) < 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
582 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
583 swAgcOut = SW_MAX;
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 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
586 {
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 if (0x1 & snsAgc.sh)
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 snsAgc.man = mult(snsAgc.man, SQRT_ONEHALF);
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 snsAgc.sh = shr(snsAgc.sh, 1); /* shiftCnt/2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
594 snsAgc.sh = add(snsAgc.sh, 1); /* shiftCnt/2 + 1 */
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 if (snsAgc.sh > 0)
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 snsAgc.man = shr(snsAgc.man, snsAgc.sh);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
599 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
600 swAgcOut = snsAgc.man;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
601 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
602 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
603
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
604 return (swAgcOut);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
605 }
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 * FUNCTION NAME: lagDecode
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 * PURPOSE:
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 * 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
614 * 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
615 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
616 * INPUTS:
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 * swDeltaLag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
619 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
620 * lag received from channel decoder
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 * giSfrmCnt
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
623 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
624 * current sub-frame count
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
625 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
626 * swLastLag
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 * 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
629 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
630 * psrLagTbl[0:255]
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 * table used to look up full resolution lag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
633 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
634 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
635 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
636 * swLastLag
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 * new previous lag for next sub-frame
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
639 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
640 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
641 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
642 * swLag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
643 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
644 * decoded full resolution lag
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 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
647 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
648 * 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
649 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
650 * 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
651 * 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
652 * point for decoding the current lag.
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 * 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
655 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
656 * KEYWORDS: deltalags, lookup lag
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 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
659
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
660 static Shortword lagDecode(Shortword swDeltaLag, Shortword *pswLastLag,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
661 Shortword subfrm)
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
662 {
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 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
666 | Local Constants |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
667 |_________________________________________________________________________|
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
670 #define DELTA_LEVELS_D2 DELTA_LEVELS/2
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
671 #define MAX_LAG 0x00ff
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
672 #define MIN_LAG 0x0000
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
673
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 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
676 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
677 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
678 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
679
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
680 Shortword swLag;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
681
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 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
684 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
685 |_________________________________________________________________________|
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 /* first sub-frame */
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
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
691 if (subfrm == 0)
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
692 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
693 *pswLastLag = swDeltaLag;
594
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
696 /* remaining sub-frames */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
697 /* -------------------- */
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 else
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
702 /* get lag biased around 0 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
703 /* ----------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
704
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
705 swLag = sub(swDeltaLag, DELTA_LEVELS_D2);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
706
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
707 /* get real lag relative to last */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
708 /* ----------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
709
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
710 swLag = add(swLag, *pswLastLag);
594
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 /* clip to max or min */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
713 /* ------------------ */
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 if (sub(swLag, MAX_LAG) > 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
716 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
717 *pswLastLag = MAX_LAG;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
718 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
719 else if (sub(swLag, MIN_LAG) < 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
720 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
721 *pswLastLag = MIN_LAG;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
722 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
723 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
724 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
725 *pswLastLag = swLag;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
726 }
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
729 /* return lag after look up */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
730 /* ------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
731
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
732 swLag = psrLagTbl[*pswLastLag];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
733 return (swLag);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
734 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
735
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
736 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
737 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
738 * FUNCTION NAME: lookupVq
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
739 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
740 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
741 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
742 * 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
743 * the received LPC codewords.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
744 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
745 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
746 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
747 * pswVqCodeWds[0:2]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
748 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
749 * the codewords for each of the segments
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
750 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
751 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
752 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
753 * pswRCOut[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
754 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
755 * the decoded reflection coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
756 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
757 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
758 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
759 * none.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
760 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
761 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
762 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
763 * For each segment do the following:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
764 * setup the retrieval pointers to the correct vector
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
765 * get that vector
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 * 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
768 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
769 * KEYWORDS: vq, vectorquantizer, lpc
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 *************************************************************************/
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 static void lookupVq(Shortword pswVqCodeWds[], Shortword pswRCOut[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
774 {
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 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
777 | Local Constants |
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 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
780
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
781 #define LSP_MASK 0x00ff
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 /*_________________________________________________________________________
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 | Automatic Variables |
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 */
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 short int siSeg,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
790 siIndex,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
791 siVector,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
792 siVector1,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
793 siVector2,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
794 siWordPtr;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
795
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
796 const ShortwordRom *psrQTable;
594
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 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
801 |_________________________________________________________________________|
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 /* for each segment */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
805 /* ---------------- */
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 for (siSeg = 0; siSeg < QUANT_NUM_OF_TABLES; siSeg++)
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
810 siVector = pswVqCodeWds[siSeg];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
811 siIndex = psvqIndex[siSeg].l;
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 if (sub(siSeg, 2) == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
814 { /* segment 3 */
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 /* set table */
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 psrQTable = psrQuant3;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
820
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
821 /* set offset into table */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
824 siWordPtr = add(siVector, siVector);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
825
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
826 /* look up coeffs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
827 /* -------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
828
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
829 siVector1 = psrQTable[siWordPtr];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
830 siVector2 = psrQTable[siWordPtr + 1];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
831
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
832 pswRCOut[siIndex - 1] = psrSQuant[shr(siVector1, 8) & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
833 pswRCOut[siIndex] = psrSQuant[siVector1 & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
834 pswRCOut[siIndex + 1] = psrSQuant[shr(siVector2, 8) & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
835 pswRCOut[siIndex + 2] = psrSQuant[siVector2 & LSP_MASK];
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 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
838 { /* segments 1 and 2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
839
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
840 /* set tables */
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 if (siSeg == 0)
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 psrQTable = psrQuant1;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
846 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
847 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
848 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
849 psrQTable = psrQuant2;
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 }
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 /* set offset into table */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
854 /* --------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
855
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
856 siWordPtr = add(siVector, siVector);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
857 siWordPtr = add(siWordPtr, siVector);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
858 siWordPtr = shr(siWordPtr, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
859
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
860 /* look up coeffs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
861 /* -------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
862
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
863 siVector1 = psrQTable[siWordPtr];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
864 siVector2 = psrQTable[siWordPtr + 1];
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 if ((siVector & 0x0001) == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
867 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
868 pswRCOut[siIndex - 1] = psrSQuant[shr(siVector1, 8) & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
869 pswRCOut[siIndex] = psrSQuant[siVector1 & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
870 pswRCOut[siIndex + 1] = psrSQuant[shr(siVector2, 8) & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
871 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
872 else
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 pswRCOut[siIndex - 1] = psrSQuant[siVector1 & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
875 pswRCOut[siIndex] = psrSQuant[shr(siVector2, 8) & LSP_MASK];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
876 pswRCOut[siIndex + 1] = psrSQuant[siVector2 & LSP_MASK];
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 }
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
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 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
884 * FUNCTION NAME: pitchPreFilt
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 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
887 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
888 * Performs pitch pre-filter on excitation in speech decoder.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
889 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
890 * INPUTS:
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 * pswExcite[0:39]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
893 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
894 * Synthetic residual signal to be filtered, a subframe-
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
895 * length vector.
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 * ppsrPVecIntFilt[0:9][0:5] ([tap][phase])
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 * Interpolation filter coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
900 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
901 * 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
902 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
903 * Sqrt(P0) look-up table, used to determine pitch
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
904 * pre-filtering coefficient.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
905 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
906 * swRxGsp0
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 * Coded value from gain quantizer, used to look up
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
909 * sqrt(P0).
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 * swRxLag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
912 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
913 * Full-resolution lag value (fractional lag *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
914 * oversampling factor), used to index pitch pre-filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
915 * state.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
916 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
917 * swUvCode
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 * Coded voicing level, used to distinguish between
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
920 * voiced and unvoiced conditions, and to look up
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
921 * sqrt(P0).
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 * swSemiBeta
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 * The gain applied to the adaptive codebook excitation
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
926 * (long-term predictor excitation) limited to a maximum
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
927 * 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
928 * coefficient.
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 * snsSqrtRs
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 * 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
933 * for scaling.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
934 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
935 * OUTPUTS:
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 * pswExciteOut[0:39]
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 * The output pitch pre-filtered excitation.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
940 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
941 * pswPPreState[0:44]
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 * Contains the state of the pitch pre-filter
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 * RETURN VALUE:
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 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
948 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
949 * DESCRIPTION:
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 * 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
952 * 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
953 * excitation is copied to the output.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
954 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
955 * 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
956 * 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
957 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
958 * PpfCoef = POST_EPSILON * min(beta, sqrt(P0)).
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 * Then, the pitch pre-filter is performed:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
961 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
962 * 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
963 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
964 * 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
965 * even for integer values of L.
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 * Note: The coefficients of the interpolating filter are multiplied
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
968 * 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
969 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
970 * 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
971 * 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
972 * its energy matches the original.
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 * 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
975 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
976 * 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
977 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
978 * KEYWORDS: prefilter, pitch, pitchprefilter, excitation, residual
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
979 *
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 static void pitchPreFilt(Shortword pswExcite[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
983 Shortword swRxGsp0,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
984 Shortword swRxLag, Shortword swUvCode,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
985 Shortword swSemiBeta, struct NormSw snsSqrtRs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
986 Shortword pswExciteOut[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
987 Shortword pswPPreState[])
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
990 /*_________________________________________________________________________
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 | Local Constants |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
993 |_________________________________________________________________________|
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
996 #define POST_EPSILON 0x2666
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
997
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 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1000 | Local Static Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1001 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1002 */
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
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 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1007 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1008 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1009 */
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 Longword L_1,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1012 L_OrigEnergy;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1013
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1014 Shortword swScale,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1015 swSqrtP0,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1016 swIntLag,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1017 swRemain,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1018 swEnergy,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1019 pswInterpCoefs[P_INT_MACS];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1020
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1021 short int i,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1022 j;
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 struct NormSw snsOrigEnergy;
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 Shortword *pswPPreCurr = &pswPPreState[LTP_LEN];
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 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1029 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1030 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1031 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1032 */
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 /* Initialization */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1037 swEnergy = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1038
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1039 /* Check voicing level */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1040 /*---------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1041
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1042 if (swUvCode == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1043 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1044
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1045 /* 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
1046 /* state, copy input to output (if not same) */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1049 for (i = 0; i < LTP_LEN - S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1050 pswPPreState[i] = pswPPreState[i + S_LEN];
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 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1053 pswPPreState[i + LTP_LEN - S_LEN] = pswExcite[i];
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 if (pswExciteOut != pswExcite)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1056 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1057
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1058 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1059 pswExciteOut[i] = pswExcite[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1060 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1061 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1062 else
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 /* Voiced: calculate energy in input, filter, calculate energy in */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1066 /* output, scale */
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 /* Get energy in input excitation vector */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1070 /*---------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1071
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1072 swEnergy = add(negate(shl(snsSqrtRs.sh, 1)), 3);
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 if (swEnergy > 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1075 {
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 /* High-energy residual: scale input vector during energy */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1078 /* 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
1079 /* 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
1080 /* count needed for the excitation energy */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1081 /*--------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1082
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1083
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1084 snsOrigEnergy.sh = g_corr1s(pswExcite, swEnergy, &L_OrigEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1085 snsOrigEnergy.man = round(L_OrigEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1086
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1087 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1088 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1089 {
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 /* set shift count to zero for AGC later */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1094 swEnergy = 0;
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 /* Lower-energy residual: no overflow protection needed */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1097 /*------------------------------------------------------*/
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 L_OrigEnergy = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1100 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1101 {
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 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
1104 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1105
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1106 snsOrigEnergy.sh = norm_l(L_OrigEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1107 snsOrigEnergy.man = round(L_shl(L_OrigEnergy, snsOrigEnergy.sh));
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1108 }
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 /* Determine pitch pre-filter coefficient, and scale the appropriate */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1111 /* phase of the interpolating filter by it */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1114 swSqrtP0 = ppsrSqrtP0[swUvCode - 1][swRxGsp0];
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 if (sub(swSqrtP0, swSemiBeta) > 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1117 swScale = swSemiBeta;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1118 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1119 swScale = swSqrtP0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1120
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1121 swScale = mult_r(POST_EPSILON, swScale);
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 get_ipjj(swRxLag, &swIntLag, &swRemain);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1124
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1125 for (i = 0; i < P_INT_MACS; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1126 pswInterpCoefs[i] = mult_r(ppsrPVecIntFilt[i][swRemain], swScale);
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 /* Perform filter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1129 /*----------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1130
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1134 L_1 = L_deposit_h(pswExcite[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1135
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1136 for (j = 0; j < P_INT_MACS - 1; j++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1137 {
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_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
1140 pswInterpCoefs[j]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1141 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1142
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1143 pswPPreCurr[i] = mac_r(L_1,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1144 pswPPreCurr[i - swIntLag + P_INT_MACS / 2 - 1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1145 pswInterpCoefs[P_INT_MACS - 1]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1146 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1147
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1148 /* Get energy in filtered vector, determine automatic-gain-control */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1149 /* scale factor */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1150 /*-----------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1151
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1152 swScale = agcGain(pswPPreCurr, snsOrigEnergy, swEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1153
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1154 /* 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
1155 /* 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
1156 /*------------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1157
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1158 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1159 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1160
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1161 L_1 = L_mult(pswPPreCurr[i], swScale);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1162 L_1 = L_shl(L_1, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1163 pswExciteOut[i] = round(L_1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1164 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1165
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1166 /* Update pitch pre-filter state */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1167 /*-------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1168
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1169 for (i = 0; i < LTP_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1170 pswPPreState[i] = pswPPreState[i + S_LEN];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1171 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1172 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1173
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1174 /***************************************************************************
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 * FUNCTION NAME: spectralPostFilter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1177 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1178 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1179 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1180 * Perform spectral post filter on the output of the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1181 * synthesis filter.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1182 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1183 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1184 * INPUT:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1185 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1186 * S_LEN a global constant
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1187 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1188 * pswSPFIn[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1189 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1190 * input to the routine. Unmodified
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1191 * 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
1192 * pswSPFIn[iLen-1] is the last pointer filtered,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1193 * the newest.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1194 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1195 * pswNumCoef[0:NP-1],pswDenomCoef[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1196 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1197 * numerator and denominator
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1198 * direct form coeffs used by postfilter.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1199 * Exactly like lpc coefficients in format. Shifted down
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1200 * by iAShift to ensure that they are < 1.0.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1201 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1202 * gpswPostFiltStateNum[0:NP-1], gpswPostFiltStateDenom[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1203 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1204 * array of the filter state.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1205 * Same format as coefficients: *praState = state of
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1206 * filter for delay n = -1 praState[NP] = state of
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1207 * filter for delay n = -NP These numbers are not
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1208 * shifted at all. These states are static to this
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1209 * file.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1210 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1211 * OUTPUT:
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 * gpswPostFiltStateNum[0:NP-1], gpswPostFiltStateDenom[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1214 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1215 * See above for description. These are updated.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1216 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1217 * pswSPFOut[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1218 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1219 * same format as pswSPFIn,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1220 * *pswSPFOut is oldest point. The filtered output.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1221 * Note this routine can handle pswSPFOut = pswSPFIn.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1222 * 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
1223 * calculation.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1224 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1225 * RETURN:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1226 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1227 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1228 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1229 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1230 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1231 * find energy in input,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1232 * perform the numerator fir
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1233 * perform the denominator iir
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1234 * perform the post emphasis
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1235 * find energy in signal,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1236 * 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
1237 * post emphasis signal
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1238 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1239 * 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
1240 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1241 * 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
1242 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1243 * KEYWORDS: postfilter, emphasis, postemphasis, brightness,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1244 * KEYWORDS: numerator, deminator, filtering, lpc,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1245 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1246 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1247
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1248 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
1249 Shortword swEngyRShift,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1250 Shortword pswSPFIn[], Shortword pswNumCoef[],
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1251 Shortword pswDenomCoef[],
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1252 Shortword pswSPFOut[])
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1253 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1254 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1255 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1256 | Local Constants |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1257 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1258 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1259
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1260 #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
1261 * 1.0-.9875 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1262 #define POST_EMPHASIS (Shortword)0x199a /* 0.2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1263
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1264 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1265 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1266 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1267 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1268 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1269
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1270 short int i;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1271
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1272 Longword L_OrigEnergy,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1273 L_runningGain,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1274 L_Output;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1275
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1276 Shortword swAgcGain,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1277 swRunningGain,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1278 swTemp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1279
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1280 struct NormSw snsOrigEnergy;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1281
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1282 /*_________________________________________________________________________
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 | Executable Code |
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 */
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 /* calculate the energy in the input and save it */
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 snsOrigEnergy.sh = g_corr1s(pswSPFIn, swEngyRShift, &L_OrigEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1292 snsOrigEnergy.man = round(L_OrigEnergy);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1293
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1294 /* numerator of the postfilter */
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
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1297 lpcFir(pswSPFIn, pswNumCoef, st->gpswPostFiltStateNum, pswSPFOut);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1298
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1299 /* denominator of the postfilter */
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
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1302 lpcIir(pswSPFOut, pswDenomCoef, st->gpswPostFiltStateDenom, pswSPFOut);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1303
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1304 /* postemphasis section of postfilter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1305 /*------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1306
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1307 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1308 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1309 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
1310 POST_EMPHASIS);
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1311 st->swPostEmphasisState = pswSPFOut[i];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1312 pswSPFOut[i] = swTemp;
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1315 swAgcGain = agcGain(pswSPFOut, snsOrigEnergy, swEngyRShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1316
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1317 /* scale the speech vector */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1318 /*-----------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1319
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1320 swRunningGain = st->gswPostFiltAgcGain;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1321 L_runningGain = L_deposit_h(st->gswPostFiltAgcGain);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1322 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1323 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1324 L_runningGain = L_msu(L_runningGain, swRunningGain, AGC_COEF);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1325 L_runningGain = L_mac(L_runningGain, swAgcGain, AGC_COEF);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1326 swRunningGain = extract_h(L_runningGain);
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 /* now scale input with gain */
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 L_Output = L_mult(swRunningGain, pswSPFOut[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1331 pswSPFOut[i] = extract_h(L_shl(L_Output, 2));
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1332 }
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1333 st->gswPostFiltAgcGain = swRunningGain;
594
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
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1337 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
1338 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
1339 {
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1340 int16_t param_preened[GSMHR_NUM_PARAMS];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1341
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1342 Shortword *pswLtpStateOut = &st->pswLtpStateBaseDec[LTP_LEN];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1343 Shortword pswSythAsSpace[NP * N_SUB];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1344 Shortword pswPFNumAsSpace[NP * N_SUB];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1345 Shortword pswPFDenomAsSpace[NP * N_SUB];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1346
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1347 Shortword *ppswSynthAs[N_SUB] = {
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1348 &pswSythAsSpace[0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1349 &pswSythAsSpace[10],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1350 &pswSythAsSpace[20],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1351 &pswSythAsSpace[30],
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1352 };
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1353
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1354 Shortword *ppswPFNumAs[N_SUB] = {
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1355 &pswPFNumAsSpace[0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1356 &pswPFNumAsSpace[10],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1357 &pswPFNumAsSpace[20],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1358 &pswPFNumAsSpace[30],
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1359 };
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1360
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1361 Shortword *ppswPFDenomAs[N_SUB] = {
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1362 &pswPFDenomAsSpace[0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1363 &pswPFDenomAsSpace[10],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1364 &pswPFDenomAsSpace[20],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1365 &pswPFDenomAsSpace[30],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1366 };
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1367
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1368 static const ShortwordRom psrSPFDenomWidenCf[NP] = {
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1369 0x6000, 0x4800, 0x3600, 0x2880, 0x1E60,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1370 0x16C8, 0x1116, 0x0CD0, 0x099C, 0x0735,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1371 };
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1372
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1373 short int i, j,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1374 giSfrmCnt,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1375 siLagCode,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1376 siGsp0Code,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1377 psiVselpCw[2],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1378 siVselpCw,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1379 siNumBits,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1380 siCodeBook;
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 Shortword pswFrmKs[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1383 pswFrmAs[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1384 pswFrmPFNum[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1385 pswFrmPFDenom[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1386 pswPVec[S_LEN],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1387 ppswVselpEx[2][S_LEN],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1388 pswExcite[S_LEN],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1389 pswPPFExcit[S_LEN],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1390 pswSynthFiltOut[S_LEN],
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1391 swDecoMode,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1392 swR0Index,
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1393 swR0Dec,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1394 swLag,
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1395 swLastLag,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1396 swSemiBeta,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1397 pswBitArray[MAXBITS];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1398
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1399 struct NormSw psnsSqrtRs[N_SUB],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1400 snsRs00,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1401 snsRs11,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1402 snsRs22;
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 Shortword swMutePermit,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1405 swLevelMean,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1406 swLevelMax, /* error concealment */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1407 swMuteFlag; /* error concealment */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1408
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1409 Shortword swVoicingMode, /* MODE */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1410 swSi, /* INT_LPC */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1411 swEngyRShift; /* for use by spectral postfilter */
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1412
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1413 /* 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
1414 if (st->is_homed) {
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1415 /*
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1416 * 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
1417 * 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
1418 * invalid SID will also be caught here.
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1419 */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1420 if (param_in[18]) {
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1421 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
1422 return;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1423 }
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1424 /*
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1425 * 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
1426 * 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
1427 */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1428 if (param_in[20] == 0 &&
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1429 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
1430 /* EHF output */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1431 for (i = 0; i < F_LEN; i++)
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1432 pcm_out[i] = 0x0008;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1433 return;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1434 }
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1435 }
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1436
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1437 /* 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
1438 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
1439 NULL);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1440 swR0Index = param_preened[0]; /* R0 Index */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1441 swR0Dec = psrR0DecTbl[swR0Index * 2]; /* R0 */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1442 if (swDecoMode != CNIBFI)
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1443 lookupVq(param_preened + 1, pswFrmKs);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1444 swSi = param_preened[4]; /* INT_LPC */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1445 swVoicingMode = param_preened[5]; /* MODE */
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1446
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1447 switch (swDecoMode) {
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1448 case SPEECH:
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1449 st->swRxDTXState = CNINTPER - 1;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1450 break;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1451 case CNIFIRSTSID:
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1452 st->swRxDTXState = CNINTPER - 1;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1453 Init_CN_interpolation(st, swDecoMode, pswFrmKs);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1454 swR0Dec = CN_Interpolate_R0(st, swR0Dec);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1455 CN_Interpolate_LPC(st, pswFrmKs);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1456 break;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1457 case CNICONT:
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1458 st->swRxDTXState = 0;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1459 Init_CN_interpolation(st, swDecoMode, pswFrmKs);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1460 swR0Dec = CN_Interpolate_R0(st, swR0Dec);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1461 CN_Interpolate_LPC(st, pswFrmKs);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1462 break;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1463 case CNIBFI:
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1464 if (st->swRxDTXState < (CNINTPER - 1))
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1465 st->swRxDTXState++;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1466 swR0Dec = CN_Interpolate_R0(st, swR0Dec);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1467 CN_Interpolate_LPC(st, pswFrmKs);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1468 break;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1469 }
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1470
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1471 /* ------------------- */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1472 /* do frame processing */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1473 /* ------------------- */
594
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 /* 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
1476 /* ------------------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1477 swMuteFlag = 0;
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 /* generate the direct form coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1480 /* ------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1481
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1482 if (!rcToADp(ASCALE, pswFrmKs, pswFrmAs))
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 /* widen direct form coefficients using the widening coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1485 /* ------------------------------------------------------- */
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 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1488 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1489 pswFrmPFDenom[i] = mult_r(pswFrmAs[i], psrSPFDenomWidenCf[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1490 }
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 a_sst(ASHIFT, ASCALE, pswFrmPFDenom, pswFrmPFNum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1493 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1494 else
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 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1497 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1498 pswFrmKs[i] = st->pswOldFrmKsDec[i];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1499 pswFrmAs[i] = st->pswOldFrmAsDec[i];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1500 pswFrmPFDenom[i] = st->pswOldFrmPFDenom[i];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1501 pswFrmPFNum[i] = st->pswOldFrmPFNum[i];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1502 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1503 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1504
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1505 /* interpolate, or otherwise get sfrm reflection coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1506 /* --------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1507
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1508 getSfrmLpc(swSi, st->swOldR0Dec, swR0Dec, st->pswOldFrmKsDec,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1509 st->pswOldFrmAsDec, st->pswOldFrmPFNum, st->pswOldFrmPFDenom,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1510 pswFrmKs, pswFrmAs,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1511 pswFrmPFNum, pswFrmPFDenom, psnsSqrtRs, ppswSynthAs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1512 ppswPFNumAs, ppswPFDenomAs);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1513
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1514 /* calculate shift for spectral postfilter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1515 /* --------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1516
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1517 swEngyRShift = r0BasedEnergyShft(swR0Index);
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
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 /* do sub-frame processing */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1522 /* ----------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1523
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1524 for (giSfrmCnt = 0; giSfrmCnt < 4; giSfrmCnt++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1525 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1526
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1527 /* copy this sub-frame's parameters */
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
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1530 if (swVoicingMode == 0)
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1531 { /* unvoiced */
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1532 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
1533 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
1534 siGsp0Code = param_preened[(giSfrmCnt * 3) + 8]; /* GSP0 */
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1535 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1536 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1537 { /* voiced */
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1538 siLagCode = param_preened[(giSfrmCnt * 3) + 6]; /* LAG */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1539 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
1540 siGsp0Code = param_preened[(giSfrmCnt * 3) + 8]; /* GSP0 */
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1541 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1542
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1543 /* for voiced mode, reconstruct the pitch vector */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1544 /* --------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1545
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1546 if (swVoicingMode)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1547 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1548
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1549 /* 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
1550 /* ------------------------------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1551
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1552 swLag = lagDecode(siLagCode, &swLastLag, giSfrmCnt);
594
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 /* state followed by out */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1555 /* --------------------- */
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 fp_ex(swLag, pswLtpStateOut);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1558
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1559 /* 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
1560 /* ----------------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1561
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1562 for (i = 0; i < S_LEN; i++)
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 pswPVec[i] = pswLtpStateOut[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1565 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1566 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1567
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1568 /* for unvoiced, do not reconstruct a pitch vector */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1569 /* ----------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1570
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1571 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1572 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1573 swLag = 0; /* indicates invalid lag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1574 * and unvoiced */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1575 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1576
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1577 /* now work on the VSELP codebook excitation output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1578 /* 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
1579 /* ------------------------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1580
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1581 if (swVoicingMode)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1582 { /* voiced */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1583
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1584 siNumBits = C_BITS_V;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1585 siVselpCw = psiVselpCw[0];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1586
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1587 b_con(siVselpCw, siNumBits, pswBitArray);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1588
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1589 v_con(pppsrVcdCodeVec[0][0], ppswVselpEx[0], pswBitArray, siNumBits);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1590 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1591
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1592 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1593 { /* unvoiced */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1595 siNumBits = C_BITS_UV;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1596
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1597 for (siCodeBook = 0; siCodeBook < 2; siCodeBook++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1598 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1599
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1600 siVselpCw = psiVselpCw[siCodeBook];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1601
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1602 b_con(siVselpCw, siNumBits, (Shortword *) pswBitArray);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1603
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1604 v_con(pppsrUvCodeVec[siCodeBook][0], ppswVselpEx[siCodeBook],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1605 pswBitArray, siNumBits);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1606 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1607 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1608
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1609 /* all excitation vectors have been created: ppswVselpEx and pswPVec */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1610 /* 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
1611 /* ------------------------------------------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1612
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1613 if (swLag)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1614 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1615 rs_rr(pswPVec, psnsSqrtRs[giSfrmCnt], &snsRs00);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1616 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1617
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1618 rs_rrNs(ppswVselpEx[0], psnsSqrtRs[giSfrmCnt], &snsRs11);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1619
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1620 if (!swVoicingMode)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1621 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1622 rs_rrNs(ppswVselpEx[1], psnsSqrtRs[giSfrmCnt], &snsRs22);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1623 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1624
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1625 /* now implement synthesis - combine the excitations */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1626 /* ------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1627
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1628 if (swVoicingMode)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1629 { /* voiced */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1630
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1631 /* scale pitch and codebook excitations and get beta */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1632 /* ------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1633 swSemiBeta = scaleExcite(pswPVec,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1634 pppsrGsp0[swVoicingMode][siGsp0Code][0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1635 snsRs00, pswPVec);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1636 scaleExcite(ppswVselpEx[0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1637 pppsrGsp0[swVoicingMode][siGsp0Code][1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1638 snsRs11, ppswVselpEx[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1639
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1640 /* combine the two scaled excitations */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1641 /* ---------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1642 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1643 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1644 pswExcite[i] = add(pswPVec[i], ppswVselpEx[0][i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1645 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1646 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1647 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1648 { /* unvoiced */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1649
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1650 /* 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
1651 /* -------------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1652 swSemiBeta = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1653 scaleExcite(ppswVselpEx[0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1654 pppsrGsp0[swVoicingMode][siGsp0Code][0],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1655 snsRs11, ppswVselpEx[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1656 scaleExcite(ppswVselpEx[1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1657 pppsrGsp0[swVoicingMode][siGsp0Code][1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1658 snsRs22, ppswVselpEx[1]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1659
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1660 /* combine the two scaled excitations */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1661 /* ---------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1662 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1663 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1664 pswExcite[i] = add(ppswVselpEx[1][i], ppswVselpEx[0][i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1665 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1666 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1667
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1668 /* 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
1669 /* --------------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1670
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1671 for (i = 0; i < LTP_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1672 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1673 st->pswLtpStateBaseDec[i] = st->pswLtpStateBaseDec[i + S_LEN];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1674 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1675
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1676 /* add the current sub-frames data to the state */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1677 /* -------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1678
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1679 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
1680 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1681 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
1682 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1683
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1684 /* given the excitation perform pitch prefiltering */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1685 /* ----------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1686
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1687 pitchPreFilt(pswExcite, siGsp0Code, swLag,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1688 swVoicingMode, swSemiBeta, psnsSqrtRs[giSfrmCnt],
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1689 pswPPFExcit, st->pswPPreState);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1690
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1691
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1692 /* Concealment on subframe signal level: */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1693 /* ------------------------------------- */
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1694 level_estimator_det(st, &swLevelMean, &swLevelMax);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1695
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1696 signal_conceal_sub(pswPPFExcit, ppswSynthAs[giSfrmCnt],
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1697 st->pswSynthFiltState, &pswLtpStateOut[-S_LEN],
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1698 &st->pswPPreState[LTP_LEN - S_LEN],
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1699 swLevelMean, swLevelMax,
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1700 param_in[19], st->swMuteFlagOld,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1701 &swMuteFlag, swMutePermit);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1702
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1703
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1704 /* synthesize the speech through the synthesis filter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1705 /* -------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1706
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1707 lpcIir(pswPPFExcit, ppswSynthAs[giSfrmCnt], st->pswSynthFiltState,
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1708 pswSynthFiltOut);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1709
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1710 /* pass reconstructed speech through adaptive spectral postfilter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1711 /* -------------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1712
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1713 spectralPostFilter(st, swEngyRShift,
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1714 pswSynthFiltOut, ppswPFNumAs[giSfrmCnt],
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1715 ppswPFDenomAs[giSfrmCnt],
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1716 &pcm_out[giSfrmCnt * S_LEN]);
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1717
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1718 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
1719
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1720 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1721
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1722 /* 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
1723 /* ----------------------------------------- */
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1724
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1725 for (i = 0; i < F_LEN; i++)
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1726 {
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1727 pcm_out[i] &= PCM_MASK;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1728 }
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1729
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1730 /* 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
1731 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
1732 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
1733 gsmhr_decoder_reset(st);
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1734 return;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1735 }
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1736 st->is_homed = 0;
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1737
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1738 /* Save muting information for next frame */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1739 /* -------------------------------------- */
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1740 st->swMuteFlagOld = swMuteFlag;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1741
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1742 /* 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
1743 /* reflection coefs, direct form coefs, and post filter coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1744 /* ---------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1745
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1746 st->swOldR0Dec = swR0Dec;
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1747
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1748 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1749 {
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1750 st->pswOldFrmKsDec[i] = pswFrmKs[i];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1751 st->pswOldFrmAsDec[i] = pswFrmAs[i];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1752 st->pswOldFrmPFNum[i] = pswFrmPFNum[i];
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
1753 st->pswOldFrmPFDenom[i] = pswFrmPFDenom[i];
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1754 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1755 }