FreeCalypso > hg > gsm-codec-lib
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 |
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 } |