FreeCalypso > hg > freecalypso-docs
view DSP-speech-decoder @ 108:e26623146358 default tip
new article DSP-speech-decoder
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 29 Oct 2024 22:11:41 +0000 |
parents | |
children |
line wrap: on
line source
As described in Calypso-digital-voice article, we can use Calypso MCSI (an auxiliary hardware interface brought out on FreeCalypso dev boards) in the so- called "Bluetooth headset" mode to capture the voice call downlink in digital form, specifically 16-bit linear PCM, after speech decoding performed by the DSP, but before D-to-A conversion for analog audio output. As of 2024-10, we have a set of tools (Lattice Icestick FPGA board, a gateware design for this FPGA, and corresponding host software tools - see fc-pcm-if Hg repository) that puts these ideas into practice; using these tools, we can now answer some long- standing questions about exactly how Calypso DSP implements speech decoding for various GSM codecs. FRv1 decoder implementation =========================== The original set of Full Rate codec specs did not include the feature of in-band encoder and decoder homing frames; this feature was included in HRv1 and EFR from day 1, and was also back-ported to FRv1 in later versions of 06.10 spec - but it was not present originally, and it is defined as optional in the later spec versions. Going into these Calypso MCSI experiments, we had this question: does Calypso DSP implement decoder homing frames for FRv1, or does it not? Experimental observation: in-band decoder homing is NOT implemented for FRv1 in this DSP. If we feed the DHF defined in later versions of 06.10 spec to our Calypso MS via TCH DL, it gets treated as a regular speech frame without any special handling; more specifically, we don't see PCM16 output frames consisting of 0x0008 words as required by the spec when the optional in-band decoder homing feature is present. This lack of in-band homing feature makes it difficult to test the decoder against official ETSI test sequences, as we have no way of getting it into a defined state. The ancient GSM 11.10 test spec provides a mechanism called DAI that includes the necessary reset signal, and it appears that Calypso DSP does support operating MCSI as DAI rather than "Bluetooth" mode - but we haven't done any experiments with this DAI mode yet. Hence our exploration of FRv1 decoder implementation in our dear Calypso DSP ends here for now. EFR decoder implementation ========================== Unlike the situation with FRv1, the in-band codec homing feature is mandatory for EFR per the specs. And with Calypso DSP we got good news: it does implement this feature at least in the decoding direction, which is the only one we've tested so far. Exactly per the spec, the first DHF arriving from TCH DL is decoded like a regular speech frame, but the decoder state is reset at the end. All subsequent DHFs turn into 0x0008 output, and we indeed see the latter coming out on MCSI. Once we established that the decoder homing feature works as specified, our next question was: does our dear Calypso DSP implement the original bit-exact definition of EFR, or does it implement what we call the AMR-EFR hybrid? Experimental observation: at least in the decoding direction, it implements the original bit-exact EFR decoder! This finding is remarkable because all of our experiments in this series were performed on DSP ROM version 3606, the final one that not only includes AMR support, but has been subject to whatever rework TI did between 3416 and 3606 ROMs. If we assume (based on some experiments in past years where we disabled loading of TI's official DSP patches) that AMR support is already present in the DSP ROM, as opposed to being contained entirely in the patches, it follows that the DSP ROM must contain both EFR and AMR codec implementations, yet the EFR implementation has not been AMR-ized. (In contrast, the network-side speech transcoder implementation used by T-Mobile USA and Telcel Mexico appears to use maximally-shared code between EFR and AMR, resulting in the AMR-EFR hybrid that differs from the original bit-exact definition, but has been blessed by 3GPP as an acceptable alternative.) Strange corruption bug ---------------------- As we fed ETSI test sequences from GSM 06.54 to our Calypso DSP under test via TCH DL, checking for an exact match, we observed what appears to be a corruption bug of some kind (corrupting either codec parameter bits or state variables) that manifests in a manner that seems random. In our test, we concatenated all 21 test sequences from GSM 06.54 (test0.cod through test20.cod) and fed the resulting super-long sequence into TCH DL. The test was performed twice; on the second try we had 'tch record' running in fc-shell, capturing TCH DL as received by the Calypso MS, and we confirmed that the entire super-long test sequence was received without errors. The decoded output (captured via MCSI) was then split into 21 separate robe files following frame counts: because each test*.cod input sequence begins with two DHFs, the decoder resets between these concatenated test sequences, allowing the output to be compared against test*.out reference files with per-sequence granularity. The final diff comparison between split-out robe files and the official reference decoder output revealed the following oddities: * In the first run, decoded outputs for test0, test6, test11, test14, test15, test16 and test20 showed a mismatch. The difference in test0 outputs was examined closer: the diff begins on a subframe boundary and continues until the next DHF. All other test sequences got a perfect match to ETSI reference decoder output. * In the second run, a different set of sequences showed a mismatch: this time the failing sequences were test1, test5, test6, test7, test15 and test16. The other sequences that produced mismatches in the first run produced perfectly good output (matching ETSI reference decoder) in this run! * test6, test15 and test16 were the three sequences that failed in both runs. However, diffing between the two runs shows that the errors in each of these 3 twice-failed sequences are different between runs, further strengthening the appearance of corruption that seems totally random. We do not currently have any better explanation for this oddity than a data corruption bug somewhere in the DSP. For the record, these tests were performed on an FCDEV3B with Calypso DSP ROM version 3606 and DSP patch version 6840.