annotate libgsmhr1/dec_func.c @ 637:d71ef85036e4

README: add libgsmhr1
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 20 Mar 2026 04:50:08 +0000
parents 27df1cef042c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 *
595
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
3 * File Name: dec_func.c
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
4 *
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
5 * Derivation:
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
6 * This library module was derived from sp_dec.c in the original
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
7 * GSM 06.06 code drop. Compared to the original, this version
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
8 * excludes the main speechDecoder() function and two static
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
9 * functions that make use of speech decoder state, leaving only
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
10 * those functions that can be used by both decoder and encoder
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
11 * engines and are not tied to either state structure.
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
12 *
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
13 * Original comments follow:
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 * Purpose:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 * Contains all functions for decoding speech. It does not
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 * include those routines needed to decode channel information.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 * 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
20 * 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
21 * encoder. Functions are included for coded-parameter lookup,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 * LPC filter coefficient interpolation, excitation vector lookup
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 * and construction, vector quantized gain lookup, and LPC synthesis
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 * filtering. In addition, some post-processing functions are
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 * included.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 * 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
28 * The functions are arranged according to their purpose. Under
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 * each heading, the ordering is hierarchical.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 * 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
32 * except were noted:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 * speechDecoder()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 * Spectral Smoothing of LPC:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 * a_sst()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 * aFlatRcDp()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 * rcToCorrDpL()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 * aToRc()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 * rcToADp()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 * VSELP codevector construction:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 * b_con()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 * v_con()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 * LTP vector contruction:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 * fp_ex()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 * get_ipjj()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 * lagDecode()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 * LPC contruction
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 * getSfrmLpc()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 * interpolateCheck()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 * res_eng()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 * lookupVq()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 * Excitation scaling:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 * rs_rr()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 * g_corr1() (no scaling)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 * rs_rrNs()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 * g_corr1s() (g_corr1 with scaling)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 * scaleExcite()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 * Post filtering:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 * pitchPreFilt()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 * agcGain()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 * lpcIir()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 * r0BasedEnergyShft()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 * spectralPostFilter()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 * lpcFir()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 *
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 * Routines not referenced by speechDecoder()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 * Filtering routines:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 * lpcIrZsIir()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 * lpcZiIir()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 * lpcZsFir()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 * lpcZsIir()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 * lpcZsIirP()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 * Square root:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 * sqroot()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 **************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 | Include Files |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85
595
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
86 #include "namespace.h"
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
87 #include "tw_gsmhr.h"
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 #include "typedefs.h"
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 #include "mathhalf.h"
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 #include "sp_rom.h"
595
1e75556ab6c0 libgsmhr1: integrate helper functions from sp_dec.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 594
diff changeset
91 #include "dec_func.h"
594
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 /*_________________________________________________________________________
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 | Local Defines |
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 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 #define P_INT_MACS 10
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 #define ASCALE 0x0800
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 #define ASHIFT 4
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 #define DELTA_LEVELS 16
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 #define GSP0_SCALE 1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 #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
106 * codeword */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 #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
108 * codeword */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 #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
110 * codeword */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 #define LTP_LEN 147 /* 147==0x93 length of LTP history */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 #define SQRT_ONEHALF 0x5a82 /* the 0.5 ** 0.5 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 #define LPC_ROUND 0x00000800L /* 0x8000 >> ASHIFT */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 #define AFSHIFT 2 /* number of right shifts to be
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 * applied to the autocorrelation
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 * sequence in aFlatRcDp */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 * FUNCTION NAME: aFlatRcDp
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 * Given a Longword autocorrelation sequence, representing LPC
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 * information, aFlatRcDp converts the vector to one of NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 * Shortword reflection coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 * INPUT:
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 * pL_R[0:NP] - An input Longword autocorrelation sequence, (pL_R[0] =
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 * not necessarily 0x7fffffffL). pL_R is altered in the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 * call, by being right shifted by global constant
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 * AFSHIFT bits.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 * The input array pL_R[] should be shifted left as much
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 * as possible to improve precision.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 * AFSHIFT - The number of right shifts to be applied to the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 * normalized autocorrelation sequence pL_R.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 * OUTPUT:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 * pswRc[0:NP-1] - A Shortword output vector of NP reflection
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 * coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 * None
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 * This routine transforms LPC information from one set of
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 * parameters to another. It is better suited for fixed point
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 * implementations than the Levinson-Dubin recursion.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 * The function is called by a_sst(), and getNWCoefs(). In a_sst()
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 * direct form coefficients are converted to autocorrelations,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 * and smoothed in that domain. Conversion back to direct form
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 * coefficients is done by calling aFlatRc(), followed by rcToADp().
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 * In getNwCoefs() again the conversion back to direct form
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 * coefficients is done by calling aFlatRc(), followed by rcToADp().
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 * In getNwCoefs() an autocorrelation sequence is generated from the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 * impulse response of the weighting filters.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 * The fundamental recursion is derived from AFLAT, which is
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 * described in section 4.1.4.1.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 * Unlike in AFLAT where the reflection coefficients are known, here
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 * they are the unknowns. PBar and VBar for j==0 are initially
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 * known, as is rSub1. From this information the next set of P's
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 * and V's are generated. At the end of the recursion the next,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 * reflection coefficient rSubj (pswRc[j]) can be calcluated by
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 * dividing Vsubj by Psubj.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 * Precision is crucial in this routine. At each stage, a
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 * normalization is performed prior to the reflection coefficient
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 * calculation. In addition, to prevent overflow, the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 * autocorrelation sequence is scaled down by ASHIFT (4) right
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 * shifts.
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 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 * REFERENCES: Sub_Clause 4.1.9 and 4.2.1 of GSM Recomendation 06.20
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 * KEYWORDS: reflection coefficients, AFLAT, aflat, recursion, LPC
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 * KEYWORDS: autocorrelation
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 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 void aFlatRcDp(Longword *pL_R, Shortword *pswRc)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193
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 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 | Automatic Variables |
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 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 Longword pL_pjNewSpace[NP];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 Longword pL_pjOldSpace[NP];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 Longword pL_vjNewSpace[2 * NP - 1];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 Longword pL_vjOldSpace[2 * NP - 1];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 Longword *pL_pjOld;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 Longword *pL_pjNew;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 Longword *pL_vjOld;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 Longword *pL_vjNew;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 Longword *pL_swap;
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 Longword L_temp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 Longword L_sum;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 Shortword swRc,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214 swRcSq,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 swTemp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 swTemp1,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 swAbsTemp1,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 swTemp2;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 int i,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220 j;
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 /*_________________________________________________________________________
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 | Executable Code |
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 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 pL_pjOld = pL_pjOldSpace;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 pL_pjNew = pL_pjNewSpace;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 pL_vjOld = pL_vjOldSpace + NP - 1;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 pL_vjNew = pL_vjNewSpace + NP - 1;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 /* Extract the 0-th reflection coefficient */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236 /*-----------------------------------------*/
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 swTemp1 = round(pL_R[1]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 swTemp2 = round(pL_R[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 swAbsTemp1 = abs_s(swTemp1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 if (swTemp2 <= 0 || sub(swAbsTemp1, swTemp2) >= 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 j = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 for (i = j; i < NP; i++)
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 pswRc[i] = 0;
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 return;
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251 swRc = divide_s(swAbsTemp1, swTemp2);/* return division result */
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 if (sub(swTemp1, swAbsTemp1) == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 swRc = negate(swRc); /* negate reflection Rc[j] */
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 pswRc[0] = swRc; /* copy into the output Rc 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 for (i = 0; i <= NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260 pL_R[i] = L_shr(pL_R[i], AFSHIFT);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263 /* Initialize the pjOld and vjOld recursion arrays */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 /*-------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 pL_pjOld[i] = pL_R[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 pL_vjOld[i] = pL_R[i + 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 for (i = -1; i > -NP; i--)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272 pL_vjOld[i] = pL_R[-(i + 1)];
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 /* Compute the square of the j=0 reflection coefficient */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278 swRcSq = mult_r(swRc, swRc);
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 /* Update pjNew and vjNew arrays for lattice stage j=1 */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 /* Updating pjNew: */
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 for (i = 0; i <= NP - 2; i++)
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 L_temp = L_mpy_ls(pL_vjOld[i], swRc);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289 L_sum = L_add(L_temp, pL_pjOld[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290 L_temp = L_mpy_ls(pL_pjOld[i], swRcSq);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 L_sum = L_add(L_temp, L_sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292 L_temp = L_mpy_ls(pL_vjOld[-i], swRc);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 pL_pjNew[i] = L_add(L_sum, L_temp);
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296 /* Updating vjNew: */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297 /*-------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 for (i = -NP + 2; i <= NP - 2; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 L_temp = L_mpy_ls(pL_vjOld[-i - 1], swRcSq);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 L_sum = L_add(L_temp, pL_vjOld[i + 1]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303 L_temp = L_mpy_ls(pL_pjOld[(((i + 1) >= 0) ? i + 1 : -(i + 1))], swRc);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304 L_temp = L_shl(L_temp, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305 pL_vjNew[i] = L_add(L_temp, L_sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 j = 0;
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 /* Compute reflection coefficients Rc[1],...,Rc[9] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313 /*-------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315 for (j = 1; j < NP; j++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 /* Swap pjNew and pjOld buffers */
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 pL_swap = pL_pjNew;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 pL_pjNew = pL_pjOld;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323 pL_pjOld = pL_swap;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325 /* Swap vjNew and vjOld buffers */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 /*------------------------------*/
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 pL_swap = pL_vjNew;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 pL_vjNew = pL_vjOld;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 pL_vjOld = pL_swap;
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 /* Compute the j-th reflection coefficient */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
335 swTemp = norm_l(pL_pjOld[0]); /* get shift count */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
336 swTemp1 = round(L_shl(pL_vjOld[0], swTemp)); /* normalize num. */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
337 swTemp2 = round(L_shl(pL_pjOld[0], swTemp)); /* normalize den. */
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 /* Test for invalid divide conditions: a) devisor < 0 b) abs(divident) >
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
340 * abs(devisor) If either of these conditions is true, zero out
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
341 * reflection coefficients for i=j,...,NP-1 and return. */
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 swAbsTemp1 = abs_s(swTemp1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
344 if (swTemp2 <= 0 || sub(swAbsTemp1, swTemp2) >= 0)
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 i = j;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347 for (i = j; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
348 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
349 pswRc[i] = 0;
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 return;
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
354 swRc = divide_s(swAbsTemp1, swTemp2); /* return division result */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
355 if (sub(swTemp1, swAbsTemp1) == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
356 swRc = negate(swRc); /* negate reflection Rc[j] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
357 swRcSq = mult_r(swRc, swRc); /* compute Rc^2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
358 pswRc[j] = swRc; /* copy Rc[j] to output array */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
359
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
360 /* Update pjNew and vjNew arrays for the next lattice stage if j < NP-1 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
361 /*---------------------------------------------------------------------*/
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 /* Updating pjNew: */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
366 for (i = 0; i <= NP - j - 2; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
367 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
368 L_temp = L_mpy_ls(pL_vjOld[i], swRc);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
369 L_sum = L_add(L_temp, pL_pjOld[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
370 L_temp = L_mpy_ls(pL_pjOld[i], swRcSq);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
371 L_sum = L_add(L_temp, L_sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
372 L_temp = L_mpy_ls(pL_vjOld[-i], swRc);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
373 pL_pjNew[i] = L_add(L_sum, L_temp);
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
376 /* Updating vjNew: */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
377 /*-----------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
378
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
379 for (i = -NP + j + 2; i <= NP - j - 2; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
380 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
381 L_temp = L_mpy_ls(pL_vjOld[-i - 1], swRcSq);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
382 L_sum = L_add(L_temp, pL_vjOld[i + 1]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
383 L_temp = L_mpy_ls(pL_pjOld[(((i + 1) >= 0) ? i + 1 : -(i + 1))], swRc);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
384 L_temp = L_shl(L_temp, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
385 pL_vjNew[i] = L_add(L_temp, L_sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
386 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
387 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
388 return;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
389 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
390
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 * FUNCTION NAME: aToRc
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 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
396 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
397 * This subroutine computes a vector of reflection coefficients, given
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
398 * an input vector of direct form LPC filter coefficients.
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 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
401 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
402 * NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
403 * order of the LPC filter (global constant)
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 * swAshift
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
406 * The number of right shifts applied externally
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
407 * to the direct form filter coefficients.
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 * pswAin[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
410 * The input vector of direct form LPC filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
411 * coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
412 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
413 * OUTPUTS:
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 * pswRc[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
416 * Array containing the reflection coefficients.
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 * RETURN VALUE:
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 * siUnstableFlt
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
421 * If stable reflection coefficients 0, 1 if unstable.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
422 *
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 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
425 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
426 * This function performs the conversion from direct form
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
427 * 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
428 * and interpolateCheck(). In a_sst() reflection coefficients used
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
429 * 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
430 * conversion.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
431 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
432 * When performing interpolation, a stability check must be
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
433 * performed. interpolateCheck() does this by calling aToRc().
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 * 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
436 * 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
437 * 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
438 * "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
439 * Schafer; Prentice-Hall; Englewood Cliffs, NJ (USA). 1978.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
440 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
441 * 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
442 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
443 * KEYWORDS: reflectioncoefficients, parcors, conversion, atorc, ks, as
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
444 * KEYWORDS: parcorcoefficients, lpc, flat, vectorquantization
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
445 *
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
603
27df1cef042c libgsmhr1: put aToRc() only in dec_func.c
Mychaela Falconia <falcon@freecalypso.org>
parents: 602
diff changeset
448 short aToRc(Shortword swAshift, Shortword pswAin[], Shortword pswRc[])
594
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
451 /*_________________________________________________________________________
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 | Constants |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
454 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
455 */
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 /*_________________________________________________________________________
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 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
460 |_________________________________________________________________________|
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 Shortword pswTmpSpace[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
464 pswASpace[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
465 swNormShift,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
466 swActShift,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
467 swNormProd,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
468 swRcOverE,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
469 swDiv,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
470 *pswSwap,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
471 *pswTmp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
472 *pswA;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
473
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
474 Longword L_temp;
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 short int siUnstableFlt,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
477 i,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
478 j; /* Loop control variables */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
479
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
480 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
481 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
482 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
483 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
484 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
485
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
486 /* Initialize starting addresses for temporary buffers */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
487 /*-----------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
488
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
489 pswA = pswASpace;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
490 pswTmp = pswTmpSpace;
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 /* 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
493 /*---------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
494
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
495 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
496 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
497 pswA[i] = pswAin[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
498 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
499
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
500 /* Initialize the flag for filter stability check */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
501 /*------------------------------------------------*/
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 siUnstableFlt = 0;
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 /* 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
506 /*-------------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
507
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
508 for (i = NP - 1; i >= 1; i--)
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 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
512
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
513 /* Check the stability of i-th reflection coefficient */
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 siUnstableFlt = siUnstableFlt | isSwLimit(pswRc[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
517
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
518 /* Precompute intermediate variables for needed for the computation */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
519 /* of direct form filter of order i-1 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
520 /*------------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
521
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
522 if (sub(pswRc[i], SW_MIN) == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
523 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
524 siUnstableFlt = 1;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
525 swRcOverE = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
526 swDiv = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
527 swActShift = 2;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
528 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
529 else
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 L_temp = LW_MAX; /* Load ~1.0 into accum */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
532 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
533 swNormShift = norm_l(L_temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
534 L_temp = L_shl(L_temp, swNormShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
535 swNormProd = extract_h(L_temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
536 swActShift = add(2, swNormShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
537 swDiv = divide_s(0x2000, swNormProd);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
538 swRcOverE = mult_r(pswRc[i], swDiv);
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 /* Check stability */
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 siUnstableFlt = siUnstableFlt | isSwLimit(swRcOverE);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
543
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
544 /* Compute direct form filter coefficients corresponding to */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
545 /* a direct form filter of order i-1 */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
548 for (j = 0; j <= i - 1; j++)
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 L_temp = L_mult(pswA[j], swDiv);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
551 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
552 L_temp = L_shl(L_temp, swActShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
553 pswTmp[j] = round(L_temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
554 siUnstableFlt = siUnstableFlt | isSwLimit(pswTmp[j]);
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
557 /* Swap swA and swTmp buffers */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
560 pswSwap = pswA;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
561 pswA = pswTmp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
562 pswTmp = pswSwap;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
563 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
564
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
565 /* Compute reflection coefficient Rc[0] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
566 /*--------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
567
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
568 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
569
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
570 /* Check the stability of 0-th reflection coefficient */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
571 /*----------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
572
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
573 siUnstableFlt = siUnstableFlt | isSwLimit(pswRc[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
574
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
575 return (siUnstableFlt);
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
578 /***************************************************************************
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 * FUNCTION NAME: b_con
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
581 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
582 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
583 * Expands codeword into an one dimensional array. The 0/1 input is
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
584 * changed to an element with magnitude +/- 0.5.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
585 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
586 * input output
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 * 0 -0.5
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
589 * 1 +0.5
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
590 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
591 * INPUT:
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 * swCodeWord
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
594 * Input codeword, information in the LSB's
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 * siNumBits
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
597 * number of bits in the input codeword and number
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
598 * of elements in output vector
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 * pswVectOut[0:siNumBits]
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 * pointer to bit array
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 * OUTPUT:
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 * pswVectOut[0:siNumBits]
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 * signed bit array
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
609 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
610 * RETURN:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
611 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
612 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
613 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
614 * REFERENCES: Sub_Clause 4.1.10 and 4.2.1 of GSM Recomendation 06.20
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 * KEYWORDS: b_con, codeword, expansion
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
617 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
618 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
619
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
620 void b_con(Shortword swCodeWord, short siNumBits,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
621 Shortword pswVectOut[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
622 {
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 /*_________________________________________________________________________
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 | Automatic Variables |
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 */
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 short int siLoopCnt;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
631
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
632 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
633 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
634 | Executable Code |
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 */
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 for (siLoopCnt = 0; siLoopCnt < siNumBits; siLoopCnt++)
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
641 if (swCodeWord & 1) /* temp accumulator get 0.5 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
642 pswVectOut[siLoopCnt] = (Shortword) 0x4000;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
643 else /* temp accumulator gets -0.5 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
644 pswVectOut[siLoopCnt] = (Shortword) 0xc000;
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 swCodeWord = shr(swCodeWord, 1);
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 }
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 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
651 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
652 * FUNCTION NAME: fp_ex
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 * PURPOSE:
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 * Looks up a vector in the adaptive excitation codebook (long-term
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
657 * predictor).
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 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
660 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
661 * swOrigLagIn
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 * Extended resolution lag (lag * oversampling factor)
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 * pswLTPState[-147:39]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
666 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
667 * Adaptive codebook (with space at end for looked up
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
668 * vector). Indicies [-147:-1] are the history, [0:39]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
669 * are for the looked up vector.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
670 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
671 * psrPitchIntrpFirBase[0:59]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
672 * ppsrPVecIntFilt[0:9][0:5] ([tap][phase])
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 * Interpolating FIR filter coefficients.
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 * OUTPUTS:
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 * pswLTPState[0:39]
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 * Array containing the contructed output vector
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 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
683 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
684 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
685 * DESCRIPTION:
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 * The adaptive codebook consists of the history of the excitation.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
688 * The vector is looked up by going back into this history
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
689 * by the amount of the input lag. If the input lag is fractional,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
690 * then the samples to be looked up are interpolated from the existing
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
691 * samples in the history.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
692 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
693 * If the lag is less than the length of the vector to be generated
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
694 * (i.e. less than the subframe length), then the lag is doubled
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
695 * after the first n samples have been looked up (n = input lag).
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
696 * In this way, the samples being generated are not part of the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
697 * codebook. This is described in section 4.1.8.
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 * REFERENCES: Sub_Clause 4.1.8.5 and 4.2.1 of GSM Recomendation 06.20
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 * Keywords: pitch, excitation vector, long term filter, history,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
702 * Keywords: fractional lag, get_ipjj
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
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
708 void fp_ex(Shortword swOrigLagIn,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
709 Shortword pswLTPState[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
710 {
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 /*_________________________________________________________________________
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 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
715 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
716 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
717
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
718 Longword L_Temp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
719 Shortword swIntLag,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
720 swRemain,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
721 swRunningLag;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
722 short int siSampsSoFar,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
723 siSampsThisPass,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
724 i,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
725 j;
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 | Executable Code |
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 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
732
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
733 /* Loop: execute until all samples in the vector have been looked up */
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 swRunningLag = swOrigLagIn;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
737 siSampsSoFar = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
738 while (siSampsSoFar < S_LEN)
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
741 /* Get integer lag and remainder. These are used in addressing */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
742 /* the LTP state and the interpolating filter, respectively */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
743 /*--------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
744
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
745 get_ipjj(swRunningLag, &swIntLag, &swRemain);
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
748 /* Get the number of samples to look up in this pass */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
749 /*---------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
750
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
751 if (sub(swIntLag, S_LEN) < 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
752 siSampsThisPass = swIntLag - siSampsSoFar;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
753 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
754 siSampsThisPass = S_LEN - siSampsSoFar;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
755
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
756 /* Look up samples by interpolating (fractional lag), or copying */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
757 /* (integer lag). */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
760 if (swRemain == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
761 {
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 /* Integer lag: copy samples from history */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
764 /*----------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
765
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
766 for (i = siSampsSoFar; i < siSampsSoFar + siSampsThisPass; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
767 pswLTPState[i] = pswLTPState[i - swIntLag];
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 else
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 /* Fractional lag: interpolate to get samples */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
773 /*--------------------------------------------*/
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 for (i = siSampsSoFar; i < siSampsSoFar + siSampsThisPass; i++)
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
778 /* first tap with rounding offset */
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 L_Temp = L_mac((long) 32768,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
781 pswLTPState[i - swIntLag - P_INT_MACS / 2],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
782 ppsrPVecIntFilt[0][swRemain]);
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 for (j = 1; j < P_INT_MACS - 1; j++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
785 {
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 L_Temp = L_mac(L_Temp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
788 pswLTPState[i - swIntLag - P_INT_MACS / 2 + j],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
789 ppsrPVecIntFilt[j][swRemain]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
790
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
791 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
792
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
793 pswLTPState[i] = extract_h(L_mac(L_Temp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
794 pswLTPState[i - swIntLag + P_INT_MACS / 2 - 1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
795 ppsrPVecIntFilt[P_INT_MACS - 1][swRemain]));
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
796 }
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 /* Done with this pass: update loop controls */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
800 /*-------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
801
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
802 siSampsSoFar += siSampsThisPass;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
803 swRunningLag = add(swRunningLag, swOrigLagIn);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
804 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
805 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
806
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
807 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
808 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
809 * FUNCTION NAME: g_corr1 (no scaling)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
810 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
811 * PURPOSE:
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 * Calculates energy in subframe vector. Differs from g_corr1s,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
814 * in that there the estimate of the maximum possible
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
815 * energy is < 1.0
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
816 *
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 * INPUT:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
819 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
820 * pswIn[0:39]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
821 * A subframe vector.
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 * OUTPUT:
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 * *pL_out
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
827 * A Longword containing the normalized energy
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
828 * in the input vector.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
829 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
830 * RETURN:
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 * swOut
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
833 * Number of right shifts which the accumulator was
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
834 * shifted to normalize it. Negative number implies
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
835 * a left shift, and therefore an energy larger than
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
836 * 1.0.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
837 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
838 * REFERENCES: Sub_Clause 4.1.10.2 and 4.2.1 of GSM Recomendation 06.20
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 * KEYWORDS: energy, autocorrelation, correlation, g_corr1
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 *************************************************************************/
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 Shortword g_corr1(Shortword *pswIn, Longword *pL_out)
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
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 /*_________________________________________________________________________
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 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
852 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
853 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
854
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
855 Longword L_sum;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
856 Shortword swEngyLShft;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
857 int i;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
858
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 /*_________________________________________________________________________
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 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
863 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
864 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
865
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
866
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
867 /* Calculate energy in subframe vector (40 samples) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
868 /*--------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
869
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
870 L_sum = L_mult(pswIn[0], pswIn[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
871 for (i = 1; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
872 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
873 L_sum = L_mac(L_sum, pswIn[i], pswIn[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
874 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
875
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
876
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
877
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
878 if (L_sum != 0)
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 /* Normalize the energy in the output Longword */
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 swEngyLShft = norm_l(L_sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
885 *pL_out = L_shl(L_sum, swEngyLShft); /* normalize output
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
886 * Longword */
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 else
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
891 /* Special case: energy is zero */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
892 /*------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
893
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
894 *pL_out = L_sum;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
895 swEngyLShft = 0;
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
898 return (swEngyLShft);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
899 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
900
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
901 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
902 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
903 * FUNCTION NAME: g_corr1s (g_corr1 with scaling)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
904 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
905 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
906 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
907 * Calculates energy in subframe vector. Differs from g_corr1,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
908 * in that there is an estimate of the maximum possible energy in the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
909 * vector.
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 * INPUT:
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 * pswIn[0:39]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
914 * A subframe vector.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
915 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
916 * swEngyRShft
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
917 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
918 * 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
919 * to ensure that it remains less than 1.0
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
920 * (swEngyRShft is always positive or zero)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
921 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
922 * OUTPUT:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
923 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
924 * *pL_out
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
925 * A Longword containing the normalized energy
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
926 * in the input vector.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
927 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
928 * RETURN:
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 * swOut
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
931 * Number of right shifts which the accumulator was
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
932 * shifted to normalize it. Negative number implies
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
933 * a left shift, and therefore an energy larger than
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
934 * 1.0.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
935 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
936 * REFERENCES: Sub-Clause 4.1.8, 4.2.1, 4.2.2, and 4.2.4
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
937 * of GSM Recomendation 06.20
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 * keywords: energy, autocorrelation, correlation, g_corr1
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 *
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
944 Shortword g_corr1s(Shortword pswIn[], Shortword swEngyRShft,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
945 Longword *pL_out)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
946 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
947
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
948
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
949 /*_________________________________________________________________________
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 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
952 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
953 */
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 Longword L_sum;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
956 Shortword swTemp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
957 swEngyLShft;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
958 Shortword swInputRShft;
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 int i;
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
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 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
965 | Executable Code |
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 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
968
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
969
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
970 /* Calculate energy in subframe vector (40 samples) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
971 /*--------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
972
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
973 if (sub(swEngyRShft, 1) <= 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
974 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
975
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
976 /* use the energy shift factor, although it is an odd shift count */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
979 swTemp = shr(pswIn[0], swEngyRShft);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
980 L_sum = L_mult(pswIn[0], swTemp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
981 for (i = 1; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
982 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
983 swTemp = shr(pswIn[i], swEngyRShft);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
984 L_sum = L_mac(L_sum, pswIn[i], swTemp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
985 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
986
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
987 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
988 else
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 /* convert energy shift factor to an input shift factor */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
992 /*------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
993
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
994 swInputRShft = shift_r(swEngyRShft, -1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
995 swEngyRShft = shl(swInputRShft, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
996
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
997 swTemp = shr(pswIn[0], swInputRShft);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
998 L_sum = L_mult(swTemp, swTemp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
999 for (i = 1; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1000 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1001 swTemp = shr(pswIn[i], swInputRShft);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1002 L_sum = L_mac(L_sum, swTemp, swTemp);
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 if (L_sum != 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1007 {
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 /* Normalize the energy in the output Longword */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1012 swTemp = norm_l(L_sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1013 *pL_out = L_shl(L_sum, swTemp); /* normalize output Longword */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1014 swEngyLShft = sub(swTemp, swEngyRShft);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1015 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1016 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1017 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1018
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1019 /* Special case: energy is zero */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1022 *pL_out = L_sum;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1023 swEngyLShft = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1024 }
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 return (swEngyLShft);
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 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1031 * FUNCTION NAME: getSfrmLpc
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 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1034 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1035 * Given frame information from past and present frame, interpolate
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1036 * (or copy) the frame based LPC coefficients into subframe
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1037 * lpc coeffs, i.e. the ones which will be used by the subframe
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1038 * as opposed to those coded and transmitted.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1039 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1040 * INPUTS:
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 * siSoftInterpolation
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 * interpolate 1/0, a coded parameter.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1045 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1046 * swPrevR0,swNewR0
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 * Rq0 for the last frame and for this frame.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1049 * These are the decoded values, not the codewords.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1050 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1051 * Previous lpc coefficients from the previous frame:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1052 * in all filters below array[0] is the t=-1 element array[9]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1053 * t=-10 element.
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 * pswPrevFrmKs[0:9]
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 * decoded version of the rc's tx'd last frame
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1058 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1059 * pswPrevFrmAs[0:9]
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 * the above K's converted to A's. i.e. direct
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1062 * form coefficients.
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 * pswPrevFrmPFNum[0:9], pswPrevFrmPFDenom[0:9]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1065 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1066 * numerator and denominator coefficients used in the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1067 * postfilter
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 * Current lpc coefficients from the current frame:
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 * pswNewFrmKs[0:9], pswNewFrmAs[0:9],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1072 * pswNewFrmPFNum[0:9], pswNewFrmPFDenom[0:9] same as above.
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 * OUTPUTS:
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 * psnsSqrtRs[0:3]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1077 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1078 * a normalized number (struct NormSw)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1079 * containing an estimate of RS for each subframe.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1080 * (number and a shift)
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 * ppswSynthAs[0:3][0:9]
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 * filter coefficients used by the synthesis filter.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1085 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1086 * ppswPFNumAs[0:3][0:9]
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 * filter coefficients used by the postfilters
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1089 * numerator.
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 * ppswPFDenomAs[0:3][0:9]
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 * filter coefficients used by postfilters denominator.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1094 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1095 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1096 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1097 * None
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 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1100 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1101 * For interpolated subframes, the direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1102 * are converted to reflection coeffiecients to check for
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1103 * filter stability. If unstable, the uninterpolated coef.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1104 * are used for that subframe.
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 * Interpolation is described in section 4.1.6, "Soft Interpolation
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1107 * of the Spectral Parameters"
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 * 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
1110 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1111 * KEYWORDS: soft interpolation, int_lpc, interpolate, atorc,res_eng,i_mov
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1115 void getSfrmLpc(short int siSoftInterpolation,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1116 Shortword swPrevR0, Shortword swNewR0,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1117 /* last frm */ Shortword pswPrevFrmKs[], Shortword pswPrevFrmAs[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1118 Shortword pswPrevFrmPFNum[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1119 Shortword pswPrevFrmPFDenom[],
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 /* this frm */ Shortword pswNewFrmKs[], Shortword pswNewFrmAs[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1122 Shortword pswNewFrmPFNum[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1123 Shortword pswNewFrmPFDenom[],
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 /* output */ struct NormSw *psnsSqrtRs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1126 Shortword *ppswSynthAs[], Shortword *ppswPFNumAs[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1127 Shortword *ppswPFDenomAs[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1128 {
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 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1132 | Local Static Variables |
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 */
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
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 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1140 |_________________________________________________________________________|
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 short int siSfrm,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1144 siStable,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1145 i;
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 Longword L_Temp1,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1148 L_Temp2;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1149
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 | Executable Code |
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 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1155
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1156 if (siSoftInterpolation)
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 /* yes, interpolating */
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 siSfrm = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1162
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1163 siStable = interpolateCheck(pswPrevFrmKs, pswPrevFrmAs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1164 pswPrevFrmAs, pswNewFrmAs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1165 psrOldCont[siSfrm], psrNewCont[siSfrm],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1166 swPrevR0,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1167 &psnsSqrtRs[siSfrm],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1168 ppswSynthAs[siSfrm]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1169 if (siStable)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1170 {
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 /* interpolate between direct form coefficient sets */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1173 /* for both numerator and denominator coefficients */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1174 /* assume output will be stable */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1177 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1178 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1179 L_Temp1 = L_mult(pswNewFrmPFNum[i], psrNewCont[siSfrm]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1180 ppswPFNumAs[siSfrm][i] = mac_r(L_Temp1, pswPrevFrmPFNum[i],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1181 psrOldCont[siSfrm]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1182 L_Temp2 = L_mult(pswNewFrmPFDenom[i], psrNewCont[siSfrm]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1183 ppswPFDenomAs[siSfrm][i] = mac_r(L_Temp2, pswPrevFrmPFDenom[i],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1184 psrOldCont[siSfrm]);
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 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1187 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1188 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1189 /* this subframe is unstable */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1190 /* ------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1191 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1192 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1193 ppswPFNumAs[siSfrm][i] = pswPrevFrmPFNum[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1194 ppswPFDenomAs[siSfrm][i] = pswPrevFrmPFDenom[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1195 }
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 for (siSfrm = 1; siSfrm < N_SUB - 1; siSfrm++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1198 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1199
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1200 siStable = interpolateCheck(pswNewFrmKs, pswNewFrmAs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1201 pswPrevFrmAs, pswNewFrmAs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1202 psrOldCont[siSfrm], psrNewCont[siSfrm],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1203 swNewR0,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1204 &psnsSqrtRs[siSfrm],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1205 ppswSynthAs[siSfrm]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1206 if (siStable)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1207 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1208
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1209 /* interpolate between direct form coefficient sets */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1210 /* for both numerator and denominator coefficients */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1211 /* assume output will be stable */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1214 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1215 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1216 L_Temp1 = L_mult(pswNewFrmPFNum[i], psrNewCont[siSfrm]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1217 ppswPFNumAs[siSfrm][i] = mac_r(L_Temp1, pswPrevFrmPFNum[i],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1218 psrOldCont[siSfrm]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1219 L_Temp2 = L_mult(pswNewFrmPFDenom[i], psrNewCont[siSfrm]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1220 ppswPFDenomAs[siSfrm][i] = mac_r(L_Temp2, pswPrevFrmPFDenom[i],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1221 psrOldCont[siSfrm]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1222 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1223 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1224 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1225 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1226 /* this subframe has unstable filter coeffs, would like to
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1227 * interpolate but can not */
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 for (i = 0; i < NP; i++)
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 ppswPFNumAs[siSfrm][i] = pswNewFrmPFNum[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1232 ppswPFDenomAs[siSfrm][i] = pswNewFrmPFDenom[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1233 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1234 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1235 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1236 /* the last subframe never interpolate */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1237 /* ----------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1238 siSfrm = 3;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1239 for (i = 0; i < NP; i++)
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 ppswPFNumAs[siSfrm][i] = pswNewFrmPFNum[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1242 ppswPFDenomAs[siSfrm][i] = pswNewFrmPFDenom[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1243 ppswSynthAs[siSfrm][i] = pswNewFrmAs[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1244 }
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 res_eng(pswNewFrmKs, swNewR0, &psnsSqrtRs[siSfrm]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1247
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1248 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1249 /* SoftInterpolation == 0 - no interpolation */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1250 /* ------------------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1251 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1252 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1253 siSfrm = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1254 for (i = 0; i < NP; i++)
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 ppswPFNumAs[siSfrm][i] = pswPrevFrmPFNum[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1257 ppswPFDenomAs[siSfrm][i] = pswPrevFrmPFDenom[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1258 ppswSynthAs[siSfrm][i] = pswPrevFrmAs[i];
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1261 res_eng(pswPrevFrmKs, swPrevR0, &psnsSqrtRs[siSfrm]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1262
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1263 /* for subframe 1 and all subsequent sfrms, use result from new frm */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1267 res_eng(pswNewFrmKs, swNewR0, &psnsSqrtRs[1]);
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 for (siSfrm = 1; siSfrm < N_SUB; siSfrm++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1270 {
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1273 psnsSqrtRs[siSfrm].man = psnsSqrtRs[1].man;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1274 psnsSqrtRs[siSfrm].sh = psnsSqrtRs[1].sh;
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 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1277 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1278 ppswPFNumAs[siSfrm][i] = pswNewFrmPFNum[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1279 ppswPFDenomAs[siSfrm][i] = pswNewFrmPFDenom[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1280 ppswSynthAs[siSfrm][i] = pswNewFrmAs[i];
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 }
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 * FUNCTION NAME: get_ipjj
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 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1291 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1292 * This subroutine calculates IP, the single-resolution lag rounded
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1293 * down to the nearest integer, and JJ, the remainder when the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1294 * extended resolution lag is divided by the oversampling factor
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 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1297 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1298 * swLagIn
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1299 * extended resolution lag as an integer, i.e.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1300 * fractional lag x oversampling factor
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1301 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1302 * OUTPUTS:
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 * *pswIp
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1305 * fractional lag rounded down to nearest integer, IP
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 * *pswJj
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1308 * the remainder JJ
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1309 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1310 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1311 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1312 * none
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 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1315 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1316 * ip = integer[lag/OS_FCTR]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1317 * jj = integer_round[((lag/OS_FCTR)-ip)*(OS_FCTR)]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1318 * if the rounding caused an 'overflow'
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1319 * set remainder jj to 0 and add 'carry' to ip
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1320 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1321 * This routine is involved in the mechanics of fractional and
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1322 * integer LTP searchs. The LTP is described in section 5.
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 * REFERENCES: Sub-clause 4.1.8 and 4.2.2 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1325 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1326 * KEYWORDS: lag, fractional, remainder, ip, jj, get_ipjj
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1327 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1328 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1329
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1330 void get_ipjj(Shortword swLagIn,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1331 Shortword *pswIp, Shortword *pswJj)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1332 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1333
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 | Local Constants |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1337 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1338 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1339
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1340 #define OS_FCTR_INV (Shortword)0x1555/* SW_MAX/OS_FCTR */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1341
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1342 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1343 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1344 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1345 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1346 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1347
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1348 Longword L_Temp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1349
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1350 Shortword swTemp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1351 swTempIp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1352 swTempJj;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1353
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1354 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1355 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1356 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1357 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1358 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1359
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1360 /* calculate ip */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1361 /* ------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1362
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1363 L_Temp = L_mult(OS_FCTR_INV, swLagIn); /* lag/OS_FCTR */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1364 swTempIp = extract_h(L_Temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1365
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1366 /* calculate jj */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1367 /* ------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1368
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1369 swTemp = extract_l(L_Temp); /* loose ip */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1370 swTemp = shr(swTemp, 1); /* isolate jj fraction */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1371 swTemp = swTemp & SW_MAX;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1372 L_Temp = L_mult(swTemp, OS_FCTR); /* ((lag/OS_FCTR)-ip))*(OS_FCTR) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1373 swTemp = round(L_Temp); /* round and pick-off jj */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1374 if (sub(swTemp, OS_FCTR) == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1375 { /* if 'overflow ' */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1376 swTempJj = 0; /* set remainder,jj to 0 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1377 swTempIp = add(swTempIp, 1); /* 'carry' overflow into ip */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1378 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1379 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1380 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1381 swTempJj = swTemp; /* read-off remainder,jj */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1382 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1383
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1384 /* return ip and jj */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1385 /* ---------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1386
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1387 *pswIp = swTempIp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1388 *pswJj = swTempJj;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1389 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1390
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1391 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1392 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1393 * FUNCTION NAME: interpolateCheck
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1394 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1395 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1396 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1397 * Interpolates between direct form coefficient sets.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1398 * Before releasing the interpolated coefficients, they are checked.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1399 * If unstable, the "old" parameters are used.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1400 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1401 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1402 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1403 * pswRefKs[0:9]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1404 * decoded version of the rc's tx'd last frame
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1405 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1406 * pswRefCoefsA[0:9]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1407 * above K's converted to direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1408 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1409 * pswOldCoefsA[0:9]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1410 * array of old Coefseters
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1411 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1412 * pswNewCoefsA[0:9]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1413 * array of new Coefseters
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1414 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1415 * swOldPer
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1416 * amount old coefs supply to the output
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1417 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1418 * swNewPer
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1419 * amount new coefs supply to the output
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1420 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1421 * ASHIFT
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1422 * shift for reflection coef. conversion
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1423 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1424 * swRq
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1425 * quantized energy to use for subframe
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1426 * *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1427 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1428 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1429 * psnsSqrtRsOut
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1430 * output pointer to sqrt(RS) normalized
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1431 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1432 * pswCoefOutA[0:9]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1433 * output coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1434 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1435 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1436 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1437 * siInterp_flg
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1438 * temporary subframe interpolation flag
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1439 * 0 - coef. interpolated, 1 -coef. not interpolated
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1440 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1441 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1442 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1443 * For interpolated subframes, the direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1444 * are converted to reflection coefficients to check for
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1445 * filter stability. If unstable, the uninterpolated coef.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1446 * are used for that subframe. Section 4.1.6 describes
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1447 * interpolation.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1448 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1449 * 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
1450 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1451 * KEYWORDS: soft interpolation, int_lpc, interpolate, atorc,res_eng,i_mov
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1452 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1453 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1454
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1455 short int interpolateCheck(Shortword pswRefKs[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1456 Shortword pswRefCoefsA[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1457 Shortword pswOldCoefsA[], Shortword pswNewCoefsA[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1458 Shortword swOldPer, Shortword swNewPer,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1459 Shortword swRq,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1460 struct NormSw *psnsSqrtRsOut,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1461 Shortword pswCoefOutA[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1462 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1463
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1464 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1465 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1466 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1467 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1468 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1469
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1470 Shortword pswRcTemp[NP];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1471
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1472 Longword L_Temp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1473
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1474 short int siInterp_flg,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1475 i;
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 /*_________________________________________________________________________
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 | Executable Code |
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1483 /* Interpolation loop, NP is order of LPC filter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1484 /* --------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1485
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1486 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1487 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1488 L_Temp = L_mult(pswNewCoefsA[i], swNewPer);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1489 pswCoefOutA[i] = mac_r(L_Temp, pswOldCoefsA[i], swOldPer);
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 /* Convert to reflection coefficients and check stability */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1495 if (aToRc(ASHIFT, pswCoefOutA, pswRcTemp) != 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1496 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1497
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1498 /* Unstable, use uninterpolated parameters and compute RS update the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1499 * state with the frame data closest to this subfrm */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1500 /* --------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1501
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1502 res_eng(pswRefKs, swRq, psnsSqrtRsOut);
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 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1505 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1506 pswCoefOutA[i] = pswRefCoefsA[i];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1507 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1508 siInterp_flg = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1509 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1510 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1511 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1512
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1513 /* Stable, compute RS */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1514 /* ------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1515 res_eng(pswRcTemp, swRq, psnsSqrtRsOut);
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 /* Set temporary subframe interpolation flag */
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 siInterp_flg = 1;
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1522 /* Return subframe interpolation flag */
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 return (siInterp_flg);
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 /***************************************************************************
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 * FUNCTION NAME: lpcFir
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1530 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1531 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1532 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1533 * The purpose of this function is to perform direct form fir filtering
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1534 * assuming a NP order filter and given state, coefficients, and input.
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 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1537 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1538 * NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1539 * order of the lpc filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1540 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1541 * S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1542 * number of samples to filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1543 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1544 * pswInput[0:S_LEN-1]
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 * input array of points to be filtered.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1547 * pswInput[0] is the oldest point (first to be filtered)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1548 * pswInput[siLen-1] is the last point filtered (newest)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1549 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1550 * pswCoef[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1551 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1552 * array of direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1553 * pswCoef[0] = coeff for delay n = -1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1554 * pswCoef[NP-1] = coeff for delay n = -NP
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 * ASHIFT
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1557 * number of shifts input A's have been shifted down by
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 * LPC_ROUND
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1560 * rounding constant
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 * pswState[0:NP-1]
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 * array of the filter state following form of pswCoef
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1565 * pswState[0] = state of filter for delay n = -1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1566 * pswState[NP-1] = state of filter for delay n = -NP
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 * OUTPUTS:
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 * pswState[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1571 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1572 * updated filter state, ready to filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1573 * pswInput[siLen], i.e. the next point
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1574 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1575 * pswFiltOut[0:S_LEN-1]
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 * the filtered output
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1578 * same format as pswInput, pswFiltOut[0] is oldest point
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 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1581 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1582 * none
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 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1585 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1586 * because of the default sign of the coefficients the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1587 * formula for the filter is :
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1588 * i=0, i < S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1589 * out[i] = rounded(state[i]*coef[0])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1590 * j=1, j < NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1591 * out[i] += state[j]*coef[j] (state is taken from either input
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1592 * state[] or input in[] arrays)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1593 * rescale(out[i])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1594 * out[i] += in[i]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1595 * update final state array using in[]
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 * REFERENCES: Sub-clause 4.1.7 and 4.2.4 of GSM Recomendation 06.20
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 * KEYWORDS: lpc, directform, fir, lpcFir, inversefilter, lpcFilt
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1600 * KEYWORDS: dirForm, dir_mod, dir_clr, dir_neg, dir_set, i_dir_mod
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 *************************************************************************/
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 void lpcFir(Shortword pswInput[], Shortword pswCoef[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1605 Shortword pswState[], Shortword pswFiltOut[])
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 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1610 | Automatic Variables |
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1614 Longword L_Sum;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1615 short int siStage,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1616 siSmp;
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 /*_________________________________________________________________________
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 | Executable Code |
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 */
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 /* filter 1st sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1625 /* ----------------- */
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 /* sum past state outputs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1628 /* ---------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1629 /* 0th coef, with rounding */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1630 L_Sum = L_mac(LPC_ROUND, pswState[0], pswCoef[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1631
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1632 for (siStage = 1; siStage < NP; siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1633 { /* remaining coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1634 L_Sum = L_mac(L_Sum, pswState[siStage], pswCoef[siStage]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1635 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1636
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1637 /* add input to partial output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1638 /* --------------------------- */
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 L_Sum = L_shl(L_Sum, ASHIFT);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1641 L_Sum = L_msu(L_Sum, pswInput[0], 0x8000);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1642
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1643 /* save 1st output sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1644 /* ---------------------- */
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 pswFiltOut[0] = extract_h(L_Sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1647
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1648 /* filter remaining samples */
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1651 for (siSmp = 1; siSmp < S_LEN; siSmp++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1652 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1653
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1654 /* sum past outputs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1655 /* ---------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1656 /* 0th coef, with rounding */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1657 L_Sum = L_mac(LPC_ROUND, pswInput[siSmp - 1], pswCoef[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1658 /* remaining coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1659 for (siStage = 1; ((0 < (siSmp - siStage)) && siStage < NP); siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1660 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1661 L_Sum = L_mac(L_Sum, pswInput[siSmp - siStage - 1], pswCoef[siStage]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1662 }
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 /* sum past states, if any */
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 for (siStage = siSmp; siStage < NP; siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1668 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1669 L_Sum = L_mac(L_Sum, pswState[siStage - siSmp], pswCoef[siStage]);
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
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1672 /* add input to partial output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1673 /* --------------------------- */
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 L_Sum = L_shl(L_Sum, ASHIFT);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1676 L_Sum = L_msu(L_Sum, pswInput[siSmp], 0x8000);
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 /* save current output sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1679 /* -------------------------- */
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 pswFiltOut[siSmp] = extract_h(L_Sum);
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 /* save final state */
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 for (siStage = 0; siStage < NP; siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1688 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1689 pswState[siStage] = pswInput[S_LEN - siStage - 1];
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 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1693
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1694 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1695 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1696 * FUNCTION NAME: lpcIir
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1697 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1698 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1699 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1700 * The purpose of this function is to perform direct form IIR filtering
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1701 * assuming a NP order filter and given state, coefficients, and input
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 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1704 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1705 * NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1706 * order of the lpc filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1707 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1708 * S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1709 * number of samples to filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1710 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1711 * pswInput[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1712 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1713 * input array of points to be filtered
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1714 * pswInput[0] is the oldest point (first to be filtered)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1715 * pswInput[siLen-1] is the last point filtered (newest)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1716 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1717 * pswCoef[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1718 * array of direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1719 * pswCoef[0] = coeff for delay n = -1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1720 * pswCoef[NP-1] = coeff for delay n = -NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1721 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1722 * ASHIFT
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1723 * number of shifts input A's have been shifted down by
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1724 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1725 * LPC_ROUND
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1726 * rounding constant
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1727 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1728 * pswState[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1729 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1730 * array of the filter state following form of pswCoef
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1731 * pswState[0] = state of filter for delay n = -1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1732 * pswState[NP-1] = state of filter for delay n = -NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1733 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1734 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1735 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1736 * pswState[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1737 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1738 * updated filter state, ready to filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1739 * pswInput[siLen], i.e. the next point
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1740 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1741 * pswFiltOut[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1742 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1743 * the filtered output
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1744 * same format as pswInput, pswFiltOut[0] is oldest point
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1745 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1746 * RETURN VALUE:
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 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1749 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1750 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1751 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1752 * because of the default sign of the coefficients the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1753 * formula for the filter is :
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1754 * i=0, i < S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1755 * out[i] = rounded(state[i]*coef[0])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1756 * j=1, j < NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1757 * out[i] -= state[j]*coef[j] (state is taken from either input
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1758 * state[] or prior out[] arrays)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1759 * rescale(out[i])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1760 * out[i] += in[i]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1761 * update final state array using out[]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1762 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1763 * REFERENCES: Sub-clause 4.1.7 and 4.2.4 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1764 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1765 * KEYWORDS: lpc, directform, iir, synthesisfilter, lpcFilt
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1766 * KEYWORDS: dirForm, dir_mod, dir_clr, dir_neg, dir_set
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1767 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1768 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1769
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1770 void lpcIir(Shortword pswInput[], Shortword pswCoef[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1771 Shortword pswState[], Shortword pswFiltOut[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1772 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1773
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1774 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1775 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1776 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1777 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1778 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1779
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1780 Longword L_Sum;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1781 short int siStage,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1782 siSmp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1783
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1784 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1785 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1786 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1787 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1788 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1789
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1790 /* filter 1st sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1791 /* ----------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1792
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1793 /* sum past state outputs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1794 /* ---------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1795 /* 0th coef, with rounding */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1796 L_Sum = L_msu(LPC_ROUND, pswState[0], pswCoef[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1797
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1798 for (siStage = 1; siStage < NP; siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1799 { /* remaining coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1800 L_Sum = L_msu(L_Sum, pswState[siStage], pswCoef[siStage]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1801 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1802
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1803 /* add input to partial output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1804 /* --------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1805
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1806 L_Sum = L_shl(L_Sum, ASHIFT);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1807 L_Sum = L_msu(L_Sum, pswInput[0], 0x8000);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1808
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1809 /* save 1st output sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1810 /* ---------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1811
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1812 pswFiltOut[0] = extract_h(L_Sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1813
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1814 /* filter remaining samples */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1815 /* ------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1816
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1817 for (siSmp = 1; siSmp < S_LEN; siSmp++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1818 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1819
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1820 /* sum past outputs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1821 /* ---------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1822 /* 0th coef, with rounding */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1823 L_Sum = L_msu(LPC_ROUND, pswFiltOut[siSmp - 1], pswCoef[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1824 /* remaining coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1825 for (siStage = 1; ((0 < (siSmp - siStage)) && siStage < NP); siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1826 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1827 L_Sum = L_msu(L_Sum, pswFiltOut[siSmp - siStage - 1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1828 pswCoef[siStage]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1829 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1830
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1831 /* sum past states, if any */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1832 /* ----------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1833
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1834 for (siStage = siSmp; siStage < NP; siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1835 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1836 L_Sum = L_msu(L_Sum, pswState[siStage - siSmp], pswCoef[siStage]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1837 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1838
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1839 /* add input to partial output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1840 /* --------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1841
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1842 L_Sum = L_shl(L_Sum, ASHIFT);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1843 L_Sum = L_msu(L_Sum, pswInput[siSmp], 0x8000);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1844
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1845 /* save current output sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1846 /* -------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1847
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1848 pswFiltOut[siSmp] = extract_h(L_Sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1849 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1850
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1851 /* save final state */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1852 /* ---------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1853
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1854 for (siStage = 0; siStage < NP; siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1855 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1856 pswState[siStage] = pswFiltOut[S_LEN - siStage - 1];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1857 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1858 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1859
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1860 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1861 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1862 * FUNCTION NAME: lpcIrZsIir
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1863 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1864 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1865 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1866 * The purpose of this function is to calculate the impulse response
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1867 * via direct form IIR filtering with zero state assuming a NP order
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1868 * filter and given coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1869 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1870 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1871 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1872 * NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1873 * order of the lpc filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1874 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1875 * S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1876 * number of samples to filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1877 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1878 * pswCoef[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1879 * array of direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1880 * pswCoef[0] = coeff for delay n = -1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1881 * pswCoef[NP-1] = coeff for delay n = -NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1882 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1883 * ASHIFT
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1884 * number of shifts input A's have been shifted down by
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1885 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1886 * LPC_ROUND
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1887 * rounding constant
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1888 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1889 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1890 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1891 * pswFiltOut[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1892 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1893 * the filtered output
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1894 * same format as pswInput, pswFiltOut[0] is oldest point
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1895 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1896 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1897 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1898 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1899 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1900 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1901 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1902 * This routine is called by getNWCoefs().
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1903 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1904 * Because of the default sign of the coefficients the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1905 * formula for the filter is :
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1906 * i=0, i < S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1907 * out[i] = rounded(state[i]*coef[0])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1908 * j=1, j < NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1909 * out[i] -= state[j]*coef[j] (state taken from prior output[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1910 * rescale(out[i])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1911 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1912 * REFERENCES: Sub-clause 4.1.8 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1913 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1914 * KEYWORDS: lpc, directform, iir, synthesisfilter, lpcFilt
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1915 * KEYWORDS: dirForm, dir_mod, dir_clr, dir_neg, dir_set
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1916 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1917 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1918
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1919 void lpcIrZsIir(Shortword pswCoef[], Shortword pswFiltOut[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1920 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1921
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1922 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1923 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1924 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1925 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1926 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1927
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1928 Longword L_Sum;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1929 short int siStage,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1930 siSmp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1931
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1932 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1933 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1934 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1935 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1936 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1937
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1938 /* output 1st sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1939 /* ----------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1940
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1941 pswFiltOut[0] = 0x0400;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1942
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1943 /* filter remaining samples */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1944 /* ------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1945
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1946 for (siSmp = 1; siSmp < S_LEN; siSmp++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1947 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1948
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1949 /* sum past outputs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1950 /* ---------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1951 /* 0th coef, with rounding */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1952 L_Sum = L_msu(LPC_ROUND, pswFiltOut[siSmp - 1], pswCoef[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1953 /* remaining coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1954 for (siStage = 1; ((0 < (siSmp - siStage)) && siStage < NP); siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1955 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1956 L_Sum = L_msu(L_Sum, pswFiltOut[siSmp - siStage - 1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1957 pswCoef[siStage]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1958 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1959
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1960 /* scale output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1961 /* ------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1962
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1963 L_Sum = L_shl(L_Sum, ASHIFT);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1964
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1965 /* save current output sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1966 /* -------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1967
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1968 pswFiltOut[siSmp] = extract_h(L_Sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1969 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1970 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1971
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1972 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1973 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1974 * FUNCTION NAME: lpcZiIir
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1975 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1976 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1977 * The purpose of this function is to perform direct form iir filtering
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1978 * with zero input assuming a NP order filter, and given state and
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1979 * coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1980 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1981 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1982 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1983 * NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1984 * order of the lpc filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1985 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1986 * S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1987 * number of samples to filter MUST be <= MAX_ZIS
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1988 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1989 * pswCoef[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1990 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1991 * array of direct form coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1992 * pswCoef[0] = coeff for delay n = -1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1993 * pswCoef[NP-1] = coeff for delay n = -NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1994 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1995 * ASHIFT
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1996 * number of shifts input A's have been shifted down by
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1997 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1998 * LPC_ROUND
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1999 * rounding constant
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2000 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2001 * pswState[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2002 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2003 * array of the filter state following form of pswCoef
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2004 * pswState[0] = state of filter for delay n = -1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2005 * pswState[NP-1] = state of filter for delay n = -NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2006 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2007 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2008 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2009 * pswFiltOut[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2010 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2011 * the filtered output
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2012 * same format as pswIn, pswFiltOut[0] is oldest point
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2013 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2014 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2015 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2016 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2017 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2018 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2019 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2020 * The routine is called from sfrmAnalysis, and is used to let the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2021 * LPC filters ring out.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2022 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2023 * because of the default sign of the coefficients the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2024 * formula for the filter is :
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2025 * i=0, i < S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2026 * out[i] = rounded(state[i]*coef[0])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2027 * j=1, j < NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2028 * out[i] -= state[j]*coef[j] (state is taken from either input
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2029 * state[] or prior output[] arrays)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2030 * rescale(out[i])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2031 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2032 * REFERENCES: Sub-clause 4.1.7 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2033 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2034 * KEYWORDS: lpc, directform, iir, synthesisfilter, lpcFilt
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2035 * KEYWORDS: dirForm, dir_mod, dir_clr, dir_neg, dir_set
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2036 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2037 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2038
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2039 void lpcZiIir(Shortword pswCoef[], Shortword pswState[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2040 Shortword pswFiltOut[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2041 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2042
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2043 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2044 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2045 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2046 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2047 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2048
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2049 Longword L_Sum;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2050 short int siStage,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2051 siSmp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2052
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2053 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2054 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2055 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2056 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2057 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2058
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2059 /* filter 1st sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2060 /* ----------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2061
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2062 /* sum past state outputs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2063 /* ---------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2064 /* 0th coef, with rounding */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2065 L_Sum = L_msu(LPC_ROUND, pswState[0], pswCoef[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2066
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2067 for (siStage = 1; siStage < NP; siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2068 { /* remaining coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2069 L_Sum = L_msu(L_Sum, pswState[siStage], pswCoef[siStage]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2070 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2071
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2072 /* scale output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2073 /* ------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2074
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2075 L_Sum = L_shl(L_Sum, ASHIFT);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2076
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2077 /* save 1st output sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2078 /* ---------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2079
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2080 pswFiltOut[0] = extract_h(L_Sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2081
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2082 /* filter remaining samples */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2083 /* ------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2084
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2085 for (siSmp = 1; siSmp < S_LEN; siSmp++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2086 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2087
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2088 /* sum past outputs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2089 /* ---------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2090 /* 0th coef, with rounding */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2091 L_Sum = L_msu(LPC_ROUND, pswFiltOut[siSmp - 1], pswCoef[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2092 /* remaining coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2093 for (siStage = 1; ((0 < (siSmp - siStage)) && siStage < NP); siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2094 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2095 L_Sum = L_msu(L_Sum, pswFiltOut[siSmp - siStage - 1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2096 pswCoef[siStage]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2097 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2098
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2099 /* sum past states, if any */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2100 /* ----------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2101
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2102 for (siStage = siSmp; siStage < NP; siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2103 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2104 L_Sum = L_msu(L_Sum, pswState[siStage - siSmp], pswCoef[siStage]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2105 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2106
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2107 /* scale output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2108 /* ------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2109
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2110 L_Sum = L_shl(L_Sum, ASHIFT);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2111
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2112 /* save current output sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2113 /* -------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2114
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2115 pswFiltOut[siSmp] = extract_h(L_Sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2116 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2117 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2118
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2119 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2120 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2121 * FUNCTION NAME: lpcZsFir
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2122 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2123 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2124 * The purpose of this function is to perform direct form fir filtering
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2125 * with zero state, assuming a NP order filter and given coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2126 * and non-zero input.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2127 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2128 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2129 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2130 * NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2131 * order of the lpc filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2132 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2133 * S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2134 * number of samples to filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2135 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2136 * pswInput[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2137 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2138 * input array of points to be filtered.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2139 * pswInput[0] is the oldest point (first to be filtered)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2140 * pswInput[siLen-1] is the last point filtered (newest)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2141 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2142 * pswCoef[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2143 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2144 * array of direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2145 * pswCoef[0] = coeff for delay n = -1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2146 * pswCoef[NP-1] = coeff for delay n = -NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2147 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2148 * ASHIFT
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2149 * number of shifts input A's have been shifted down by
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2150 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2151 * LPC_ROUND
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2152 * rounding constant
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2153 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2154 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2155 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2156 * pswFiltOut[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2157 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2158 * the filtered output
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2159 * same format as pswInput, pswFiltOut[0] is oldest point
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2160 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2161 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2162 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2163 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2164 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2165 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2166 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2167 * This routine is used in getNWCoefs(). See section 4.1.7.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2168 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2169 * because of the default sign of the coefficients the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2170 * formula for the filter is :
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2171 * i=0, i < S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2172 * out[i] = rounded(state[i]*coef[0])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2173 * j=1, j < NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2174 * out[i] += state[j]*coef[j] (state taken from in[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2175 * rescale(out[i])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2176 * out[i] += in[i]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2177 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2178 * REFERENCES: Sub-clause 4.1.7 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2179 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2180 * KEYWORDS: lpc, directform, fir, lpcFir, inversefilter, lpcFilt
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2181 * KEYWORDS: dirForm, dir_mod, dir_clr, dir_neg, dir_set, i_dir_mod
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2182 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2183 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2184
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2185 void lpcZsFir(Shortword pswInput[], Shortword pswCoef[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2186 Shortword pswFiltOut[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2187 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2188
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2189 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2190 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2191 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2192 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2193 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2194
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2195 Longword L_Sum;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2196 short int siStage,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2197 siSmp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2198
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2199 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2200 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2201 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2202 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2203 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2204
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2205 /* output 1st sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2206 /* ----------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2207
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2208 pswFiltOut[0] = pswInput[0];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2209
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2210 /* filter remaining samples */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2211 /* ------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2212
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2213 for (siSmp = 1; siSmp < S_LEN; siSmp++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2214 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2215
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2216 /* sum past outputs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2217 /* ---------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2218 /* 0th coef, with rounding */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2219 L_Sum = L_mac(LPC_ROUND, pswInput[siSmp - 1], pswCoef[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2220 /* remaining coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2221 for (siStage = 1; ((0 < (siSmp - siStage)) && siStage < NP); siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2222 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2223 L_Sum = L_mac(L_Sum, pswInput[siSmp - siStage - 1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2224 pswCoef[siStage]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2225 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2226
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2227 /* add input to partial output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2228 /* --------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2229
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2230 L_Sum = L_shl(L_Sum, ASHIFT);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2231 L_Sum = L_msu(L_Sum, pswInput[siSmp], 0x8000);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2232
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2233 /* save current output sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2234 /* -------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2235
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2236 pswFiltOut[siSmp] = extract_h(L_Sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2237 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2238 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2239
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2240 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2241 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2242 * FUNCTION NAME: lpcZsIir
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2243 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2244 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2245 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2246 * The purpose of this function is to perform direct form IIR filtering
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2247 * with zero state, assuming a NP order filter and given coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2248 * and non-zero input.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2249 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2250 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2251 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2252 * NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2253 * order of the lpc filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2254 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2255 * S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2256 * number of samples to filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2257 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2258 * pswInput[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2259 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2260 * input array of points to be filtered
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2261 * pswInput[0] is the oldest point (first to be filtered)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2262 * pswInput[siLen-1] is the last point filtered (newest)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2263 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2264 * pswCoef[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2265 * array of direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2266 * pswCoef[0] = coeff for delay n = -1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2267 * pswCoef[NP-1] = coeff for delay n = -NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2268 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2269 * ASHIFT
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2270 * number of shifts input A's have been shifted down by
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2271 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2272 * LPC_ROUND
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2273 * rounding constant
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2274 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2275 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2276 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2277 * pswFiltOut[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2278 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2279 * the filtered output
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2280 * same format as pswInput, pswFiltOut[0] is oldest point
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2281 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2282 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2283 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2284 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2285 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2286 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2287 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2288 * This routine is used in the subframe analysis process. It is
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2289 * called by sfrmAnalysis() and fnClosedLoop(). It is this function
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2290 * which performs the weighting of the excitation vectors.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2291 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2292 * because of the default sign of the coefficients the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2293 * formula for the filter is :
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2294 * i=0, i < S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2295 * out[i] = rounded(state[i]*coef[0])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2296 * j=1, j < NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2297 * out[i] -= state[j]*coef[j] (state taken from prior out[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2298 * rescale(out[i])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2299 * out[i] += in[i]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2300 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2301 * REFERENCES: Sub-clause 4.1.8.5 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2302 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2303 * KEYWORDS: lpc, directform, iir, synthesisfilter, lpcFilt
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2304 * KEYWORDS: dirForm, dir_mod, dir_clr, dir_neg, dir_set
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2305 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2306 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2307
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2308 void lpcZsIir(Shortword pswInput[], Shortword pswCoef[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2309 Shortword pswFiltOut[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2310 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2311
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2312 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2313 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2314 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2315 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2316 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2317
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2318 Longword L_Sum;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2319 short int siStage,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2320 siSmp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2321
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2322 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2323 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2324 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2325 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2326 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2327
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2328 /* output 1st sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2329 /* ----------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2330
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2331 pswFiltOut[0] = pswInput[0];
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2332
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2333 /* filter remaining samples */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2334 /* ------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2335
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2336 for (siSmp = 1; siSmp < S_LEN; siSmp++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2337 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2338
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2339 /* sum past outputs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2340 /* ---------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2341 /* 0th coef, with rounding */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2342 L_Sum = L_msu(LPC_ROUND, pswFiltOut[siSmp - 1], pswCoef[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2343 /* remaining coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2344 for (siStage = 1; ((0 < (siSmp - siStage)) && siStage < NP); siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2345 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2346 L_Sum = L_msu(L_Sum, pswFiltOut[siSmp - siStage - 1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2347 pswCoef[siStage]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2348 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2349
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2350 /* add input to partial output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2351 /* --------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2352
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2353 L_Sum = L_shl(L_Sum, ASHIFT);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2354 L_Sum = L_msu(L_Sum, pswInput[siSmp], 0x8000);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2355
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2356 /* save current output sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2357 /* -------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2358
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2359 pswFiltOut[siSmp] = extract_h(L_Sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2360 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2361 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2362
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2363 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2364 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2365 * FUNCTION NAME: lpcZsIirP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2366 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2367 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2368 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2369 * The purpose of this function is to perform direct form iir filtering
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2370 * with zero state, assuming a NP order filter and given coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2371 * and input
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2372 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2373 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2374 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2375 * NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2376 * order of the lpc filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2377 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2378 * S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2379 * number of samples to filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2380 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2381 * pswCommonIO[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2382 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2383 * input array of points to be filtered
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2384 * pswCommonIO[0] is oldest point (first to be filtered)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2385 * pswCommonIO[siLen-1] is last point filtered (newest)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2386 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2387 * pswCoef[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2388 * array of direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2389 * pswCoef[0] = coeff for delay n = -1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2390 * pswCoef[NP-1] = coeff for delay n = -NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2391 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2392 * ASHIFT
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2393 * number of shifts input A's have been shifted down by
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2394 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2395 * LPC_ROUND
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2396 * rounding constant
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2397 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2398 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2399 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2400 * pswCommonIO[0:S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2401 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2402 * the filtered output
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2403 * pswCommonIO[0] is oldest point
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2404 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2405 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2406 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2407 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2408 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2409 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2410 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2411 * This function is called by geNWCoefs(). See section 4.1.7.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2412 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2413 * because of the default sign of the coefficients the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2414 * formula for the filter is :
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2415 * i=0, i < S_LEN
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2416 * out[i] = rounded(state[i]*coef[0])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2417 * j=1, j < NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2418 * out[i] += state[j]*coef[j] (state taken from prior out[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2419 * rescale(out[i])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2420 * out[i] += in[i]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2421 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2422 * REFERENCES: Sub-clause 4.1.7 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2423 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2424 * KEYWORDS: lpc, directform, iir, synthesisfilter, lpcFilt
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2425 * KEYWORDS: dirForm, dir_mod, dir_clr, dir_neg, dir_set
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2426 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2427 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2428
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2429 void lpcZsIirP(Shortword pswCommonIO[], Shortword pswCoef[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2430 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2431
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2432 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2433 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2434 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2435 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2436 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2437
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2438 Longword L_Sum;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2439 short int siStage,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2440 siSmp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2441
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2442 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2443 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2444 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2445 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2446 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2447
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2448 /* filter remaining samples */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2449 /* ------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2450
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2451 for (siSmp = 1; siSmp < S_LEN; siSmp++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2452 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2453
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2454 /* sum past outputs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2455 /* ---------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2456 /* 0th coef, with rounding */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2457 L_Sum = L_mac(LPC_ROUND, pswCommonIO[siSmp - 1], pswCoef[0]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2458 /* remaining coefs */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2459 for (siStage = 1; ((0 < (siSmp - siStage)) && siStage < NP); siStage++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2460 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2461 L_Sum = L_mac(L_Sum, pswCommonIO[siSmp - siStage - 1],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2462 pswCoef[siStage]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2463 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2464
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2465 /* add input to partial output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2466 /* --------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2467
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2468 L_Sum = L_shl(L_Sum, ASHIFT);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2469 L_Sum = L_msu(L_Sum, pswCommonIO[siSmp], 0x8000);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2470
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2471 /* save current output sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2472 /* -------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2473
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2474 pswCommonIO[siSmp] = extract_h(L_Sum);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2475 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2476 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2477
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2478 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2479 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2480 * FUNCTION NAME: r0BasedEnergyShft
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2481 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2482 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2483 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2484 * Given an R0 voicing level, find the number of shifts to be
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2485 * performed on the energy to ensure that the subframe energy does
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2486 * not overflow. example if energy can maximally take the value
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2487 * 4.0, then 2 shifts are required.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2488 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2489 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2490 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2491 * swR0Index
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2492 * R0 codeword (0-0x1f)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2493 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2494 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2495 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2496 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2497 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2498 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2499 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2500 * swShiftDownSignal
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2501 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2502 * number of right shifts to apply to energy (0..6)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2503 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2504 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2505 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2506 * Based on the R0, the average frame energy, we can get an
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2507 * upper bound on the energy any one subframe can take on.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2508 * Using this upper bound we can calculate what right shift is
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2509 * needed to ensure an unsaturated output out of a subframe
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2510 * energy calculation (g_corr).
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2511 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2512 * REFERENCES: Sub-clause 4.1.9 and 4.2.1 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2513 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2514 * KEYWORDS: spectral postfilter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2515 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2516 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2517
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2518 Shortword r0BasedEnergyShft(Shortword swR0Index)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2519 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2520
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2521 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2522 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2523 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2524 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2525 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2526
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2527 Shortword swShiftDownSignal;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2528
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2529 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2530 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2531 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2532 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2533 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2534
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2535 if (sub(swR0Index, 26) <= 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2536 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2537 if (sub(swR0Index, 23) <= 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2538 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2539 if (sub(swR0Index, 21) <= 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2540 swShiftDownSignal = 0; /* r0 [0, 21] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2541 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2542 swShiftDownSignal = 1; /* r0 [22, 23] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2543 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2544 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2545 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2546 if (sub(swR0Index, 24) <= 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2547 swShiftDownSignal = 2; /* r0 [23, 24] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2548 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2549 swShiftDownSignal = 3; /* r0 [24, 26] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2550 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2551 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2552 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2553 { /* r0 index > 26 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2554 if (sub(swR0Index, 28) <= 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2555 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2556 swShiftDownSignal = 4; /* r0 [26, 28] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2557 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2558 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2559 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2560 if (sub(swR0Index, 29) <= 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2561 swShiftDownSignal = 5; /* r0 [28, 29] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2562 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2563 swShiftDownSignal = 6; /* r0 [29, 31] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2564 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2565 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2566 if (sub(swR0Index, 18) > 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2567 swShiftDownSignal = add(swShiftDownSignal, 2);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2568
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2569 return (swShiftDownSignal);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2570 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2571
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2572 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2573 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2574 * FUNCTION NAME: rcToADp
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2575 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2576 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2577 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2578 * This subroutine computes a vector of direct form LPC filter
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2579 * coefficients, given an input vector of reflection coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2580 * Double precision is used internally, but 16 bit direct form
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2581 * filter coefficients are returned.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2582 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2583 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2584 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2585 * NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2586 * order of the LPC filter (global constant)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2587 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2588 * swAscale
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2589 * The multiplier which scales down the direct form
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2590 * filter coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2591 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2592 * pswRc[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2593 * The input vector of reflection coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2594 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2595 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2596 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2597 * pswA[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2598 * Array containing the scaled down direct form LPC
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2599 * filter coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2600 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2601 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2602 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2603 * siLimit
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2604 * 1 if limiting occured in computation, 0 otherwise.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2605 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2606 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2607 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2608 * This function performs the conversion from reflection coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2609 * to direct form LPC filter coefficients. The direct form coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2610 * are scaled by multiplication by swAscale. NP, the filter order is 10.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2611 * The a's and rc's each have NP elements in them. Double precision
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2612 * calculations are used internally.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2613 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2614 * The equations are:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2615 * for i = 0 to NP-1{
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2616 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2617 * a(i)(i) = rc(i) (scaling by swAscale occurs here)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2618 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2619 * for j = 0 to i-1
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2620 * a(i)(j) = a(i-1)(j) + rc(i)*a(i-1)(i-j-1)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2621 * }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2622 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2623 * See page 443, of
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2624 * "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
2625 * Schafer; Prentice-Hall; Englewood Cliffs, NJ (USA). 1978.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2626 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2627 * REFERENCES: Sub-clause 4.1.7 and 4.2.3 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2628 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2629 * KEYWORDS: reflectioncoefficients, parcors, conversion, rctoadp, ks, as
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2630 * KEYWORDS: parcorcoefficients, lpc, flat, vectorquantization
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2631 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2632 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2633
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2634 short rcToADp(Shortword swAscale, Shortword pswRc[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2635 Shortword pswA[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2636 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2637
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2638 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2639 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2640 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2641 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2642 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2643
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2644 Longword pL_ASpace[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2645 pL_tmpSpace[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2646 L_temp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2647 *pL_A,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2648 *pL_tmp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2649 *pL_swap;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2650
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2651 short int i,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2652 j, /* loop counters */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2653 siLimit;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2654
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2655 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2656 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2657 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2658 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2659 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2660
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2661 /* Initialize starting addresses for temporary buffers */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2662 /*-----------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2663
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2664 pL_A = pL_ASpace;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2665 pL_tmp = pL_tmpSpace;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2666
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2667 /* Initialize the flag for checking if limiting has occured */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2668 /*----------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2669
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2670 siLimit = 0;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2671
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2672 /* Compute direct form filter coefficients, pswA[0],...,pswA[9] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2673 /*-------------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2674
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2675 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2676 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2677
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2678 pL_tmp[i] = L_mult(swAscale, pswRc[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2679 for (j = 0; j <= i - 1; j++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2680 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2681 L_temp = L_mpy_ls(pL_A[i - j - 1], pswRc[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2682 pL_tmp[j] = L_add(L_temp, pL_A[j]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2683 siLimit |= isLwLimit(pL_tmp[j]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2684 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2685 if (i != NP - 1)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2686 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2687 /* Swap swA and swTmp buffers */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2688
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2689 pL_swap = pL_tmp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2690 pL_tmp = pL_A;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2691 pL_A = pL_swap;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2692 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2693 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2694
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2695 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2696 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2697 pswA[i] = round(pL_tmp[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2698 siLimit |= isSwLimit(pswA[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2699 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2700 return (siLimit);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2701 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2702
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2703 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2704 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2705 * FUNCTION NAME: rcToCorrDpL
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2706 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2707 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2708 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2709 * This subroutine computes an autocorrelation vector, given a vector
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2710 * of reflection coefficients as an input. Double precision calculations
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2711 * are used internally, and a double precision (Longword)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2712 * autocorrelation sequence is returned.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2713 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2714 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2715 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2716 * NP
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2717 * LPC filter order passed in as a global constant.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2718 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2719 * swAshift
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2720 * Number of right shifts to be applied to the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2721 * direct form filter coefficients being computed
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2722 * as an intermediate step to generating the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2723 * autocorrelation sequence.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2724 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2725 * swAscale
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2726 * A multiplicative scale factor corresponding to
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2727 * swAshift; i.e. swAscale = 2 ^(-swAshift).
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2728 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2729 * pswRc[0:NP-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2730 * An input vector of reflection coefficients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2731 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2732 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2733 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2734 * pL_R[0:NP]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2735 * An output Longword array containing the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2736 * autocorrelation vector where
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2737 * pL_R[0] = 0x7fffffff; (i.e., ~1.0).
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2738 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2739 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2740 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2741 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2742 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2743 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2744 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2745 * The algorithm used for computing the correlation sequence is
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2746 * described on page 232 of the book "Linear Prediction of Speech",
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2747 * by J.D. Markel and A.H. Gray, Jr.; Springer-Verlag, Berlin,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2748 * Heidelberg, New York, 1976.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2749 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2750 * REFERENCES: Sub_Clause 4.1.4 and 4.2.1 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2751 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2752 * KEYWORDS: normalized autocorrelation, reflection coefficients
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2753 * KEYWORDS: conversion
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2754 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2755 **************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2756
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2757 void rcToCorrDpL(Shortword swAshift, Shortword swAscale,
598
5809165fb140 libgsmhr1: integrate DTX functions for speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 597
diff changeset
2758 const Shortword pswRc[], Longword pL_R[])
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2759 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2760
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2761 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2762 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2763 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2764 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2765 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2766
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2767 Longword pL_ASpace[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2768 pL_tmpSpace[NP],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2769 L_temp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2770 L_sum,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2771 *pL_A,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2772 *pL_tmp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2773 *pL_swap;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2774
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2775 short int i,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2776 j; /* loop control variables */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2777
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2778 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2779 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2780 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2781 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2782 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2783
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2784 /* Set R[0] = 0x7fffffff, (i.e., R[0] = 1.0) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2785 /*-------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2786
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2787 pL_R[0] = LW_MAX;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2788
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2789 /* Assign an address onto each of the two temporary buffers */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2790 /*----------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2791
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2792 pL_A = pL_ASpace;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2793 pL_tmp = pL_tmpSpace;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2794
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2795 /* Compute correlations R[1],...,R[10] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2796 /*------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2797
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2798 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2799 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2800
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2801 /* Compute, as an intermediate step, the filter coefficients for */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2802 /* for an i-th order direct form filter (pL_tmp[j],j=0,i) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2803 /*---------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2804
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2805 pL_tmp[i] = L_mult(swAscale, pswRc[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2806 for (j = 0; j <= i - 1; j++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2807 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2808 L_temp = L_mpy_ls(pL_A[i - j - 1], pswRc[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2809 pL_tmp[j] = L_add(L_temp, pL_A[j]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2810 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2811
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2812 /* Swap pL_A and pL_tmp buffers */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2813 /*------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2814
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2815 pL_swap = pL_A;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2816 pL_A = pL_tmp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2817 pL_tmp = pL_swap;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2818
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2819 /* Given the direct form filter coefficients for an i-th order filter */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2820 /* and the autocorrelation vector computed up to and including stage i */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2821 /* compute the autocorrelation coefficient R[i+1] */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2822 /*---------------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2823
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2824 L_temp = L_mpy_ll(pL_A[0], pL_R[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2825 L_sum = L_negate(L_temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2826
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2827 for (j = 1; j <= i; j++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2828 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2829 L_temp = L_mpy_ll(pL_A[j], pL_R[i - j]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2830 L_sum = L_sub(L_sum, L_temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2831 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2832 pL_R[i + 1] = L_shl(L_sum, swAshift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2833
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2834 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2835 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2836
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2837 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2838 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2839 * FUNCTION NAME: res_eng
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2840 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2841 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2842 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2843 * Calculates square root of subframe residual energy estimate:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2844 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2845 * sqrt( R(0)(1-k1**2)...(1-k10**2) )
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2846 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2847 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2848 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2849 * pswReflecCoefIn[0:9]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2850 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2851 * Array of reflection coeffcients.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2852 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2853 * swRq
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2854 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2855 * Subframe energy = sqrt(frame_energy * S_LEN/2**S_SH)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2856 * (quantized).
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2857 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2858 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2859 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2860 * psnsSqrtRsOut
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2861 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2862 * (Pointer to) the output residual energy estimate.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2863 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2864 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2865 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2866 * The shift count of the normalized residual energy estimate, as int.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2867 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2868 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2869 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2870 * First, the canonic product of the (1-ki**2) terms is calculated
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2871 * (normalizations are done to maintain precision). Also, a factor of
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2872 * 2**S_SH is applied to the product to offset this same factor in the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2873 * quantized square root of the subframe energy.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2874 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2875 * Then the product is square-rooted, and multiplied by the quantized
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2876 * square root of the subframe energy. This combined product is put
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2877 * out as a normalized fraction and shift count (mantissa and exponent).
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2878 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2879 * REFERENCES: Sub-clause 4.1.7 and 4.2.1 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2880 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2881 * KEYWORDS: residualenergy, res_eng, rs
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2882 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2883 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2884
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2885 void res_eng(Shortword pswReflecCoefIn[], Shortword swRq,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2886 struct NormSw *psnsSqrtRsOut)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2887 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2888 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2889 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2890 | Local Constants |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2891 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2892 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2893
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2894 #define S_SH 6 /* ceiling(log2(S_LEN)) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2895 #define MINUS_S_SH -S_SH
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2896
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2897
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2898 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2899 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2900 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2901 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2902 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2903
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2904 Longword L_Product,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2905 L_Shift,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2906 L_SqrtResEng;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2907
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2908 Shortword swPartialProduct,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2909 swPartialProductShift,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2910 swTerm,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2911 swShift,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2912 swSqrtPP,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2913 swSqrtPPShift,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2914 swSqrtResEng,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2915 swSqrtResEngShift;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2916
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2917 short int i;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2918
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2919 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2920 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2921 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2922 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2923 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2924
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2925 /* Form canonic product, maintain precision and shift count */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2926 /*----------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2927
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2928 /* (Start off with unity product (actually -1), and shift offset) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2929 /*----------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2930 swPartialProduct = SW_MIN;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2931 swPartialProductShift = MINUS_S_SH;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2932
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2933 for (i = 0; i < NP; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2934 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2935
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2936 /* Get next (-1 + k**2) term, form partial canonic product */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2937 /*---------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2938
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2939
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2940 swTerm = mac_r(LW_MIN, pswReflecCoefIn[i], pswReflecCoefIn[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2941
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2942 L_Product = L_mult(swTerm, swPartialProduct);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2943
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2944 /* Normalize partial product, round */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2945 /*----------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2946
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2947 swShift = norm_s(extract_h(L_Product));
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2948 swPartialProduct = round(L_shl(L_Product, swShift));
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2949 swPartialProductShift = add(swPartialProductShift, swShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2950 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2951
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2952 /* Correct sign of product, take square root */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2953 /*-------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2954
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2955 swPartialProduct = abs_s(swPartialProduct);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2956
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2957 swSqrtPP = sqroot(L_deposit_h(swPartialProduct));
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2958
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2959 L_Shift = L_shr(L_deposit_h(swPartialProductShift), 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2960
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2961 swSqrtPPShift = extract_h(L_Shift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2962
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2963 if (extract_l(L_Shift) != 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2964 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2965
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2966 /* Odd exponent: shr above needs to be compensated by multiplying */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2967 /* mantissa by sqrt(0.5) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2968 /*----------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2969
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2970 swSqrtPP = mult_r(swSqrtPP, SQRT_ONEHALF);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2971 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2972
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2973 /* Form final product, the residual energy estimate, and do final */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2974 /* normalization */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2975 /*----------------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2976
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2977 L_SqrtResEng = L_mult(swRq, swSqrtPP);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2978
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2979 swShift = norm_l(L_SqrtResEng);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2980 swSqrtResEng = round(L_shl(L_SqrtResEng, swShift));
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2981 swSqrtResEngShift = add(swSqrtPPShift, swShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2982
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2983 /* Return */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2984 /*--------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2985 psnsSqrtRsOut->man = swSqrtResEng;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2986 psnsSqrtRsOut->sh = swSqrtResEngShift;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2987
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2988 return;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2989 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2990
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2991 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2992 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2993 * FUNCTION NAME: rs_rr
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2994 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2995 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2996 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2997 * Calculates sqrt(RS/R(x,x)) using floating point format,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2998 * where RS is the approximate residual energy in a given
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2999 * subframe and R(x,x) is the power in each long term
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3000 * predictor vector or in each codevector.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3001 * Used in the joint optimization of the gain and the long
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3002 * term predictor coefficient.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3003 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3004 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3005 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3006 * pswExcitation[0:39] - excitation signal array
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3007 * snsSqrtRs - structure sqrt(RS) normalized with mantissa and shift
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3008 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3009 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3010 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3011 * snsSqrtRsRr - structure sqrt(RS/R(x,x)) with mantissa and shift
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3012 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3013 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3014 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3015 * None
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3016 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3017 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3018 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3019 * Implemented as sqrt(RS)/sqrt(R(x,x)) where both sqrts
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3020 * are stored normalized (0.5<=x<1.0) and the associated
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3021 * shift. See section 4.1.11.1 for details
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3022 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3023 * REFERENCES: Sub-clause 4.1.11.1 and 4.2.1 of GSM
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3024 * Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3025 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3026 * KEYWORDS: rs_rr, sqroot
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3027 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3028 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3029
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3030 void rs_rr(Shortword pswExcitation[], struct NormSw snsSqrtRs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3031 struct NormSw *snsSqrtRsRr)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3032 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3033
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3034 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3035 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3036 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3037 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3038 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3039 Longword L_Temp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3040 Shortword swTemp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3041 swTemp2,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3042 swEnergy,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3043 swNormShift,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3044 swShift;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3045
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3046 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3047 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3048 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3049 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3050 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3051
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3052 swEnergy = sub(shl(snsSqrtRs.sh, 1), 3); /* shift*2 + margin ==
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3053 * energy. */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3054
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3055
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3056 if (swEnergy < 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3057 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3058
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3059 /* High-energy residual: scale input vector during energy */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3060 /* calculation. The shift count of the energy of the */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3061 /* 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
3062 /* count needed for the excitation energy */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3063 /*--------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3064
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3065 swNormShift = g_corr1s(pswExcitation, negate(swEnergy), &L_Temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3066
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3067 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3068 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3069 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3070
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3071 /* Lower-energy residual: no overflow protection needed */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3072 /*------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3073
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3074 swNormShift = g_corr1(pswExcitation, &L_Temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3075 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3076
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3077 /* Compute single precision square root of energy sqrt(R(x,x)) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3078 /* ----------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3079 swTemp = sqroot(L_Temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3080
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3081 /* If odd no. of shifts compensate by sqrt(0.5) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3082 /* -------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3083 if (swNormShift & 1)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3084 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3085
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3086 /* Decrement no. of shifts in accordance with sqrt(0.5) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3087 /* ---------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3088 swNormShift = sub(swNormShift, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3089
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3090 /* sqrt(R(x,x) = sqrt(R(x,x)) * sqrt(0.5) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3091 /* -------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3092 L_Temp = L_mult(0x5a82, swTemp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3093 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3094 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3095 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3096 L_Temp = L_deposit_h(swTemp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3097 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3098
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3099 /* Normalize again and update shifts */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3100 /* --------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3101 swShift = norm_l(L_Temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3102 swNormShift = add(shr(swNormShift, 1), swShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3103 L_Temp = L_shl(L_Temp, swShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3104
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3105 /* Shift sqrt(RS) to make sure less than divisor */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3106 /* --------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3107 swTemp = shr(snsSqrtRs.man, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3108
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3109 /* Divide sqrt(RS)/sqrt(R(x,x)) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3110 /* ---------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3111 swTemp2 = divide_s(swTemp, round(L_Temp));
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3112
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3113 /* Calculate shift for division, compensate for shift before division */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3114 /* ------------------------------------------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3115 swNormShift = sub(snsSqrtRs.sh, swNormShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3116 swNormShift = sub(swNormShift, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3117
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3118 /* Normalize and get no. of shifts */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3119 /* ------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3120 swShift = norm_s(swTemp2);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3121 snsSqrtRsRr->sh = add(swNormShift, swShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3122 snsSqrtRsRr->man = shl(swTemp2, swShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3123
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3124 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3125
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3126 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3127 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3128 * FUNCTION NAME: rs_rrNs
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3129 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3130 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3131 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3132 * Calculates sqrt(RS/R(x,x)) using floating point format,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3133 * where RS is the approximate residual energy in a given
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3134 * subframe and R(x,x) is the power in each long term
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3135 * predictor vector or in each codevector.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3136 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3137 * Used in the joint optimization of the gain and the long
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3138 * term predictor coefficient.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3139 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3140 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3141 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3142 * pswExcitation[0:39] - excitation signal array
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3143 * snsSqrtRs - structure sqrt(RS) normalized with mantissa and shift
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3144 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3145 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3146 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3147 * snsSqrtRsRr - structure sqrt(RS/R(x,x)) with mantissa and shift
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3148 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3149 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3150 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3151 * None
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3152 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3153 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3154 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3155 * Implemented as sqrt(RS)/sqrt(R(x,x)) where both sqrts
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3156 * are stored normalized (0.5<=x<1.0) and the associated
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3157 * shift.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3158 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3159 * REFERENCES: Sub-clause 4.1.11.1 and 4.2.1 of GSM
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3160 * Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3161 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3162 * KEYWORDS: rs_rr, sqroot
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3163 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3164 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3165
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3166 void rs_rrNs(Shortword pswExcitation[], struct NormSw snsSqrtRs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3167 struct NormSw *snsSqrtRsRr)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3168 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3169
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3170 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3171 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3172 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3173 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3174 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3175 Longword L_Temp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3176 Shortword swTemp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3177 swTemp2,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3178 swNormShift,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3179 swShift;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3180
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3181 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3182 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3183 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3184 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3185 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3186
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3187 /* Lower-energy residual: no overflow protection needed */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3188 /*------------------------------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3189
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3190 swNormShift = g_corr1(pswExcitation, &L_Temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3191
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3192
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3193 /* Compute single precision square root of energy sqrt(R(x,x)) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3194 /* ----------------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3195 swTemp = sqroot(L_Temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3196
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3197 /* If odd no. of shifts compensate by sqrt(0.5) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3198 /* -------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3199 if (swNormShift & 1)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3200 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3201
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3202 /* Decrement no. of shifts in accordance with sqrt(0.5) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3203 /* ---------------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3204 swNormShift = sub(swNormShift, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3205
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3206 /* sqrt(R(x,x) = sqrt(R(x,x)) * sqrt(0.5) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3207 /* -------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3208 L_Temp = L_mult(0x5a82, swTemp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3209 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3210 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3211 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3212 L_Temp = L_deposit_h(swTemp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3213 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3214
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3215 /* Normalize again and update shifts */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3216 /* --------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3217
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3218 swShift = norm_l(L_Temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3219 swNormShift = add(shr(swNormShift, 1), swShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3220 L_Temp = L_shl(L_Temp, swShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3221
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3222 /* Shift sqrt(RS) to make sure less than divisor */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3223 /* --------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3224 swTemp = shr(snsSqrtRs.man, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3225
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3226 /* Divide sqrt(RS)/sqrt(R(x,x)) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3227 /* ---------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3228 swTemp2 = divide_s(swTemp, round(L_Temp));
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3229
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3230 /* Calculate shift for division, compensate for shift before division */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3231 /* ------------------------------------------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3232 swNormShift = sub(snsSqrtRs.sh, swNormShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3233 swNormShift = sub(swNormShift, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3234
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3235 /* Normalize and get no. of shifts */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3236 /* ------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3237 swShift = norm_s(swTemp2);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3238 snsSqrtRsRr->sh = add(swNormShift, swShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3239 snsSqrtRsRr->man = shl(swTemp2, swShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3240
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3241 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3242
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3243
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3244 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3245 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3246 * FUNCTION NAME: scaleExcite
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3247 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3248 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3249 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3250 * Scale an arbitrary excitation vector (codevector or
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3251 * pitch vector)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3252 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3253 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3254 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3255 * pswVect[0:39] - the unscaled vector.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3256 * iGsp0Scale - an positive offset to compensate for the fact
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3257 * that GSP0 table is scaled down.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3258 * swErrTerm - rather than a gain being passed in, (beta, gamma)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3259 * it is calculated from this error term - either
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3260 * Gsp0[][][0] error term A or Gsp0[][][1] error
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3261 * term B. Beta is calculated from error term A,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3262 * gamma from error term B.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3263 * snsRS - the RS_xx appropriate to pswVect.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3264 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3265 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3266 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3267 * pswScldVect[0:39] - the output, scaled excitation vector.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3268 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3269 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3270 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3271 * swGain - One of two things. Either a clamped value of 0x7fff if the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3272 * gain's shift was > 0 or the rounded vector gain otherwise.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3273 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3274 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3275 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3276 * If gain > 1.0 then
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3277 * (do not shift gain up yet)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3278 * partially scale vector element THEN shift and round save
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3279 * else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3280 * shift gain correctly
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3281 * scale vector element and round save
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3282 * update state array
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3283 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3284 * REFERENCES: Sub-clause 4.1.10.2 and 4.2.1 of GSM
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3285 * Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3286 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3287 * KEYWORDS: excite_vl, sc_ex, excitevl, scaleexcite, codevector, p_vec,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3288 * KEYWORDS: x_vec, pitchvector, gain, gsp0
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3289 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3290 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3291
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3292 Shortword scaleExcite(Shortword pswVect[],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3293 Shortword swErrTerm, struct NormSw snsRS,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3294 Shortword pswScldVect[])
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3295 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3296
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3297 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3298 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3299 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3300 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3301 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3302 Longword L_GainUs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3303 L_scaled,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3304 L_Round_off;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3305 Shortword swGain,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3306 swGainUs,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3307 swGainShift,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3308 i,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3309 swGainUsShft;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3310
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3311 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3312 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3313 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3314 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3315 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3316
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3317
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3318 L_GainUs = L_mult(swErrTerm, snsRS.man);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3319 swGainUsShft = norm_s(extract_h(L_GainUs));
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3320 L_GainUs = L_shl(L_GainUs, swGainUsShft);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3321
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3322 swGainShift = add(swGainUsShft, snsRS.sh);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3323 swGainShift = sub(swGainShift, GSP0_SCALE);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3324
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3325
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3326 /* gain > 1.0 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3327 /* ---------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3328
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3329 if (swGainShift < 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3330 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3331 swGainUs = round(L_GainUs);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3332
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3333 L_Round_off = L_shl((long) 32768, swGainShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3334
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3335 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3336 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3337 L_scaled = L_mac(L_Round_off, swGainUs, pswVect[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3338 L_scaled = L_shr(L_scaled, swGainShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3339 pswScldVect[i] = extract_h(L_scaled);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3340 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3341
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3342 if (swGainShift == 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3343 swGain = swGainUs;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3344 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3345 swGain = 0x7fff;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3346 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3347
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3348 /* gain < 1.0 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3349 /* ---------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3350
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3351 else
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3352 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3353
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3354 /* shift down or not at all */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3355 /* ------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3356 if (swGainShift > 0)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3357 L_GainUs = L_shr(L_GainUs, swGainShift);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3358
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3359 /* the rounded actual vector gain */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3360 /* ------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3361 swGain = round(L_GainUs);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3362
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3363 /* now scale the vector (with rounding) */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3364 /* ------------------------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3365
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3366 for (i = 0; i < S_LEN; i++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3367 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3368 L_scaled = L_mac((long) 32768, swGain, pswVect[i]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3369 pswScldVect[i] = extract_h(L_scaled);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3370 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3371 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3372 return (swGain);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3373 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3374
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3375 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3376 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3377 * FUNCTION NAME: sqroot
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3378 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3379 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3380 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3381 * The purpose of this function is to perform a single precision square
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3382 * root function on a Longword
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3383 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3384 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3385 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3386 * L_SqrtIn
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3387 * input to square root function
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3388 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3389 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3390 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3391 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3392 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3393 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3394 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3395 * swSqrtOut
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3396 * output to square root function
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3397 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3398 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3399 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3400 * Input assumed to be normalized
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3401 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3402 * The algorithm is based around a six term Taylor expansion :
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3403 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3404 * y^0.5 = (1+x)^0.5
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3405 * ~= 1 + (x/2) - 0.5*((x/2)^2) + 0.5*((x/2)^3)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3406 * - 0.625*((x/2)^4) + 0.875*((x/2)^5)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3407 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3408 * Max error less than 0.08 % for normalized input ( 0.5 <= x < 1 )
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3409 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3410 * REFERENCES: Sub-clause 4.1.4.1, 4.1.7, 4.1.11.1, 4.2.1,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3411 * 4.2.2, 4.2.3 and 4.2.4 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3412 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3413 * KEYWORDS: sqrt, squareroot, sqrt016
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3414 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3415 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3416
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3417 Shortword sqroot(Longword L_SqrtIn)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3418 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3419
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3420 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3421 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3422 | Local Constants |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3423 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3424 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3425
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3426 #define PLUS_HALF 0x40000000L /* 0.5 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3427 #define MINUS_ONE 0x80000000L /* -1 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3428 #define TERM5_MULTIPLER 0x5000 /* 0.625 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3429 #define TERM6_MULTIPLER 0x7000 /* 0.875 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3430
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3431 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3432 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3433 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3434 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3435 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3436
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3437 Longword L_Temp0,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3438 L_Temp1;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3439
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3440 Shortword swTemp,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3441 swTemp2,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3442 swTemp3,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3443 swTemp4,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3444 swSqrtOut;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3445
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3446 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3447 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3448 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3449 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3450 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3451
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3452 /* determine 2nd term x/2 = (y-1)/2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3453 /* -------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3454
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3455 L_Temp1 = L_shr(L_SqrtIn, 1); /* L_Temp1 = y/2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3456 L_Temp1 = L_sub(L_Temp1, PLUS_HALF); /* L_Temp1 = (y-1)/2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3457 swTemp = extract_h(L_Temp1); /* swTemp = x/2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3458
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3459 /* add contribution of 2nd term */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3460 /* ---------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3461
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3462 L_Temp1 = L_sub(L_Temp1, MINUS_ONE); /* L_Temp1 = 1 + x/2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3463
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3464 /* determine 3rd term */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3465 /* ------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3466
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3467 L_Temp0 = L_msu(0L, swTemp, swTemp); /* L_Temp0 = -(x/2)^2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3468 swTemp2 = extract_h(L_Temp0); /* swTemp2 = -(x/2)^2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3469 L_Temp0 = L_shr(L_Temp0, 1); /* L_Temp0 = -0.5*(x/2)^2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3470
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3471 /* add contribution of 3rd term */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3472 /* ---------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3473
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3474 L_Temp0 = L_add(L_Temp1, L_Temp0); /* L_Temp0 = 1 + x/2 - 0.5*(x/2)^2 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3475
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3476 /* determine 4rd term */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3477 /* ------------------ */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3478
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3479 L_Temp1 = L_msu(0L, swTemp, swTemp2);/* L_Temp1 = (x/2)^3 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3480 swTemp3 = extract_h(L_Temp1); /* swTemp3 = (x/2)^3 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3481 L_Temp1 = L_shr(L_Temp1, 1); /* L_Temp1 = 0.5*(x/2)^3 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3482
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3483 /* add contribution of 4rd term */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3484 /* ---------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3485
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3486 /* L_Temp1 = 1 + x/2 - 0.5*(x/2)^2 + 0.5*(x/2)^3 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3487
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3488 L_Temp1 = L_add(L_Temp0, L_Temp1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3489
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3490 /* determine partial 5th term */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3491 /* -------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3492
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3493 L_Temp0 = L_mult(swTemp, swTemp3); /* L_Temp0 = (x/2)^4 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3494 swTemp4 = round(L_Temp0); /* swTemp4 = (x/2)^4 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3495
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3496 /* determine partial 6th term */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3497 /* -------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3498
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3499 L_Temp0 = L_msu(0L, swTemp2, swTemp3); /* L_Temp0 = (x/2)^5 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3500 swTemp2 = round(L_Temp0); /* swTemp2 = (x/2)^5 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3501
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3502 /* determine 5th term and add its contribution */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3503 /* ------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3504
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3505 /* L_Temp0 = -0.625*(x/2)^4 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3506
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3507 L_Temp0 = L_msu(0L, TERM5_MULTIPLER, swTemp4);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3508
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3509 /* L_Temp1 = 1 + x/2 - 0.5*(x/2)^2 + 0.5*(x/2)^3 - 0.625*(x/2)^4 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3510
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3511 L_Temp1 = L_add(L_Temp0, L_Temp1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3512
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3513 /* determine 6th term and add its contribution */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3514 /* ------------------------------------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3515
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3516 /* swSqrtOut = 1 + x/2 - 0.5*(x/2)^2 + 0.5*(x/2)^3 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3517 /* - 0.625*(x/2)^4 + 0.875*(x/2)^5 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3518
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3519 swSqrtOut = mac_r(L_Temp1, TERM6_MULTIPLER, swTemp2);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3520
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3521 /* return output */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3522 /* ------------- */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3523
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3524 return (swSqrtOut);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3525 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3526
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3527 /***************************************************************************
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3528 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3529 * FUNCTION NAME: v_con
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3530 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3531 * PURPOSE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3532 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3533 * This subroutine constructs a codebook excitation
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3534 * vector from basis vectors
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3535 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3536 * INPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3537 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3538 * pswBVects[0:siNumBVctrs*S_LEN-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3539 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3540 * Array containing a set of basis vectors.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3541 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3542 * pswBitArray[0:siNumBVctrs-1]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3543 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3544 * Bit array dictating the polarity of the
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3545 * basis vectors in the output vector.
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3546 * Each element of the bit array is either -0.5 or +0.5
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3547 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3548 * siNumBVctrs
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3549 * Number of bits in codeword
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3550 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3551 * OUTPUTS:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3552 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3553 * pswOutVect[0:39]
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3554 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3555 * Array containing the contructed output vector
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3556 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3557 * RETURN VALUE:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3558 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3559 * none
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3560 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3561 * DESCRIPTION:
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3562 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3563 * The array pswBitArray is used to multiply each of the siNumBVctrs
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3564 * basis vectors. The input pswBitArray[] is an array whose
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3565 * elements are +/-0.5. These multiply the VSELP basis vectors and
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3566 * when summed produce a VSELP codevector. b_con() is the function
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3567 * used to translate a VSELP codeword into pswBitArray[].
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3568 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3569 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3570 * REFERENCES: Sub-clause 4.1.10 and 4.2.1 of GSM Recomendation 06.20
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3571 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3572 * KEYWORDS: v_con, codeword, reconstruct, basis vector, excitation
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3573 *
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3574 *************************************************************************/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3575
601
c7c03231002d libgsmhr1: integrate main body of speech decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 598
diff changeset
3576 void v_con(const Shortword pswBVects[], Shortword pswOutVect[],
594
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3577 Shortword pswBitArray[], short int siNumBVctrs)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3578 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3579
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3580 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3581 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3582 | Automatic Variables |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3583 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3584 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3585
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3586 Longword L_Temp;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3587
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3588 short int siSampleCnt,
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3589 siCVectCnt;
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3590
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3591 /*_________________________________________________________________________
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3592 | |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3593 | Executable Code |
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3594 |_________________________________________________________________________|
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3595 */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3596
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3597 /* Sample loop */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3598 /*--------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3599 for (siSampleCnt = 0; siSampleCnt < S_LEN; siSampleCnt++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3600 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3601
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3602 /* First element of output vector */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3603 L_Temp = L_mult(pswBitArray[0], pswBVects[0 * S_LEN + siSampleCnt]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3604
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3605 /* Construct output vector */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3606 /*-------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3607 for (siCVectCnt = 1; siCVectCnt < siNumBVctrs; siCVectCnt++)
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3608 {
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3609 L_Temp = L_mac(L_Temp, pswBitArray[siCVectCnt],
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3610 pswBVects[siCVectCnt * S_LEN + siSampleCnt]);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3611 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3612
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3613 /* store the output vector sample */
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3614 /*--------------------------------*/
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3615 L_Temp = L_shl(L_Temp, 1);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3616 pswOutVect[siSampleCnt] = extract_h(L_Temp);
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3617 }
83d46a16db1b libgsmhr1/sp_dec.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3618 }