view doc/AMR-study-utils @ 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 e26b974f7ba3
children
line wrap: on
line source

Historical article from 2023-04
===============================

The following article was written in 2023-04, a year before the introduction of
libtwamr.  All of the utilities described in this article, plus even older
gsm-amr2efr and gsm-efr2amr utilities described in AMR-EFR-conversion article,
are implemented in amrconv subdirectory of the present source package, and are
entirely independent of libtwamr - they predate this library.

Original article follows; the utilities described therein are still useful:

As of this writing (2023-04), the main emphasis here at Themyscira Wireless is
on classic FR and EFR codecs, particularly the latter, rather than AMR.
However, given the close relation between GSM EFR and the highest MR122 mode of
AMR, we are starting to explore AMR a little too, focusing on the reference C
implementation and various published test sequences.  Working in this direction,
we have developed the following AMR study and exploration utilities:

amr-cod-parse	This utility reads the *.cod binary file format used by 3GPP
		reference code and test sequences for AMR-encoded speech, groks
		every frame and dumps all recorded parameters in human-readable
		form.

amr-ietf-parse	A similar AMR parse/dump utility to amr-cod-parse, but reading
		the more common IETF RFC 4867 *.amr binary file format instead.

amr-cod2ietf	These two utilities convert between 3GPP *.cod and IETF *.amr
amr-ietf2cod	formats.  amr-cod2ietf converts from *.cod to *.amr;
		amr-ietf2cod converts in the opposite direction.

Just like ETSI *.cod and *.dec formats for EFR, 3GPP *.cod format for AMR is
endian-dependent.  Our amr-cod-parse and amr-cod2ietf utilities expect LE byte
order by default, matching the official test sequences in
ts_126074v170001p0.zip; they also support BE byte order with -b option.
However, our amr-ietf2cod utility (rarely needed) emits its cod-format output
in the local machine's native byte order.