annotate libgsmfrp/good_frame.c @ 109:2361a7d8c1eb

libgsmfrp: randomize grid position params when muting speech, following GSM 06.11 example solution in more detail
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 28 Nov 2022 04:15:20 +0000
parents 4812e00bc100
children f081a6850fb5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * In this module we implement preprocessing of received good frames.
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 */
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 #include <stdint.h>
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <string.h>
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include "gsm_fr_preproc.h"
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include "internal.h"
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 void gsmfr_preproc_good_frame(struct gsmfr_preproc_state *st, gsm_byte *frame)
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 {
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 int sid;
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 /* always set correct magic */
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 frame[0] = 0xD0 | frame[0] & 0x0F;
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 /* now classify by SID */
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 sid = gsmfr_preproc_sid_classify(frame);
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 switch (sid) {
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 case 0: /* good speech frame */
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 memcpy(&st->speech_frame, frame, sizeof(gsm_frame));
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 st->rx_state = SPEECH;
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 return;
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 case 1: /* invalid SID frame */
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 if (st->got_valid_sid) {
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 st->rx_state = COMFORT_NOISE;
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 gsmfr_preproc_gen_cn(st, frame);
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 } else {
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 st->rx_state = NO_DATA;
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 memcpy(frame, &gsmfr_preproc_silence_frame,
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 sizeof(gsm_frame));
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 }
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 return;
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 case 2: /* valid SID frame */
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 st->got_valid_sid = 1;
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 memcpy(st->sid_prefix, frame, 5);
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 st->sid_xmaxc[0] = ((frame[6] & 0x1F) << 1) | (frame[7] >> 7);
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 st->sid_xmaxc[1] = ((frame[13] & 0x1F) << 1) | (frame[14] >> 7);
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 st->sid_xmaxc[2] = ((frame[20] & 0x1F) << 1) | (frame[21] >> 7);
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 st->sid_xmaxc[3] = ((frame[27] & 0x1F) << 1) | (frame[28] >> 7);
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 st->rx_state = COMFORT_NOISE;
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 gsmfr_preproc_gen_cn(st, frame);
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 return;
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 }
4812e00bc100 libgsmfrp: implement handling of good frames
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 }