manawyrm has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-trx/+/42822?usp=email )
Change subject: Transceiver52M: fix viterbi-eq soft bits on platforms where char is unsigned ......................................................................
Transceiver52M: fix viterbi-eq soft bits on platforms where char is unsigned
The viterbi-eq demodulator stores soft bits into chars. "char" is signed on x86/amd64 but unsigned on arm64. On arm64 the stored byte 0x81 (== -127) is read back as +129, so after the sign flip and vectorSlicer() clamp every soft bit collapses to 0.0.
The same issue also appears to be present in the MS code path, so it was (blindly) fixed there as well. The MS fixes are untested!
Change-Id: I1cda66228f3d48e1b941b25614d599c16ad79aa0 --- M Transceiver52M/Transceiver.cpp M Transceiver52M/grgsm_vitac/grgsm_vitac.cpp M Transceiver52M/grgsm_vitac/grgsm_vitac.h M Transceiver52M/ms/ms.h M Transceiver52M/ms/ms_rx_lower.cpp M Transceiver52M/ms/ms_upper.h M utils/va-test/burst-gen.cpp 7 files changed, 18 insertions(+), 18 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/22/42822/1
diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp index 17bf148..7b915d6 100644 --- a/Transceiver52M/Transceiver.cpp +++ b/Transceiver52M/Transceiver.cpp @@ -623,7 +623,7 @@ std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR]; float ncmax; const unsigned burst_len_bits = 148 + 8; - char demodded_softbits[burst_len_bits]; + signed char demodded_softbits[burst_len_bits]; SoftVector *bits = new SoftVector(burst_len_bits);
if (type == CorrType::TSC) { diff --git a/Transceiver52M/grgsm_vitac/grgsm_vitac.cpp b/Transceiver52M/grgsm_vitac/grgsm_vitac.cpp index 2016541..db8fa34 100644 --- a/Transceiver52M/grgsm_vitac/grgsm_vitac.cpp +++ b/Transceiver52M/grgsm_vitac/grgsm_vitac.cpp @@ -77,7 +77,7 @@
template <unsigned int burst_size> NO_UBSAN static void detect_burst_generic(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, - char *output_binary, int ss) + signed char *output_binary, int ss) { std::vector<gr_complex> rhh_temp(CHAN_IMP_RESP_LENGTH * d_OSR); unsigned int stop_states[2] = { 4, 12 }; @@ -98,22 +98,22 @@ output_binary[i] = output[i] > 0 ? -127 : 127; // pre flip bits! }
-NO_UBSAN void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary, +NO_UBSAN void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, signed char *output_binary, int ss) { return detect_burst_generic<BURST_SIZE>(input, chan_imp_resp, burst_start, output_binary, ss); } -NO_UBSAN void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary, +NO_UBSAN void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, signed char *output_binary, int ss) { return detect_burst_generic<8 + 41 + 36 + 3>(input, chan_imp_resp, burst_start, output_binary, ss); }
-NO_UBSAN void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary) +NO_UBSAN void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, signed char *output_binary) { return detect_burst_nb(input, chan_imp_resp, burst_start, output_binary, 3); } -NO_UBSAN void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary) +NO_UBSAN void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, signed char *output_binary) { return detect_burst_ab(input, chan_imp_resp, burst_start, output_binary, 3); } diff --git a/Transceiver52M/grgsm_vitac/grgsm_vitac.h b/Transceiver52M/grgsm_vitac/grgsm_vitac.h index c1e470c..db1081f 100644 --- a/Transceiver52M/grgsm_vitac/grgsm_vitac.h +++ b/Transceiver52M/grgsm_vitac/grgsm_vitac.h @@ -63,10 +63,10 @@ int process_vita_burst(gr_complex *input, int tsc, unsigned char *output_binary); int process_vita_sc_burst(gr_complex *input, int tsc, unsigned char *output_binary, int *offset);
-void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary, int ss); -void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary, int ss); -void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary); -void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary); +void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, signed char *output_binary, int ss); +void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, signed char *output_binary, int ss); +void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, signed char *output_binary); +void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, signed char *output_binary);
void gmsk_mapper(const unsigned char *input, int nitems, gr_complex *gmsk_output, gr_complex start_point); gr_complex correlate_sequence(const gr_complex *sequence, int length, const gr_complex *input); diff --git a/Transceiver52M/ms/ms.h b/Transceiver52M/ms/ms.h index 2ad78de..515345b 100644 --- a/Transceiver52M/ms/ms.h +++ b/Transceiver52M/ms/ms.h @@ -129,7 +129,7 @@ GSM::Time gsmts; union { blade_sample_type burst[ONE_TS_BURST_LEN]; - char sch_bits[148]; + signed char sch_bits[148]; }; };
diff --git a/Transceiver52M/ms/ms_rx_lower.cpp b/Transceiver52M/ms/ms_rx_lower.cpp index d894e96..8d53eb7 100644 --- a/Transceiver52M/ms/ms_rx_lower.cpp +++ b/Transceiver52M/ms/ms_rx_lower.cpp @@ -123,7 +123,7 @@ gain_check = (gain_check + 1) % avgburst_num; }
-static char sch_demod_bits[148]; +static signed char sch_demod_bits[148];
bool ms_trx::handle_sch_or_nb() { @@ -174,7 +174,7 @@ } detect_burst_nb(&ss[start], &channel_imp_resp[0], 0, sch_demod_bits);
- auto sch_decode_success = decode_sch(sch_demod_bits, is_first_sch_acq); + auto sch_decode_success = decode_sch((char *)sch_demod_bits, is_first_sch_acq); #if 0 auto burst = new signalVector(buf_len, 50); const auto corr_type = is_first_sch_acq ? sch_detect_type::SCH_DETECT_BUFFER : sch_detect_type::SCH_DETECT_FULL; diff --git a/Transceiver52M/ms/ms_upper.h b/Transceiver52M/ms/ms_upper.h index 06f7c54..5a410c7 100644 --- a/Transceiver52M/ms/ms_upper.h +++ b/Transceiver52M/ms/ms_upper.h @@ -28,7 +28,7 @@
class upper_trx : public ms_trx { volatile bool mOn; - char demodded_softbits[444]; + signed char demodded_softbits[444];
// void driveControl(); bool pullRadioVector(GSM::Time &wTime, int &RSSI, int &timingOffset); diff --git a/utils/va-test/burst-gen.cpp b/utils/va-test/burst-gen.cpp index bdd0c4b..d73d0f4 100644 --- a/utils/va-test/burst-gen.cpp +++ b/utils/va-test/burst-gen.cpp @@ -291,7 +291,7 @@ std::cerr << "demod test va:" << std::endl; std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR]; float ncmax; - char demodded_softbits[444]; + signed char demodded_softbits[444];
// demod at known offset { @@ -376,7 +376,7 @@ if (rs.ct == CorrType::RACH) { std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR]; float ncmax; - char demodded_softbits[444]; + signed char demodded_softbits[444]; int normal_burst_start = 0; normal_burst_start = get_access_imp_resp(conved_beg, &chan_imp_resp[0], &ncmax, 0); normal_burst_start = std::max(normal_burst_start, 0); @@ -414,7 +414,7 @@ } else { std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR]; float ncmax; - char demodded_softbits[444]; + signed char demodded_softbits[444];
auto normal_burst_start = get_norm_chan_imp_resp(conved_beg, &chan_imp_resp[0], &ncmax, tsc); detect_burst_nb(conved_beg, &chan_imp_resp[0], normal_burst_start + 0, demodded_softbits); @@ -431,7 +431,7 @@ }
struct estim_burst_params ebp; - char demodded_softbits[444]; + signed char demodded_softbits[444]; complex *rx_sigproc_cfloat = reinterpret_cast<complex *>(conved_beg); signalVector sv(rx_sigproc_cfloat, 0, rs.convolved->size(), dummy_alloc, dummy_free);