annotate libgsmhr1/rxfe.c @ 581:e2d5cad04cbf

libgsmhr1 RxFE: store CN R0+LPC separately from speech In the original GSM 06.06 code the ECU for speech mode is entirely separate from the CN generator, maintaining separate state. (The main intertie between them is the speech vs CN state variable, distinguishing between speech and CN BFIs, in addition to the CN-specific function of distinguishing between initial and update SIDs.) In the present RxFE implementation I initially thought that we could use the same saved_frame buffer for both ECU and CN, overwriting just the first 4 params (R0 and LPC) when a valid SID comes in. However, I now realize it was a bad idea: the original code has a corner case (long sequence of speech-mode BFIs to put the ECU in state 6, then SID and CN-mode BFIs, then a good speech frame) that would be broken by that buffer reuse approach. We could eliminate this corner case by resetting the ECU state when passing through a CN insertion period, but doing so would needlessly increase the behavioral diffs between GSM 06.06 and our version. Solution: use a separate CN-specific buffer for CN R0+LPC parameters, and match the behavior of GSM 06.06 code in this regard.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Feb 2025 10:02:45 +0000
parents d4979cdbc081
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
579
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * Rx front end implementation, common between the full decoder and TFO.
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 #include <stdint.h>
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <string.h>
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include "tw_gsmhr.h"
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include "typedefs.h"
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include "namespace.h"
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include "rxfe.h"
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include "dtx_const.h"
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include "dtx_rxfe.h"
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 /*
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 * If the very first frame(s) we have to process out of reset (or after DHF)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 * are either BFI or invalid SID, what is our default fallback frame?
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 * In the original GSM 06.06 code it is a frame of all zero params - but
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 * because that code provides only a full decoder and not TFO, this oddity
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 * is not readily visible. (The PCM output from the full decoder is all
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 * zeros.) OTOH, if we feed all zeros as PCM input to a homed standard
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 * encoder, we get this frame, repeating endlessly as long as all-zeros
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 * PCM input continues:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 *
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 * R0=00 LPC=164,171,cb Int=0 Mode=0
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 * s1=00,00,00 s2=00,00,00 s3=00,00,00 s4=00,00,00
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 *
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 * This frame differs from all-zero params only in the LPC set, and this
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 * sane-LPC silence frame is the one we shall use as our reset-default
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 * fallback frame.
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 static const Shortword default_lpc[3] = {0x164, 0x171, 0xcb};
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 /*
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 * UFI R0 handling tables: when we get a speech frame marked with BFI=0 UFI=1,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 * we look at the R0 parameter, both in the received frame and in the saved
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 * one. Both of the following LUTs are indexed by old R0 just like in the
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 * original GSM 06.06 code, but the values in them are absolute thresholds
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 * for the new R0, instead of diff values used in the original code.
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 static const Shortword ufi_r0_thresh_bfi[32] = {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 15, 16, 17, 15, 16, 17, 18, 18,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 18, 19, 19, 20, 21, 22, 22, 23,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 23, 23, 23, 24, 25, 25, 26, 26,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 26, 27, 28, 29, 30, 31, 32, 32
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 };
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 static const Shortword ufi_r0_thresh_mute[32] = {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 14, 13, 13, 12, 13, 14, 15, 14,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 15, 16, 17, 18, 18, 19, 20, 20,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 21, 21, 21, 22, 23, 24, 25, 25,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 25, 26, 27, 28, 29, 30, 30, 30
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 };
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 /* state transition tables for ECU state machine */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 static const uint8_t ecu_state_trans_good[8] = {0, 0, 0, 0, 0, 0, 7, 0};
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 static const uint8_t ecu_state_trans_bad[8] = {1, 2, 3, 4, 5, 6, 6, 6};
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 void gsmhr_rxfe_reset(struct gsmhr_rxfe_state *st)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 memset(st, 0, sizeof(struct gsmhr_rxfe_state));
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 memcpy(st->saved_frame + 1, default_lpc, sizeof(Shortword) * 3);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 st->ecu_state = 7;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 static Shortword input_frame_class(Shortword bfi, Shortword ufi, Shortword sid)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 Shortword bfi_dtx;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 bfi_dtx = bfi || ufi;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 if (sid == 2 && bfi_dtx == 0)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 return VALIDSID;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 if (sid == 0 && bfi_dtx == 0)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 return GOODSPEECH;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 if (sid == 0 && bfi_dtx != 0)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 return UNUSABLE;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 return INVALIDSID;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 static Shortword compute_last_lag(const Shortword *prm_in)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 Shortword accum, delta, i;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 accum = prm_in[6];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 for (i = 0; i < 3; i++) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 delta = prm_in[9 + i * 3] - 8;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 accum += delta;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 if (accum > 0xFF)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 accum = 0xFF;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 else if (accum < 0)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 accum = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 return accum;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 static void save_speech_frame(struct gsmhr_rxfe_state *st,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 const Shortword *prm_in)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 memcpy(st->saved_frame, prm_in, sizeof(Shortword) * 6);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 if (prm_in[5]) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 /* voiced modes */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 st->saved_frame[6] = compute_last_lag(prm_in);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 st->saved_frame[7] = prm_in[7];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 st->saved_frame[9] = 8;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 st->saved_frame[10] = prm_in[10];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 st->saved_frame[12] = 8;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 st->saved_frame[13] = prm_in[13];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 st->saved_frame[15] = 8;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 st->saved_frame[16] = prm_in[16];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 } else {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 /* unvoiced mode */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 st->saved_frame[6] = prm_in[6];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 st->saved_frame[7] = prm_in[7];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 st->saved_frame[9] = prm_in[9];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 st->saved_frame[10] = prm_in[10];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 st->saved_frame[12] = prm_in[12];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 st->saved_frame[13] = prm_in[13];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 st->saved_frame[15] = prm_in[15];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 st->saved_frame[16] = prm_in[16];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 /* all 4 gsp0 params come from the last subframe */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 st->saved_frame[8] = prm_in[17];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 st->saved_frame[11] = prm_in[17];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 st->saved_frame[14] = prm_in[17];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 st->saved_frame[17] = prm_in[17];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 static void speech_ecu(struct gsmhr_rxfe_state *st, const Shortword *prm_in,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 Shortword *prm_out, Shortword *mute_permit,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 Shortword *dtxd_sp)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 Shortword bfi = prm_in[18];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 Shortword ufi = prm_in[19];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 uint8_t prev_state = st->ecu_state;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 if (ufi && !bfi) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 if (prm_in[0] >= ufi_r0_thresh_bfi[st->saved_frame[0]])
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 bfi = 1;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 else if (prm_in[0] >= ufi_r0_thresh_mute[st->saved_frame[0]]) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 if (mute_permit)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 *mute_permit = 1;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 if (bfi)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 st->ecu_state = ecu_state_trans_bad[prev_state];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 else
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 st->ecu_state = ecu_state_trans_good[prev_state];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 switch (st->ecu_state) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 case 0:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 memcpy(prm_out, prm_in, sizeof(Shortword) * GSMHR_NUM_PARAMS);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 save_speech_frame(st, prm_in);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 return;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 /* all remaining cases return the saved frame, differ only in R0 */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 case 1:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 case 2:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 /* no muting yet */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 break;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 case 3:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 case 4:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 case 5:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 st->saved_frame[0] -= 2;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 if (st->saved_frame[0] < 0)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 st->saved_frame[0] = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 break;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 case 6:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 case 7:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 st->saved_frame[0] = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 break;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 memcpy(prm_out, st->saved_frame, sizeof(Shortword) * GSMHR_NUM_PARAMS);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 if (bfi < 2) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 if (st->saved_frame[5] == 0 && prm_in[5] == 0) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 /* both unvoiced */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 prm_out[6] = prm_in[6];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 prm_out[7] = prm_in[7];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 prm_out[9] = prm_in[9];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 prm_out[10] = prm_in[10];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 prm_out[12] = prm_in[12];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 prm_out[13] = prm_in[13];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 prm_out[15] = prm_in[15];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 prm_out[16] = prm_in[16];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 } else if (st->saved_frame[5] != 0 && prm_in[5] != 0) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 /* both voiced */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 prm_out[7] = prm_in[7];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 prm_out[10] = prm_in[10];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 prm_out[13] = prm_in[13];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 prm_out[16] = prm_in[16];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 if (dtxd_sp && prev_state >= 6)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 *dtxd_sp = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 static void save_speech_gs(struct gsmhr_rxfe_state *st,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 const Shortword *sp_param)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 Shortword vmode = sp_param[5];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 uint8_t ptr = st->gs_history_ptr;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 int i;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 for (i = 0; i < N_SUB; i++) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 st->gs_history[ptr] = ppLr_gsTable[vmode][sp_param[8 + i * 3]];
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 ptr++;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 if (ptr >= GS_HISTORY_SIZE)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 ptr = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 st->gs_history_ptr = ptr;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 static void init_cn_gen(struct gsmhr_rxfe_state *st)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 Longword L_RxDTXGs;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 st->cn_prng = PN_INIT_SEED;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214 avgGsHistQntz(st->gs_history, &L_RxDTXGs);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 st->gs_cn_out = gsQuant(L_RxDTXGs, 0);
580
d4979cdbc081 libgsmhr1 RxFE: set in_dtx in init_cn_gen()
Mychaela Falconia <falcon@freecalypso.org>
parents: 579
diff changeset
216 st->in_dtx = 1;
579
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 st->dtx_bfi_count = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 st->dtx_muting = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 static void cn_output(struct gsmhr_rxfe_state *st, Shortword *prm_out)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 int i;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224
581
e2d5cad04cbf libgsmhr1 RxFE: store CN R0+LPC separately from speech
Mychaela Falconia <falcon@freecalypso.org>
parents: 580
diff changeset
225 memcpy(prm_out, st->cn_r0_lpc, sizeof(Shortword) * 4);
579
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 prm_out[4] = 1; /* soft interpolation */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 prm_out[5] = 0; /* unvoiced mode */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 for (i = 0; i < N_SUB; i++) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 prm_out[6 + i * 3] = getPnBits(7, &st->cn_prng);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 prm_out[7 + i * 3] = getPnBits(7, &st->cn_prng);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 prm_out[8 + i * 3] = st->gs_cn_out;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 void rxfe_main(struct gsmhr_rxfe_state *st, const Shortword *prm_in,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236 Shortword *prm_out, int fast_cn_muting,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 Shortword *deco_mode_out, Shortword *mute_permit,
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 Shortword *dtxd_sp)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 Shortword frame_class, deco_mode;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 frame_class = input_frame_class(prm_in[18], prm_in[19], prm_in[20]);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 if (!st->in_dtx) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 /* speech decoding mode */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 if (frame_class == VALIDSID || frame_class == INVALIDSID)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 deco_mode = CNIFIRSTSID;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 else
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248 deco_mode = SPEECH;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 } else {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250 /* comfort noise insertion mode */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251 if (frame_class == VALIDSID || frame_class == INVALIDSID)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 deco_mode = CNICONT;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 else if (frame_class == UNUSABLE)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 deco_mode = CNIBFI;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255 else
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256 deco_mode = SPEECH;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258 /* Muting permission for the full decoder will be set only in one
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 * special case of speech UFI - default it to 0.
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260 */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 if (mute_permit)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262 *mute_permit = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263 /* now real per-mode processing */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 switch (deco_mode) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265 case SPEECH:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 /* Except for the special case of prolonged BFI that
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267 * led to total muting, TFO with DTXd gets SP=1.
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 if (dtxd_sp)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270 *dtxd_sp = 1;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271 st->in_dtx = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272 speech_ecu(st, prm_in, prm_out, mute_permit, dtxd_sp);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273 save_speech_gs(st, prm_out);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274 break;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275 case CNIFIRSTSID:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276 if (dtxd_sp)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277 *dtxd_sp = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278 if (frame_class == VALIDSID)
581
e2d5cad04cbf libgsmhr1 RxFE: store CN R0+LPC separately from speech
Mychaela Falconia <falcon@freecalypso.org>
parents: 580
diff changeset
279 memcpy(st->cn_r0_lpc, prm_in, sizeof(Shortword) * 4);
e2d5cad04cbf libgsmhr1 RxFE: store CN R0+LPC separately from speech
Mychaela Falconia <falcon@freecalypso.org>
parents: 580
diff changeset
280 else
e2d5cad04cbf libgsmhr1 RxFE: store CN R0+LPC separately from speech
Mychaela Falconia <falcon@freecalypso.org>
parents: 580
diff changeset
281 memcpy(st->cn_r0_lpc, st->saved_frame,
e2d5cad04cbf libgsmhr1 RxFE: store CN R0+LPC separately from speech
Mychaela Falconia <falcon@freecalypso.org>
parents: 580
diff changeset
282 sizeof(Shortword) * 4);
579
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 init_cn_gen(st);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284 cn_output(st, prm_out);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285 break;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286 case CNICONT:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 if (dtxd_sp)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288 *dtxd_sp = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289 if (frame_class == VALIDSID)
581
e2d5cad04cbf libgsmhr1 RxFE: store CN R0+LPC separately from speech
Mychaela Falconia <falcon@freecalypso.org>
parents: 580
diff changeset
290 memcpy(st->cn_r0_lpc, prm_in, sizeof(Shortword) * 4);
579
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 else
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292 deco_mode = CNIBFI; /* for interpolation */
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 st->dtx_bfi_count = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294 st->dtx_muting = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 cn_output(st, prm_out);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296 break;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297 case CNIBFI:
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298 if (dtxd_sp)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 *dtxd_sp = 0;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300 if (st->dtx_muting) {
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 if (fast_cn_muting)
581
e2d5cad04cbf libgsmhr1 RxFE: store CN R0+LPC separately from speech
Mychaela Falconia <falcon@freecalypso.org>
parents: 580
diff changeset
302 st->cn_r0_lpc[0] = 0;
579
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303 else {
581
e2d5cad04cbf libgsmhr1 RxFE: store CN R0+LPC separately from speech
Mychaela Falconia <falcon@freecalypso.org>
parents: 580
diff changeset
304 st->cn_r0_lpc[0] -= 2;
e2d5cad04cbf libgsmhr1 RxFE: store CN R0+LPC separately from speech
Mychaela Falconia <falcon@freecalypso.org>
parents: 580
diff changeset
305 if (st->cn_r0_lpc[0] < 0)
e2d5cad04cbf libgsmhr1 RxFE: store CN R0+LPC separately from speech
Mychaela Falconia <falcon@freecalypso.org>
parents: 580
diff changeset
306 st->cn_r0_lpc[0] = 0;
579
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309 st->dtx_bfi_count++;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 if (st->dtx_bfi_count >= (prm_in[21] ? 25 : 36))
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311 st->dtx_muting = 1;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312 cn_output(st, prm_out);
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313 break;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314 }
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315 if (deco_mode_out)
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316 *deco_mode_out = deco_mode;
1dc5d9320e96 libgsmhr1: implement RxFE block
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 }