annotate doc/AMR-EFR-performance @ 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 cd1f0fa936cc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
487
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 Performance of libgsmefr and libtwamr, compared to competition
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 ==============================================================
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 Both libgsmefr and libtwamr are based on reference C code from ETSI/3GPP:
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 libgsmefr is a librified version of GSM 06.53 reference code, and libtwamr is a
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 librified version of TS 26.073 reference code. Both of those reference sources
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 were officially presented as simulations, not as production code for running on
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 general-purpose x86 servers implementing transcoding MGW functionality, and the
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 code is extremely inefficient.
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 The problem of poor performance (taking too much CPU percentage per transcoded
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 call) would not be so acute if Themyscira GSM codec libraries existed in a
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 vacuum without competition - but we do have a competitor in the form of
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 libopencore-amrnb, part of the slightly larger opencore-amr package. Just like
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 libtwamr, that library is a derivative work based on the original AMR C code
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 from 3GPP, but by a more circuitous route: first PacketVideo created an
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 implementation of AMR for Android based on 3GPP reference code, then the
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 creators of opencore-amr took PV's Android implementation (named OpenCORE) and
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 ported it from Android to standard Unix/Linux userspace.
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 Aside from its peculiar genealogy, there are practical problems with
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 libopencore-amrnb that made it unattractive for Themyscira Wireless, and thus
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 created the impetus for producing the present alternative:
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 * That library implements only AMR and not EFR, whereas for ThemWi good support
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 for EFR is a higher priority than good (or any) support for AMR.
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 * The idea of reshuffling bits in the manner of our gsm-amr2efr and gsm-efr2amr
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 hack-utilities (see AMR-EFR-conversion article) in order to implement "poor
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 man's EFR" via libopencore-amrnb was considered, but then rejected on
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 philosophical and aesthetic grounds: it feels philosophically wrong to
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 reshuffle bits in the application wrapper only to have internal code within
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 the library shuffle them back into the natural order of codec parameters.
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 * Like any AMR-and-not-EFR library, libopencore-amrnb cannot grok EFR SID
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 frames. Therefore, an implementation of "poor man's EFR" using that library
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 would have to operate with DTXu disabled, needlessly burning battery capacity
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 in the MS.
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 * Even for "pure" AMR and not EFR, libopencore-amrnb exhibits one serious
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 defect: it omits the in-band homing feature in both the encoder and the
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 decoder, even though this feature is mandatory per 3GPP specs. (It is not
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 clear if this removal of homing functions was the work of PacketVideo in the
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 world of Android, or if it happened at the time of subsequent opencore-amr
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 port to standard Unix/Linux userspace.) Furthermore, because the interface
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 wrapper module of libopencore-amrnb does not expose any state reset functions,
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 it is impossible to implement the homing feature externally to the library.
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 This lack of homing makes it impossible to test libopencore-amrnb against the
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 full set of 3GPP test sequences for AMR.
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 In the present time, as of this release of Themyscira gsm-codec-lib, libgsmefr
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 is intended for production use while libtwamr is intended for lab use only,
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 matching test sequences and modeling bit-exact operation of other people's
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 network elements in reverse engineering workflows. Based on this difference in
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 applicability to production, more work has been put into improving performance
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 of libgsmefr compared to libtwamr. Libgsmefr version 1.1.0 exhibits
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 approximately 2x performance improvement over the original version, but it is
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 still significantly slower than libopencore-amrnb.
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 The following performance numbers were obtained on Mother Mychaela's development
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 laptop, Intel Core2 Duo P8600 CPU @ 2.40 GHz, running 32-bit version of
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 Slackware, i.e., running only i686 code and not x86_64 despite the CPU having
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 the 'lm' feature. All tests involve encoding TEST4.INP sequence from GSM 06.54
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 set (301 frames in total, 6.020 s audio duration), then decoding the output of
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 the encoder run.
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 Implementation Encoding time Decoding time
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 ---------------------------------------------
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 libgsmefr 183 ms 23 ms
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 libtwamr 359 ms 52 ms
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 opencore-amr 53 ms 13 ms
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 libgsmfr2 (FR) 13 ms 6 ms
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 FRv1 encoding and decoding of the same TEST4.INP was included in the test in
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 order to convince ourselves that FRv1 is not in any need of performance
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 optimization. In a network deployment that generally prefers EFR over FRv1,
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 almost all calls between a local GSM MS and the outside world (PSTN) will
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 involve the EFR transcoder rather than FRv1. If on rare occasion the network
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 selects FRv1 instead of EFR because the subscriber is using a super-old
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 non-EFR-capable handset (or has artificially restricted the speech version list
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 to FRv1 only), there will be some CPU cycles saved "for free" by using the much
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 less computationally expensive FRv1 codec - but CPU capacity planning for the
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 transcoding MGW has to be based on EFR performance numbers rather than FRv1.
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 In terms of EFR or MR122 encoder and decoder CPU cycle demand, libtwamr is
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 currently the worst performer; the first version of libgsmefr exhibited the
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 same poor performance. The current version of libgsmefr exhibits somewhat
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 better performance because most saturation arithmetic "basic ops" have been
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 inlined (eliminating the use of a function call for every elementary operation),
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 and the implementation code of those newly-inlined functions has been
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 streamlined for performance, as much as possible with immediately obvious
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 programming methods. The result is about 2x improvement over the original -
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 but sadly, still significantly slower than libopencore-amrnb on the same
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 machine with the same 32-bit execution mode and ABI.
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 Given that we (Themyscira Wireless) have a ton of other work tasks in our queue
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 besides the present problem of performance-optimizing libgsmefr to match
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 opencore-amr, this problem is currently shelved. We are releasing our libraries
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 as they currently stand, with the ~2x improvement in libgsmefr over the original
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 but still not matching opencore-amr, and leaving the problem of further
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 performance improvement to be addressed later, after other work of higher
cd1f0fa936cc doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 priority.