annotate doc/AMR-EFR-conversion @ 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 78739fda2856
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
312
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
1 Please see our AMR-EFR-philosophy article for an analysis of differences between
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
2 EFR and MR122 (12k2 mode of AMR), and for a discussion of how we handle the
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
3 relation between these two codecs. The following article was written in late
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
4 2022, before these issues were properly understood:
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
5
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
6 2022-December description
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
7 -------------------------
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
8
136
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 We have two simple utilities that allow one to experiment with "dumb" bit-
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 shuffling conversion between AMR 12k2 and EFR codec formats, to explore
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 capabilities and limitations of this approach.
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 gsm-amr2efr reads an AMR speech recording in RFC 4867 storage format (the common
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 .amr format) and converts it to EFR in gsmx format. The AMR input to this
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 utility must consists of MR122 frames only - no other AMR modes, no SID and no
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 NO_DATA gaps. The intent is that one can take a starting speech sample in WAV
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 format, encode it into AMR with amrnb-enc from opencore-amrnb (by default that
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 utility produces MR122 encoding without DTX), and then convert the AMR output to
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 EFR with gsm-amr2efr. One can then encode the same starting-point WAV speech
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 sample with gsmefr-encode (matching official EFR from ETSI) and compare the two
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 EFR outputs. When you do this experiment, you will see that the two EFR outputs
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 will be different (you can then analyze encoded speech parameter diffs with
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 gsmrec-dump), but each version can be fed to an EFR decoder, resulting in
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 OK-sounding speech.
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 gsm-efr2amr performs the opposite conversion: it reads an EFR session recording
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 in gsmx format and converts it to AMR storage format. The input to gsm-efr2amr
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 is allowed to contain Themyscira BFI markers in addition to EFR frames; these
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 BFI markers will be turned into AMR NO_DATA frames. The same input can also
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 contain EFR SID frames - however, gsm-efr2amr will not detect them and won't
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 give them any special handling, instead they will be bit-reshuffled into MR122
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 just like EFR speech frames. The result of such "dumb" conversion is invalid
8eb0e7a39409 doc: document command line utilities
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 AMR, and when you decode it with amrnb-dec, you will hear some strange noises.
312
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
34
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
35 2024-April addendum
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
36 -------------------
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
37
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
38 In addition to the SID issue noted above (if the input to gsm-efr2amr contains
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
39 any SID frames, the output will be invalid AMR), these dumb conversion methods
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
40 fail to take action on any embedded decoder homing frames. The correct DHF is
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
41 different between EFR and MR122, hence a better converter could be made to
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
42 recognize EFR DHFs in EFR->AMR direction and convert them to MR122 DHF, and do
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
43 the opposite in AMR->EFR direction. However, the implementation of AMR in
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
44 libopencore-amrnb has the homing feature stripped out altogether, hence doing
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
45 DHF conversion would be pointless as long as amrnb-enc and amrnb-dec utilities
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
46 are involved.
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
47
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
48 Thoughts on more proper conversion
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
49 ==================================
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
50
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
51 Imagine this hypothetical scenario: you operate a GSM network, and you
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
52 preferentially use EFR codec. You are then able to obtain TrFO interconnection
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
53 with some other mobile network of more "modern" kind, and that "modern" network
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
54 uses AMR exclusively, with no ability to use any GSM-only codecs. (The latter
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
55 situation holds for UMTS and VoLTE, for example.) Ordinarily, under these
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
56 circumstances TrFO won't be possible - instead you have to interconnect in
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
57 G.711, have each side transcode its respective codec, and put up with double
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
58 transcoding. But what if the AMR side can be told to use MR122 only, without
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
59 any of the lower modes? Such arrangement would make no sense in GSM (just use
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
60 EFR instead and save the headache of dealing with AMR), but it might be sensible
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
61 to ask the UMTS/VoLTE side for that MR122-only config of AMR-NB.
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
62
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
63 In this hypothetical scenario, would it be possible to pass speech frames
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
64 transparently, doing only the necessary bit reshuffling, and only invoke some
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
65 slick innovative algorithm during speech pauses to translate between EFR and
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
66 AMR SID paradigms?
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
67
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
68 Right now this idea is fantasy only. I don't know enough about VoLTE to tell
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
69 whether or not an MR122-only config of AMR-NB would work there, I have no idea
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
70 what codec config VoLTE operators run with currently when the other end of the
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
71 call is G.711 PSTN, and there is very little chance that any of the nation-scale
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
72 mobile operators would agree to a private peering interconnect with some tiny
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
73 community GSM network - while interconnection through fully public, open-to-
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
74 everyone IP-PSTN routes allows only G.711 and nothing else, no cellular TrFO.
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
75
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
76 Nonetheless, the idea of TrFO conversion between EFR and MR122-only AMR remains
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
77 interesting as a theoretical exercise, and we currently leave it there, just as
78739fda2856 doc/AMR-EFR-conversion: update for current understanding
Mychaela Falconia <falcon@freecalypso.org>
parents: 136
diff changeset
78 food for thought.