lists.osmocom.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

gerrit-log

Thread Start a new thread
Download
Threads by month
  • ----- 2026 -----
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
gerrit-log@lists.osmocom.org

July 2023

  • 1 participants
  • 3051 discussions
[S] Change in osmo-msc[master]: csd_bs_list_to_bearer_cap(): properly initialize bcap fields
by fixeria 25 Jul '23

25 Jul '23
fixeria has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-msc/+/33932 ) Change subject: csd_bs_list_to_bearer_cap(): properly initialize bcap fields ...................................................................... Set Ready For Review -- To view, visit https://gerrit.osmocom.org/c/osmo-msc/+/33932 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-msc Gerrit-Branch: master Gerrit-Change-Id: If49c89e4f867bac92ad062c062b9f36bab2b4531 Gerrit-Change-Number: 33932 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Comment-Date: Tue, 25 Jul 2023 20:27:48 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: No Gerrit-MessageType: comment
1 0
0 0
[S] Change in osmo-msc[master]: csd_bs_list_to_bearer_cap(): add default branch for safety
by fixeria 25 Jul '23

25 Jul '23
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-msc/+/33933 ) Change subject: csd_bs_list_to_bearer_cap(): add default branch for safety ...................................................................... csd_bs_list_to_bearer_cap(): add default branch for safety Otherwise we may fail to initialize cap->data.{user,interm}_rate. Change-Id: Ibfb71d1ece502585b55db0f28069a6aa0666b9df Related: OS#6110, OS#4394 --- M src/libmsc/csd_bs.c 1 file changed, 17 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/33/33933/1 diff --git a/src/libmsc/csd_bs.c b/src/libmsc/csd_bs.c index dcc6124..3a2c82a 100644 --- a/src/libmsc/csd_bs.c +++ b/src/libmsc/csd_bs.c @@ -467,6 +467,11 @@ cap->data.user_rate = GSM48_BCAP_UR_9600; cap->data.interm_rate = GSM48_BCAP_IR_16k; break; + default: + LOGP(DMSC, LOGL_ERROR, + "%s(): bs=%d (rate=%u) is not implemented\n", + __func__, bs, bs_map[bs].rate); + continue; } /* FIXME: handle more than one list entry */ -- To view, visit https://gerrit.osmocom.org/c/osmo-msc/+/33933 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-msc Gerrit-Branch: master Gerrit-Change-Id: Ibfb71d1ece502585b55db0f28069a6aa0666b9df Gerrit-Change-Number: 33933 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-MessageType: newchange
1 0
0 0
[S] Change in osmo-msc[master]: csd_bs_list_to_bearer_cap(): properly initialize bcap fields
by fixeria 25 Jul '23

25 Jul '23
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-msc/+/33932 ) Change subject: csd_bs_list_to_bearer_cap(): properly initialize bcap fields ...................................................................... csd_bs_list_to_bearer_cap(): properly initialize bcap fields Currently this function fails to initialize all bcap fields properly, so the resulting CC Setup message generated by osmo-msc has some fields set to reserved/invalid values. With these changes I am able to establish a data call on TCH/F9.6: * cap->{mode,coding}: assign default values explicitly; * cap->radio: value 0 is reserved, set GSM48_BCAP_RRQ_FR_ONLY; * cap->data.sig_access: value 0 is reserved, set GSM48_BCAP_SA_I440_I450; * cap->data.transp: this is not a bool, set GSM48_BCAP_TR_{TRANSP,RLP}; * cap->data.{nr_{data,stop}_bits,parity}: set 8N1 by default; * cap->data.modem_type: explicitly assign default value; * cap->data.interm_rate: value 0 is reserved, set GSM48_BCAP_IR_{8k,16k}. The related libosmocore.git patch additionally fixes encoding of the "Connection element (octet 6c)", so that bcap->data.transp is used. Change-Id: If49c89e4f867bac92ad062c062b9f36bab2b4531 Related: libosmocore.git I7339908864e8a2aef6f2b48a108650167e413c7f Related: OS#6110, OS#4394 --- M src/libmsc/csd_bs.c 1 file changed, 47 insertions(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/32/33932/1 diff --git a/src/libmsc/csd_bs.c b/src/libmsc/csd_bs.c index 1c40ef5..dcc6124 100644 --- a/src/libmsc/csd_bs.c +++ b/src/libmsc/csd_bs.c @@ -422,6 +422,9 @@ { *cap = (struct gsm_mncc_bearer_cap){ .transfer = GSM_MNCC_BCAP_UNR_DIG, + .mode = GSM48_BCAP_TMOD_CIRCUIT, + .coding = GSM48_BCAP_CODING_GSM_STD, + .radio = GSM48_BCAP_RRQ_FR_ONLY, }; enum csd_bs bs; int i; @@ -430,24 +433,39 @@ bs = list->bs[i]; cap->data.rate_adaption = GSM48_BCAP_RA_V110_X30; + cap->data.sig_access = GSM48_BCAP_SA_I440_I450; cap->data.async = bs_map[bs].async; - cap->data.transp = bs_map[bs].transp; + if (bs_map[bs].transp) + cap->data.transp = GSM48_BCAP_TR_TRANSP; + else + cap->data.transp = GSM48_BCAP_TR_RLP; + + /* FIXME: proper values for sync/async (current: 8N1) */ + cap->data.nr_data_bits = 8; + cap->data.parity = GSM48_BCAP_PAR_NONE; + cap->data.nr_stop_bits = 1; + cap->data.modem_type = GSM48_BCAP_MT_NONE; switch (bs_map[bs].rate) { case 300: cap->data.user_rate = GSM48_BCAP_UR_300; + cap->data.interm_rate = GSM48_BCAP_IR_8k; break; case 1200: cap->data.user_rate = GSM48_BCAP_UR_1200; + cap->data.interm_rate = GSM48_BCAP_IR_8k; break; case 2400: cap->data.user_rate = GSM48_BCAP_UR_2400; + cap->data.interm_rate = GSM48_BCAP_IR_8k; break; case 4800: cap->data.user_rate = GSM48_BCAP_UR_4800; + cap->data.interm_rate = GSM48_BCAP_IR_8k; break; case 9600: cap->data.user_rate = GSM48_BCAP_UR_9600; + cap->data.interm_rate = GSM48_BCAP_IR_16k; break; } -- To view, visit https://gerrit.osmocom.org/c/osmo-msc/+/33932 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-msc Gerrit-Branch: master Gerrit-Change-Id: If49c89e4f867bac92ad062c062b9f36bab2b4531 Gerrit-Change-Number: 33932 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-MessageType: newchange
1 0
0 0
[S] Change in libosmocore[master]: gsm48_ie: fix gsm48_encode_bearer_cap(): encode bcap->data.transp
by fixeria 25 Jul '23

25 Jul '23
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/33931 ) Change subject: gsm48_ie: fix gsm48_encode_bearer_cap(): encode bcap->data.transp ...................................................................... gsm48_ie: fix gsm48_encode_bearer_cap(): encode bcap->data.transp Currently this function is hard-coding the "Connection element (octet 6c)" (see Table 10.5.101h/3GPP TS 24.008) to "Transparent" (0). This breaks non-transparent data calls. Use the value from bcap->data.transp. The decoding equivalent of this function needs no changes, it does populate this field already. Change-Id: I7339908864e8a2aef6f2b48a108650167e413c7f Related: OS#6110, OS#4394 --- M src/gsm/gsm48_ie.c 1 file changed, 20 insertions(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/31/33931/1 diff --git a/src/gsm/gsm48_ie.c b/src/gsm/gsm48_ie.c index e431e4f..0cdcb7c 100644 --- a/src/gsm/gsm48_ie.c +++ b/src/gsm/gsm48_ie.c @@ -351,7 +351,9 @@ lv[i++] = (bcap->data.parity & 7) | ((bcap->data.interm_rate & 3) << 5); /* octet 6c */ - lv[i] = 0x80 | (bcap->data.modem_type & 0x1f); + lv[i] = 0x80 | + ((bcap->data.transp & 3) << 5) | + (bcap->data.modem_type & 0x1f); break; default: return -EINVAL; -- To view, visit https://gerrit.osmocom.org/c/libosmocore/+/33931 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Change-Id: I7339908864e8a2aef6f2b48a108650167e413c7f Gerrit-Change-Number: 33931 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-MessageType: newchange
1 0
0 0
[S] Change in osmo-ttcn3-hacks[master]: BSC_Tests: Fix test case TC_err_84_unknown
by pespin 25 Jul '23

25 Jul '23
Attention is currently required from: jolly. pespin has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/33925 ) Change subject: BSC_Tests: Fix test case TC_err_84_unknown ...................................................................... Patch Set 1: (1 comment) File bsc/BSC_Tests.ttcn: https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/33925/comment/92677a37_5d51… PS1, Line 5662: msg.msgs.rrm.dTM_AssignmentFailure.messageType := '01001000'B; can't you use some enum for DTM ASSIGNMENT FAILURE here? -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/33925 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I35877574cf4459332229e3b941918bc0a23b939f Gerrit-Change-Number: 33925 Gerrit-PatchSet: 1 Gerrit-Owner: jolly <andreas(a)eversberg.eu> Gerrit-Reviewer: Jenkins Builder Gerrit-CC: pespin <pespin(a)sysmocom.de> Gerrit-Attention: jolly <andreas(a)eversberg.eu> Gerrit-Comment-Date: Tue, 25 Jul 2023 18:24:36 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: No Gerrit-MessageType: comment
1 0
0 0
[S] Change in osmo-trx[master]: ms: drop the tx burst padding
by Hoernchen 25 Jul '23

25 Jul '23
Hoernchen has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-trx/+/33926 ) Change subject: ms: drop the tx burst padding ...................................................................... ms: drop the tx burst padding Change-Id: Ied5c3ab5dde975e11b0ef6d9cbc86be19173c4e8 --- M Transceiver52M/ms/ms.cpp 1 file changed, 10 insertions(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/26/33926/1 diff --git a/Transceiver52M/ms/ms.cpp b/Transceiver52M/ms/ms.cpp index 896928e..169aa5e 100644 --- a/Transceiver52M/ms/ms.cpp +++ b/Transceiver52M/ms/ms.cpp @@ -144,7 +144,7 @@ << " check: " << check.FN() << ":" << check.TN() << " target: " << target.FN() << ":" << target.TN() << " ts now: " << now_ts << " target ts:" << send_ts << std::endl; #endif -#if 1 +#if 0 unsigned int pad = 4 * 4; blade_sample_type buf2[len + pad]; std::fill(buf2, buf2 + pad, 0); -- To view, visit https://gerrit.osmocom.org/c/osmo-trx/+/33926 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-trx Gerrit-Branch: master Gerrit-Change-Id: Ied5c3ab5dde975e11b0ef6d9cbc86be19173c4e8 Gerrit-Change-Number: 33926 Gerrit-PatchSet: 1 Gerrit-Owner: Hoernchen <ewild(a)sysmocom.de> Gerrit-MessageType: newchange
1 0
0 0
[S] Change in osmo-trx[master]: ms: update osmocom-bb
by Hoernchen 25 Jul '23

25 Jul '23
Hoernchen has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-trx/+/33927 ) Change subject: ms: update osmocom-bb ...................................................................... ms: update osmocom-bb Change-Id: I6f9fca7a4d6a02e82bf406fd136c5bde96bb93af --- M Transceiver52M/Makefile.am M Transceiver52M/ms/ms_upper.cpp M osmocom-bb 3 files changed, 12 insertions(+), 2 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/27/33927/1 diff --git a/Transceiver52M/Makefile.am b/Transceiver52M/Makefile.am index 681809f..f8556f0 100644 --- a/Transceiver52M/Makefile.am +++ b/Transceiver52M/Makefile.am @@ -80,6 +80,7 @@ TRXCON_LDADD = \ $(top_builddir)/osmocom-bb/src/host/trxcon/src/.libs/libtrxcon.a \ $(top_builddir)/osmocom-bb/src/host/trxcon/src/.libs/libl1sched.a \ + $(top_builddir)/osmocom-bb/src/host/trxcon/src/.libs/libl1gprs.a \ $(LIBOSMOCODING_LIBS) MS_LOWER_SRC = \ diff --git a/Transceiver52M/ms/ms_upper.cpp b/Transceiver52M/ms/ms_upper.cpp index 4944269..21f70bb 100644 --- a/Transceiver52M/ms/ms_upper.cpp +++ b/Transceiver52M/ms/ms_upper.cpp @@ -438,7 +438,7 @@ msgb_talloc_ctx_init(tall_trxcon_ctx, 0); trxc_log_init(tall_trxcon_ctx); - g_trxcon = trxcon_inst_alloc(tall_trxcon_ctx, 0, 0); + g_trxcon = trxcon_inst_alloc(tall_trxcon_ctx, 0); g_trxcon->gsmtap = nullptr; g_trxcon->phyif = nullptr; g_trxcon->phy_quirks.fbsb_extend_fns = 866; // 4 seconds, known to work. diff --git a/osmocom-bb b/osmocom-bb index c209242..3ed0bbc 160000 --- a/osmocom-bb +++ b/osmocom-bb @@ -1 +1 @@ -Subproject commit c209242d196a9c30401c383104f5063d4dbde4cd +Subproject commit 3ed0bbc22f6d3e1313e5e6b662a5a5701f317af5 -- To view, visit https://gerrit.osmocom.org/c/osmo-trx/+/33927 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-trx Gerrit-Branch: master Gerrit-Change-Id: I6f9fca7a4d6a02e82bf406fd136c5bde96bb93af Gerrit-Change-Number: 33927 Gerrit-PatchSet: 1 Gerrit-Owner: Hoernchen <ewild(a)sysmocom.de> Gerrit-MessageType: newchange
1 0
0 0
[L] Change in osmo-trx[master]: ms: restructure the va code to add rach support
by Hoernchen 25 Jul '23

25 Jul '23
Hoernchen has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-trx/+/33928 ) Change subject: ms: restructure the va code to add rach support ...................................................................... ms: restructure the va code to add rach support Change-Id: I7275a647428661a788646fec10af429fcdcf577e new bb Change-Id: I36dbed6394243c8c2b5e14acbade7b1b82d0708c XX va trials Change-Id: Id1de531249922315da35d2d01778a7611879fb92 fugg Change-Id: Ibe5d538e9970e590877d2a901165defa6dc972fe tx->va needs scaling by 0.1 Change-Id: Ic3cc5748e00584971c4bd509eed7db9d5f09201c sch Change-Id: I41fabcdd5b4a5eb8cff4e42676438b0bffa2e1b9 va1 Change-Id: I93ab3cb8f91bf6e496175ae70e5da0323cabe911 xx Change-Id: I26b5957f80be02df913e31a370e1e7910f4484df va2 Change-Id: I09d6b560241e6797a533e7f8e68e899c42517baa va: max elemn fix max elem returns the first largest element - but the true value is skewed to the right in our case. Change-Id: I1de9b7e280d8723ce9876bef20c790383070e958 SDSD Change-Id: Ie32fc753548583896be9eef486346617ea8b9e88 adsad Change-Id: I3a9a2569c2057feae196b182f6e812edd08ccfa4 make ubsan happy Change-Id: Ic6ddfcf826539dd227e76e8054d3f3d777c97d5e wtf wip Change-Id: I0f465da6d17bf91f24a68b3ec2075995478b5fad a bit of channel impulse resp makes it work (?!) Change-Id: I2ab1d6bdf89a0d950ebe38b1fd5efb9764c9ba4f shp Change-Id: I7f936dd22b55145bd182f3b5e51b9c183ab1725f finally works as intended.. maybe. Change-Id: I2af965ab20af74b38975c645093626a81b7fdf72 cleanup Change-Id: If36f15a5f32465ce04113a669e3875dc19c69d6b cleanup Change-Id: I1163a6194570cdce93d46e40e4b710ad5239cce7 iomanip Change-Id: I20453a5381afcf8a7875b6e82805f7e8595163b2 cleanup3 Change-Id: I8e66f2a447984a1fd5a20814eca3ee019ba59717 cleanup3 Change-Id: Ib499fe0a5d42afd9198da96dbcba2a42705bbe73 use short inted burst Change-Id: I0bc7a7b35da474bce74f8a36834a22d5885bbdbc add burst dump Change-Id: I0ca9114b6a02cac7fb628ac47db2554b3ff3b967 cleanup va Change-Id: I1697925b0f0f36aaa05ee170a9483750611aef5d all tests Change-Id: Ie2db803ccb789699cdfaf82e74acba42123d961a transceiver: add va This needs slightly shifted rx windows that need to include the beginning ot the burst. Change-Id: I64f4f596875434bf3e7201ddbbe58924482f4559 va offset pretty #1 Change-Id: Ibb6d3b351bfd915d4bfc2587c5f5c47d129de360 va pretty #2 Change-Id: I8bd2cb9dbe449324be64d8514593815c0ca24c0b makeu Change-Id: I13ccc55a6f5c0438236490bb1e75f93a0e20fe2e xx mergeme Change-Id: Id8edf31fe1bf72a2f254e634edc7c12b3bba8833 --- M Transceiver52M/grgsm_vitac/constants.h M Transceiver52M/grgsm_vitac/grgsm_vitac.cpp M Transceiver52M/grgsm_vitac/grgsm_vitac.h M Transceiver52M/ms/ms_rx_lower.cpp M Transceiver52M/ms/ms_upper.cpp 5 files changed, 251 insertions(+), 96 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/28/33928/1 diff --git a/Transceiver52M/grgsm_vitac/constants.h b/Transceiver52M/grgsm_vitac/constants.h index 07f2290..27bf6f4 100644 --- a/Transceiver52M/grgsm_vitac/constants.h +++ b/Transceiver52M/grgsm_vitac/constants.h @@ -38,6 +38,7 @@ #define STEALING_BIT 1 #define N_TRAIN_BITS 26 #define N_SYNC_BITS 64 +#define N_ACCESS_BITS 41 #define USEFUL_BITS 142 //(2*(DATA_BITS+STEALING_BIT) + N_TRAIN_BITS ) #define FCCH_BITS USEFUL_BITS #define BURST_SIZE (USEFUL_BITS+2*TAIL_BITS) @@ -73,6 +74,12 @@ 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1 }; +static const unsigned char ACCESS_BITS [] = { + 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0 +}; + const unsigned FCCH_FRAMES[] = { 0, 10, 20, 30, 40 }; const unsigned SCH_FRAMES[] = { 1, 11, 21, 31, 41 }; diff --git a/Transceiver52M/grgsm_vitac/grgsm_vitac.cpp b/Transceiver52M/grgsm_vitac/grgsm_vitac.cpp index 836c555..e186a38 100644 --- a/Transceiver52M/grgsm_vitac/grgsm_vitac.cpp +++ b/Transceiver52M/grgsm_vitac/grgsm_vitac.cpp @@ -39,13 +39,13 @@ #include "viterbi_detector.h" #include "grgsm_vitac.h" -//signalVector mChanResp; +gr_complex d_sync_training_seq[N_ACCESS_BITS]; ///<encoded training sequence of a SCH burst gr_complex d_sch_training_seq[N_SYNC_BITS]; ///<encoded training sequence of a SCH burst gr_complex d_norm_training_seq[TRAIN_SEQ_NUM][N_TRAIN_BITS]; ///<encoded training sequences of a normal and dummy burst const int d_chan_imp_length = CHAN_IMP_RESP_LENGTH; -void initvita() { - +void initvita() +{ /** * Prepare SCH sequence bits * @@ -53,59 +53,73 @@ * Burst and two guard periods * (one guard period is an arbitrary overlap) */ - gmsk_mapper(SYNC_BITS, N_SYNC_BITS, - d_sch_training_seq, gr_complex(0.0, -1.0)); + gmsk_mapper(SYNC_BITS, N_SYNC_BITS, d_sch_training_seq, gr_complex(0.0, -1.0)); for (auto &i : d_sch_training_seq) i = conj(i); + /* ab */ + gmsk_mapper(ACCESS_BITS, N_ACCESS_BITS, d_sync_training_seq, gr_complex(0.0, -1.0)); + for (auto &i : d_sync_training_seq) + i = conj(i); + /* Prepare bits of training sequences */ for (int i = 0; i < TRAIN_SEQ_NUM; i++) { /** * If first bit of the sequence is 0 * => first symbol is 1, else -1 */ - gr_complex startpoint = train_seq[i][0] == 0 ? - gr_complex(1.0, 0.0) : gr_complex(-1.0, 0.0); - gmsk_mapper(train_seq[i], N_TRAIN_BITS, - d_norm_training_seq[i], startpoint); + gr_complex startpoint = train_seq[i][0] == 0 ? gr_complex(1.0, 0.0) : gr_complex(-1.0, 0.0); + gmsk_mapper(train_seq[i], N_TRAIN_BITS, d_norm_training_seq[i], startpoint); for (auto &i : d_norm_training_seq[i]) i = conj(i); } - } -MULTI_VER_TARGET_ATTR NO_UBSAN -void detect_burst(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary) +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) { std::vector<gr_complex> rhh_temp(CHAN_IMP_RESP_LENGTH * d_OSR); unsigned int stop_states[2] = { 4, 12 }; - gr_complex filtered_burst[BURST_SIZE]; + gr_complex filtered_burst[burst_size]; gr_complex rhh[CHAN_IMP_RESP_LENGTH]; - float output[BURST_SIZE]; - int start_state = 3; - - // if(burst_start < 0 ||burst_start > 10) - // fprintf(stderr, "bo %d\n", burst_start); - - // burst_start = burst_start >= 0 ? burst_start : 0; + float output[burst_size]; + int start_state = ss; autocorrelation(chan_imp_resp, &rhh_temp[0], d_chan_imp_length * d_OSR); for (int ii = 0; ii < d_chan_imp_length; ii++) rhh[ii] = conj(rhh_temp[ii * d_OSR]); - mafi(&input[burst_start], BURST_SIZE, chan_imp_resp, - d_chan_imp_length * d_OSR, filtered_burst); + mafi(&input[burst_start], burst_size, chan_imp_resp, d_chan_imp_length * d_OSR, filtered_burst); - viterbi_detector(filtered_burst, BURST_SIZE, rhh, - start_state, stop_states, 2, output); + viterbi_detector(filtered_burst, burst_size, rhh, start_state, stop_states, 2, output); - for (int i = 0; i < BURST_SIZE; i++) - output_binary[i] = output[i] * -127; // pre flip bits! + for (int i = 0; i < burst_size; i++) + output_binary[i] = (char)(output[i] * -127); // pre flip bits! } -void -gmsk_mapper(const unsigned char* input, - int nitems, gr_complex* gmsk_output, gr_complex start_point) +NO_UBSAN void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, 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_access_burst(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, + 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) +{ + return detect_burst_nb(input, chan_imp_resp, burst_start, output_binary, 3); +} +NO_UBSAN void detect_burst_access_burst(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, + char *output_binary) +{ + return detect_burst_access_burst(input, chan_imp_resp, burst_start, output_binary, 3); +} + +void gmsk_mapper(const unsigned char *input, int nitems, gr_complex *gmsk_output, gr_complex start_point) { gr_complex j = gr_complex(0.0, 1.0); gmsk_output[0] = start_point; @@ -122,16 +136,13 @@ encoded_symbol = current_symbol * previous_symbol; /* And do GMSK mapping */ - gmsk_output[i] = j * gr_complex(encoded_symbol, 0.0) - * gmsk_output[i - 1]; + gmsk_output[i] = j * gr_complex(encoded_symbol, 0.0) * gmsk_output[i - 1]; previous_symbol = current_symbol; } } -gr_complex -correlate_sequence(const gr_complex* sequence, - int length, const gr_complex* input) +gr_complex correlate_sequence(const gr_complex *sequence, int length, const gr_complex *input) { gr_complex result(0.0, 0.0); @@ -142,9 +153,7 @@ } /* Computes autocorrelation for positive arguments */ -inline void -autocorrelation(const gr_complex* input, - gr_complex* out, int nitems) +inline void autocorrelation(const gr_complex *input, gr_complex *out, int nitems) { for (int k = nitems - 1; k >= 0; k--) { out[k] = gr_complex(0, 0); @@ -153,9 +162,7 @@ } } -inline void -mafi(const gr_complex* input, int nitems, - gr_complex* filter, int filter_length, gr_complex* output) +inline void mafi(const gr_complex *input, int nitems, gr_complex *filter, int filter_length, gr_complex *output) { for (int n = 0; n < nitems; n++) { int a = n * d_OSR; @@ -170,66 +177,45 @@ } } -int get_chan_imp_resp(const gr_complex *input, gr_complex *chan_imp_resp, int search_center, int search_start_pos, - int search_stop_pos, gr_complex *tseq, int tseqlen, float *corr_max) +int get_chan_imp_resp(const gr_complex *input, gr_complex *chan_imp_resp, int search_start_pos, int search_stop_pos, + gr_complex *tseq, int tseqlen, float *corr_max) { - std::vector<gr_complex> correlation_buffer; + const int num_search_windows = search_stop_pos - search_start_pos; + const int power_search_window_len = d_chan_imp_length * d_OSR; std::vector<float> window_energy_buffer; std::vector<float> power_buffer; + std::vector<gr_complex> correlation_buffer; - for (int ii = search_start_pos; ii < search_stop_pos; ii++) { - gr_complex correlation = correlate_sequence(tseq, tseqlen, &input[ii]); + power_buffer.reserve(num_search_windows); + correlation_buffer.reserve(num_search_windows); + window_energy_buffer.reserve(num_search_windows); + + for (int ii = 0; ii < num_search_windows; ii++) { + gr_complex correlation = correlate_sequence(tseq, tseqlen, &input[search_start_pos + ii]); correlation_buffer.push_back(correlation); power_buffer.push_back(std::pow(abs(correlation), 2)); } - int strongest_corr_nr = max_element(power_buffer.begin(), power_buffer.end()) - power_buffer.begin(); - /* Compute window energies */ - auto window_energy_start_offset = strongest_corr_nr - 6 * d_OSR; - window_energy_start_offset = window_energy_start_offset < 0 ? 0 : window_energy_start_offset; //can end up out of range.. - auto window_energy_end_offset = strongest_corr_nr + 6 * d_OSR + d_chan_imp_length * d_OSR; - auto iter = power_buffer.begin() + window_energy_start_offset; - auto iter_end = power_buffer.begin() + window_energy_end_offset; - while (iter != iter_end) { - std::vector<float>::iterator iter_ii = iter; - bool loop_end = false; - float energy = 0; + float windowSum = 0; - int len = d_chan_imp_length * d_OSR; - for (int ii = 0; ii < len; ii++, iter_ii++) { - if (iter_ii == power_buffer.end()) { - loop_end = true; - break; - } + // first window + for (int i = 0; i < power_search_window_len; i++) { + windowSum += power_buffer[i]; + } + window_energy_buffer.push_back(windowSum); - energy += (*iter_ii); - } - - if (loop_end) - break; - - window_energy_buffer.push_back(energy); - iter++; + // slide windows + for (int i = power_search_window_len; i < num_search_windows; i++) { + windowSum += power_buffer[i] - power_buffer[i - power_search_window_len]; + window_energy_buffer.push_back(windowSum); } - /* Calculate the strongest window number */ - int strongest_window_nr = window_energy_start_offset + - max_element(window_energy_buffer.begin(), window_energy_buffer.end()) - + int strongest_window_nr = std::max_element(window_energy_buffer.begin(), window_energy_buffer.end()) - window_energy_buffer.begin(); - // auto window_search_start = window_energy_buffer.begin() + strongest_corr_nr - 5* d_OSR; - // auto window_search_end = window_energy_buffer.begin() + strongest_corr_nr + 10* d_OSR; - // window_search_end = window_search_end >= window_energy_buffer.end() ? window_energy_buffer.end() : window_search_end; - - // /* Calculate the strongest window number */ - // int strongest_window_nr = max_element(window_search_start, window_search_end /* - d_chan_imp_length * d_OSR*/) - window_energy_buffer.begin(); - - // if (strongest_window_nr < 0) - // strongest_window_nr = 0; - float max_correlation = 0; - for (int ii = 0; ii < d_chan_imp_length * d_OSR; ii++) { + for (int ii = 0; ii < power_search_window_len; ii++) { gr_complex correlation = correlation_buffer[strongest_window_nr + ii]; if (abs(correlation) > max_correlation) max_correlation = abs(correlation); @@ -242,7 +228,27 @@ * Compute first sample position, which corresponds * to the first sample of the impulse response */ - return search_start_pos + strongest_window_nr - search_center * d_OSR; + return search_start_pos + strongest_window_nr; +} + +/* +8 ext tail bits +41 sync seq +36 encrypted bits +3 tail bits +68.25 extended tail bits (!) + +center at 8+5 (actually known tb -> known isi, start at 8?) FIXME +*/ +int get_access_imp_resp(const gr_complex *input, gr_complex *chan_imp_resp, float *corr_max, int max_delay) +{ + const int search_center = 8 + 5; + const int search_start_pos = (search_center - 5) * d_OSR + 1; + const int search_stop_pos = (search_center + 5 + d_chan_imp_length + max_delay) * d_OSR; + const auto tseq = &d_sync_training_seq[TRAIN_BEGINNING]; + const auto tseqlen = N_ACCESS_BITS - (2 * TRAIN_BEGINNING); + return get_chan_imp_resp(input, chan_imp_resp, search_start_pos, search_stop_pos, tseq, tseqlen, corr_max) - + search_center * d_OSR; } /* @@ -260,8 +266,8 @@ const int search_stop_pos = (search_center + 5 + d_chan_imp_length) * d_OSR; const auto tseq = &d_norm_training_seq[bcc][TRAIN_BEGINNING]; const auto tseqlen = N_TRAIN_BITS - (2 * TRAIN_BEGINNING); - return get_chan_imp_resp(input, chan_imp_resp, search_center, search_start_pos, search_stop_pos, tseq, tseqlen, - corr_max); + return get_chan_imp_resp(input, chan_imp_resp, search_start_pos, search_stop_pos, tseq, tseqlen, corr_max) - + search_center * d_OSR; } /* @@ -281,8 +287,9 @@ // strongest_window_nr + chan_imp_resp_center + SYNC_POS *d_OSR - 48 * d_OSR - 2 * d_OSR + 2 ; float corr_max; - return get_chan_imp_resp(input, chan_imp_resp, search_center, search_start_pos, search_stop_pos, tseq, tseqlen, - &corr_max); + return get_chan_imp_resp(input, chan_imp_resp, search_start_pos, search_stop_pos, tseq, tseqlen, &corr_max) - + search_center * d_OSR; + ; } int get_sch_buffer_chan_imp_resp(const gr_complex *input, gr_complex *chan_imp_resp, unsigned int len, float *corr_max) @@ -291,9 +298,9 @@ const int search_center = SYNC_POS + TRAIN_BEGINNING; const int search_start_pos = 0; // FIXME: proper end offset - const int search_stop_pos = len - (N_SYNC_BITS*8); + const int search_stop_pos = len - (N_SYNC_BITS * 8); auto tseq = &d_sch_training_seq[TRAIN_BEGINNING]; - return get_chan_imp_resp(input, chan_imp_resp, search_center, search_start_pos, search_stop_pos, tseq, tseqlen, - corr_max); + return get_chan_imp_resp(input, chan_imp_resp, search_start_pos, search_stop_pos, tseq, tseqlen, corr_max) - + search_center * d_OSR; } \ No newline at end of file diff --git a/Transceiver52M/grgsm_vitac/grgsm_vitac.h b/Transceiver52M/grgsm_vitac/grgsm_vitac.h index 2c89d8c..9d4c300 100644 --- a/Transceiver52M/grgsm_vitac/grgsm_vitac.h +++ b/Transceiver52M/grgsm_vitac/grgsm_vitac.h @@ -58,8 +58,13 @@ 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); -MULTI_VER_TARGET_ATTR_CLANGONLY -void detect_burst(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, char *output_binary, int ss); +void detect_burst_access_burst(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_access_burst(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, + 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); inline void autocorrelation(const gr_complex *input, gr_complex *out, int nitems); @@ -67,6 +72,7 @@ int get_sch_chan_imp_resp(const gr_complex *input, gr_complex *chan_imp_resp); int get_norm_chan_imp_resp(const gr_complex *input, gr_complex *chan_imp_resp, float *corr_max, int bcc); int get_sch_buffer_chan_imp_resp(const gr_complex *input, gr_complex *chan_imp_resp, unsigned int len, float *corr_max); +int get_access_imp_resp(const gr_complex *input, gr_complex *chan_imp_resp, float *corr_max, int max_delay); enum class btype { NB, SCH }; struct fdata { diff --git a/Transceiver52M/ms/ms_rx_lower.cpp b/Transceiver52M/ms/ms_rx_lower.cpp index 5a07df5..c2adda3 100644 --- a/Transceiver52M/ms/ms_rx_lower.cpp +++ b/Transceiver52M/ms/ms_rx_lower.cpp @@ -170,7 +170,7 @@ start = start < 39 ? start : 39; start = start > -39 ? start : -39; } - detect_burst(&ss[start], &channel_imp_resp[0], 0, sch_demod_bits); + 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); diff --git a/Transceiver52M/ms/ms_upper.cpp b/Transceiver52M/ms/ms_upper.cpp index 21f70bb..6a83f2a 100644 --- a/Transceiver52M/ms/ms_upper.cpp +++ b/Transceiver52M/ms/ms_upper.cpp @@ -196,7 +196,7 @@ // fprintf(stderr, "%s %d\n", (is_nb ? "N":"D"), burst_time.FN()); // if (is_nb) #endif - detect_burst(ss, &chan_imp_resp[0], normal_burst_start, demodded_softbits); + detect_burst_nb(ss, &chan_imp_resp[0], normal_burst_start, demodded_softbits); #ifdef DBGXX // else // detect_burst(ss, &chan_imp_resp2[0], dummy_burst_start, outbin); -- To view, visit https://gerrit.osmocom.org/c/osmo-trx/+/33928 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-trx Gerrit-Branch: master Gerrit-Change-Id: Id8edf31fe1bf72a2f254e634edc7c12b3bba8833 Gerrit-Change-Number: 33928 Gerrit-PatchSet: 1 Gerrit-Owner: Hoernchen <ewild(a)sysmocom.de> Gerrit-MessageType: newchange
1 0
0 0
[L] Change in osmo-trx[master]: ms/va: add test tool and data
by Hoernchen 25 Jul '23

25 Jul '23
Hoernchen has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-trx/+/33929 ) Change subject: ms/va: add test tool and data ...................................................................... ms/va: add test tool and data Change-Id: Ie38ed4996134e84ad0481872a743299bb442b3db move burstgen Change-Id: Ie2cf3066500062920201c6fa4c2a4286fd5bbcb0 --- M .gitignore M utils/Makefile.am A utils/va-test/burst-gen.cpp A utils/va-test/demodbits_tsc7.s8 A utils/va-test/nb_chunk_tsc7.cfile 5 files changed, 580 insertions(+), 2 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/29/33929/1 diff --git a/.gitignore b/.gitignore index 0b33e0f..02fd7fe 100644 --- a/.gitignore +++ b/.gitignore @@ -83,6 +83,7 @@ !contrib/osmo-trx.spec.in utils/osmo-prbs-tool +utils/burst-gen /.qtc_clangd/* /.cache/* /.vscode/* diff --git a/utils/Makefile.am b/utils/Makefile.am index bac9a7f..4a0cfb3 100644 --- a/utils/Makefile.am +++ b/utils/Makefile.am @@ -1,5 +1,7 @@ -AM_CPPFLAGS = $(LIBOSMOCODING_CFLAGS) -AM_CFLAGS = -Wall +include $(top_srcdir)/Makefile.common +AM_CPPFLAGS = -Wall $(STD_DEFINES_AND_INCLUDES) -I${srcdir}/../Transceiver52M/arch/common -I${srcdir}/../Transceiver52M/device/common -I${srcdir}/../Transceiver52M +AM_CXXFLAGS = -lpthread $(LIBOSMOCODING_CFLAGS) +AM_CFLAGS = -lpthread $(LIBOSMOCODING_CFLAGS) -Wall EXTRA_DIST = clockdump.sh matlab @@ -7,3 +9,13 @@ osmo_prbs_tool_SOURCES = prbs-tool.c osmo_prbs_tool_LDADD = $(LIBOSMOCODING_LIBS) + +noinst_PROGRAMS += burst-gen + +burst_gen_SOURCES = va-test/burst-gen.cpp ${srcdir}/../Transceiver52M/grgsm_vitac/grgsm_vitac.cpp ${srcdir}/../Transceiver52M/grgsm_vitac/viterbi_detector.cc +burst_gen_LDADD = \ + ${srcdir}/../Transceiver52M/libtransceiver_common.la \ + $(ARCH_LA) \ + $(GSM_LA) \ + $(COMMON_LA) +burst_gen_CPPFLAGS = $(AM_CPPFLAGS) $(UHD_CFLAGS) diff --git a/utils/va-test/burst-gen.cpp b/utils/va-test/burst-gen.cpp new file mode 100644 index 0000000..68cda2b --- /dev/null +++ b/utils/va-test/burst-gen.cpp @@ -0,0 +1,552 @@ +/* + * (C) 2023 by sysmocom s.f.m.c. GmbH <info(a)sysmocom.de> + * All Rights Reserved + * + * Author: Eric Wild <ewild(a)sysmocom.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include "sigProcLib.h" + +extern "C" { +#include "convert.h" +#include <convolve.h> +} + +#define _CRT_SECURE_NO_WARNINGS +#include <iterator> +#include <filesystem> +//#include <complex> +#include <algorithm> +#include <string.h> +#include <iomanip> +#include <numeric> +#include <vector> +#include <memory> +#include <iostream> +#include <fstream> + +#include <random> + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <grgsm_vitac/grgsm_vitac.h> + +#define DO_RACH + +const int SAMPLE_SCALE_FACTOR = 1; + +template <typename DST_T, typename SRC_T, typename ST> +void convert_and_scale(void *dst, void *src, unsigned int src_len, ST scale) +{ + for (unsigned int i = 0; i < src_len; i++) + reinterpret_cast<DST_T *>(dst)[i] = static_cast<DST_T>((reinterpret_cast<SRC_T *>(src)[i]) * scale); +} +template <typename DST_T, typename SRC_T> +void convert_and_scale_default(void *dst, void *src, unsigned int src_len) +{ + return convert_and_scale<DST_T, SRC_T>(dst, src, src_len, SAMPLE_SCALE_FACTOR); +} + +static const unsigned int txFullScale = (float)(1 << 14) - 1; +static const unsigned int rxFullScale = (float)(1 << 14) - 1; + +static const BitVector + gRACHBurstx("0011101001001011011111111001100110101010001111000110111101111110000111001001010110011000"); + +static const BitVector gTrainingSequencex[] = { + BitVector("00100101110000100010010111"), BitVector("00101101110111100010110111"), + BitVector("01000011101110100100001110"), BitVector("01000111101101000100011110"), + BitVector("00011010111001000001101011"), BitVector("01001110101100000100111010"), + BitVector("10100111110110001010011111"), BitVector("11101111000100101110111100"), +}; + +struct mrv { + std::vector<char> bits; + signalVector *rvbuf; + std::unique_ptr<std::vector<std::complex<float>>> convolved; + // mrv(): bits(), demod_bits() {} + CorrType ct; +}; + +static mrv genRandNormalBurstx(int tsc, int sps, int tn) +{ + mrv retstruct; + int i = 0; + BitVector bits(148); + + /* Tail bits */ + for (; i < 3; i++) + bits[i] = 0; + + /* Random bits */ + for (int j = 0; i < 60; i++, j++) + bits[i] = rand() % 2; + + /* Stealing bit */ + bits[i++] = 0; + + /* Training sequence */ + for (int n = 0; i < 87; i++, n++) + bits[i] = gTrainingSequencex[tsc][n]; + + /* Stealing bit */ + bits[i++] = 0; + + /* Random bits */ + for (; i < 145; i++) + bits[i] = rand() % 2; + + /* Tail bits */ + for (; i < 148; i++) + bits[i] = 0; + + int guard = 8 + !(tn % 4); + auto r = modulateBurst(bits, guard, sps); + + retstruct.rvbuf = r; + for (size_t i = 0; i < bits.size(); i++) + retstruct.bits.push_back(bits.bit(i) ? 1 : 0); + return retstruct; +} + +static mrv genRandAccessBurstx(int delay, int sps, int tn) +{ + mrv retstruct; + int i = 0; + BitVector bits(88 + delay); + + /* delay */ + for (; i < delay; i++) + bits[i] = 0; + + /* head and synch bits */ + for (int n = 0; i < 49 + delay; i++, n++) + bits[i] = gRACHBurstx[n]; + + /* Random bits */ + for (int j = 0; i < 85 + delay; i++, j++) + bits[i] = rand() % 2; + + for (; i < 88 + delay; i++) + bits[i] = 0; + + int guard = 68 - delay + !(tn % 4); + auto r = modulateBurst(bits, guard, sps); + + retstruct.rvbuf = r; + for (size_t i = 0; i < bits.size(); i++) + retstruct.bits.push_back(bits.bit(i) ? 1 : 0); + return retstruct; +} + +extern gr_complex d_sync_training_seq[N_ACCESS_BITS]; ///<encoded training sequence of a SCH burst +extern gr_complex d_sch_training_seq[N_SYNC_BITS]; ///<encoded training sequence of a SCH burst +extern gr_complex d_norm_training_seq[TRAIN_SEQ_NUM] + [N_TRAIN_BITS]; ///<encoded training sequences of a normal and dummy burst + +void sv_write_helper(signalVector *burst, std::string fname) +{ + auto start = burst->begin(); + auto n = burst->bytes(); + char *data = reinterpret_cast<char *>(start); + + const int len_in_real = burst->size() * 2; + auto cvrtbuf_tx_a = new int16_t[len_in_real]; + convert_float_short(cvrtbuf_tx_a, (float *)burst->begin(), float(txFullScale), len_in_real); + + std::ofstream fout; + fout.open(fname + ".cfile", std::ios::binary | std::ios::out); + fout.write(data, n); + fout.close(); + + fout.open(fname + ".cs16", std::ios::binary | std::ios::out); + fout.write((char *)cvrtbuf_tx_a, len_in_real * sizeof(uint16_t)); + fout.close(); + delete[] cvrtbuf_tx_a; +} + +// borrowed from a real world burst.. +static std::vector<std::complex<float>> chan_im_resp = { + { 4.1588e-05 + -0.000361925i }, { 0.000112728 + -0.000289796i }, { 0.000162952 + -0.000169028i }, + { 0.000174185 + -2.54575e-05i }, { 0.000142947 + 0.000105992i }, { 8.65919e-05 + 0.000187041i }, + { 4.15799e-05 + 0.000184346i }, { 5.30207e-05 + 7.84921e-05i }, { 0.000158877 + -0.000128058i }, + { 0.000373956 + -0.000407954i }, { 0.000680606 + -0.000712065i }, { 0.00102929 + -0.000979604i }, + { 0.00135049 + -0.00115333i }, { 0.00157434 + -0.0011948i }, { 0.00165098 + -0.00109534i }, + { 0.00156519 + -0.000878794i }, { 0.0013399 + -0.000594285i }, { 0.00102788 + -0.00030189i }, + { 0.000694684 + -5.58912e-05i }, { 0.000399328 + 0.000109463i } +}; + +// as above, downsampled to 1sps + just magnitude +static std::vector<float> chan_im_resp_trunc = { 1., 0.20513351, 0.10020305, 0.11490235 }; + +template <typename A, typename B> +auto conv(const std::vector<A> &a, const std::vector<B> &b) -> std::unique_ptr<std::vector<A>> +{ + int data_len = a.size(); + int conv_len = b.size(); + int conv_size = conv_len + data_len - 1; + auto retv = std::make_unique<std::vector<A>>(conv_size); + + for (int i = 0; i < data_len; ++i) { + for (int j = 0; j < conv_len; ++j) { + (*retv)[i + j] += a[i] * b[j]; + } + } + return retv; +} + +template <typename A> +static auto conv(const A *a, int len, std::vector<float> &b) +{ + std::vector<A> aa(len); + std::copy_n(a, len, aa.begin()); + std::reverse(b.begin(), b.end()); + return conv(aa, b); +} +template <typename A> +static auto conv(const A *a, int len, std::vector<A> &b) +{ + std::vector<A> aa(len); + std::copy_n(a, len, aa.begin()); + std::reverse(b.begin(), b.end()); + return conv(aa, b); +} + +// signalvector is owning despite claiming not to, but we can pretend, too.. +static void dummy_free(void *wData){}; +static void *dummy_alloc(size_t newSize) +{ + return 0; +}; + +template <typename T> +size_t read_from_file(std::string path, std::vector<T> &outvec) +{ + std::ifstream infile; + infile.open(path, std::ios::in | std::ios::binary); + if (infile.fail()) { + std::cout << " not found: " << path << std::endl; + exit(0); + } + infile.seekg(0, std::ios_base::end); + size_t fsize = infile.tellg(); + auto fsize_in_T = fsize / sizeof(T); + infile.seekg(0, std::ios_base::beg); + + outvec.resize(fsize_in_T); + infile.read(reinterpret_cast<char *>(&outvec[0]), fsize); + infile.close(); + std::cout << "Read " << fsize << " from " << path << std::endl; + return fsize; +} +void demod_real_burst(int num = 0) +{ + auto path = "./nb_chunk_tsc7.cfile"; + auto bitfile = "./demodbits_tsc7.s8"; + + std::vector<std::complex<float>> burstdata; + std::vector<char> bitdata; + read_from_file(path, burstdata); + read_from_file(bitfile, bitdata); + + // print "known good" burst bits + std::cerr << "known bits:" << std::endl; + std::cerr << std::setw(5) << 0 << " - "; + for (auto i : bitdata) + std::cout << (i > 0 ? "1" : "0"); + std::cerr << std::endl; + std::cerr << "demod tests sigproclib:" << std::endl; + + auto ct = CorrType::TSC; + auto delay = 0; + auto tsc = 7; + int offset = 0; + auto cplx = reinterpret_cast<complex *>(&burstdata[offset]); + auto stdcplx = reinterpret_cast<std::complex<float> *>(&burstdata[offset]); + signalVector sv(&cplx[0], 0, burstdata.size() - offset, dummy_alloc, dummy_free); + + struct estim_burst_params ebp; + auto rc = detectAnyBurst(sv, tsc, BURST_THRESH, 4, ct, 40, &ebp); + auto rxBurst = demodAnyBurst(sv, (CorrType)rc, 4, &ebp); + + // print osmotrx sigproclib demod result + std::cerr << std::setw(5) << int(ebp.toa) << " o "; + for (size_t i = 0 + delay; i < 148 + delay; i++) + std::cout << (rxBurst->bit(i) ? "1" : "0"); + std::cerr << std::endl; + + 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]; + + // demod at known offset + { + auto inp = &stdcplx[29]; // known offset + auto normal_burst_startX = get_norm_chan_imp_resp(inp, &chan_imp_resp[0], &ncmax, tsc); + detect_burst_nb(inp, &chan_imp_resp[0], normal_burst_startX, demodded_softbits); + + std::cerr << std::setw(3) << normal_burst_startX << " v "; + for (size_t i = 0; i < 148; i++) + std::cerr << (demodded_softbits[i] < 0 ? "1" : "0"); + std::cerr << std::endl; + } + { + std::cerr << "-- va start offset loop --" << std::endl; + std::cerr << "offset/det offset/#errors/known^demod bits" << std::endl; + for (int i = 0; i < 34; i++) { + auto inp = &stdcplx[i]; + auto conved_beg = inp; + + auto me = get_norm_chan_imp_resp(conved_beg, &chan_imp_resp[0], &ncmax, tsc); + detect_burst_nb(conved_beg, &chan_imp_resp[0], me, demodded_softbits); + auto bitdiffarr = std::make_unique<char[]>(148); + for (size_t i = 0; i < 148; i++) + bitdiffarr.get()[i] = (demodded_softbits[i] < 0 ? 1 : 0) ^ (bitdata[i] > 0 ? 1 : 0); + auto ber = std::accumulate(bitdiffarr.get(), bitdiffarr.get() + 148, 0); + + std::cerr << std::setw(3) << i << ": " << std::setw(3) << me << " v " << std::setw(3) << ber + << " "; + for (size_t i = 0; i < 148; i++) + std::cerr << (bitdiffarr[i] ? "1" : "0"); + std::cerr << std::endl; + // std::cerr << std::setw(4) << i << " (" << std::setw(4) << 29 - i << "):" << std::setw(4) << org + // << " " << std::setw(4) << me << " y " << std::endl; + } + } +} + +auto gen_burst(CorrType t, int delay, int tsc) +{ + mrv rs; + if (t == CorrType::RACH) { + rs = genRandAccessBurstx(delay, 4, tsc); + + } else if (t == CorrType::TSC) { + rs = genRandNormalBurstx(tsc, 4, 0); + } else { + std::cerr << "wtf?" << std::endl; + exit(0); + } + rs.ct = t; + + signalVector *burst = rs.rvbuf; + // sv_write_helper(burst, std::to_string(num)); + // scaleVector(*burst, {1, 0}); + const int len_in_real = burst->size() * 2; + auto cvrtbuf_tx_a = std::make_unique<short[]>(len_in_real); + auto cvrtbuf_rx_a = std::make_unique<float[]>(len_in_real); + auto rx_cfloat = reinterpret_cast<std::complex<float> *>(&cvrtbuf_rx_a[0]); + + convert_float_short(cvrtbuf_tx_a.get(), (float *)burst->begin(), float(txFullScale), len_in_real); + convert_short_float(cvrtbuf_rx_a.get(), cvrtbuf_tx_a.get(), len_in_real); + for (int i = 0; i < len_in_real; i++) // scale properly! + cvrtbuf_rx_a[i] *= 1. / txFullScale; + auto conved = conv(rx_cfloat, burst->size(), chan_im_resp); + + std::cerr << "-- generated " << (t == CorrType::RACH ? "RACH" : "TSC") << " burst --" << std::endl; + for (size_t i = 0; i < rs.bits.size(); i++) + std::cerr << (rs.bits[i] ? "1" : "0"); + std::cerr << std::endl; + delete burst; + rs.convolved = std::move(conved); + return rs; +} + +void demod_generated_burst(CorrType t) +{ + int tsc = 0; + int delay = 0; + auto rs = gen_burst(t, delay, tsc); + auto conved_beg = &(*rs.convolved)[0]; + + if (rs.ct == CorrType::RACH) { + std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR]; + float ncmax; + 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); + for (int j = 0; j < 4; j++) { + for (int start_val = 0; start_val < 16; start_val++) { + auto bitdiffarr = std::make_unique<char[]>(rs.bits.size()); + detect_burst_access_burst(conved_beg, &chan_imp_resp[0], normal_burst_start + j, + demodded_softbits, start_val); + + for (size_t i = 0; i < rs.bits.size(); i++) + bitdiffarr.get()[i] = (demodded_softbits[i] < 0 ? 1 : 0) ^ rs.bits[i]; + auto ber = std::accumulate(bitdiffarr.get(), bitdiffarr.get() + rs.bits.size(), 0); + + std::cerr << "ber " << std::setw(4) << ber << " bo:" << std::setw(4) << j + << " vas:" << std::setw(4) << start_val << " "; + // for (size_t i = 0; i < rs.num_bits; i++) + // std::cerr << (demodded_softbits[i] < 0 ? "1" : "0"); + // std::cerr << std::endl; + // std::cerr << "d " << std::setw(4) << ber << " "; + for (size_t i = 0; i < rs.bits.size(); i++) + std::cerr << (bitdiffarr.get()[i] ? "1" : "0"); + std::cerr << std::endl; + + // std::cerr << "v " << std::setw(4) << j << std::setw(4) << start_val << " "; + // for (size_t i = 0; i < rs.num_bits; i++) + // std::cerr << (demodded_softbits[i] < 0 ? "1" : "0"); + // std::cerr << std::endl; + // std::cerr << "d " << std::setw(4) << ber << " "; + // for (size_t i = 0; i < rs.num_bits; i++) + // std::cerr << (ptr.get()[i] ? "1" : "0"); + // std::cerr << std::endl; + } + } + + } else { + std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR]; + float ncmax; + 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); + std::cerr << "toa " << std::setprecision(2) << normal_burst_start << std::endl; + + std::cerr << "vita "; + for (size_t i = 0; i < rs.bits.size(); i++) + std::cerr << (demodded_softbits[i] < 0 ? "1" : "0"); + std::cerr << std::endl; + std::cerr << "diff "; + for (size_t i = 0; i < rs.bits.size(); i++) + std::cerr << ((demodded_softbits[i] < 0 ? 1 : 0) ^ rs.bits[i] ? "1" : "0"); + std::cerr << std::endl; + } + + struct estim_burst_params ebp; + /* + nb: 3 + 58 + 26 + 58 + 3 + 8.25 + nb runsum: 3 | 61 | 87 | .. + nb tsc: 61 - 87 + tsc 5 off: 66 - 82 = tsc 16 midamble (26-5-5) + tsc center: + + max_toa = 40; + target = 3 + 58 + 16 + 5; // 82 = end of tsc - 5 + head = 6; + tail = 6 + max_toa; // 46 + + start = target - head - 1; //75 + len = head + tail; //52 + + -> corr ebp: 10.63 - head -> TOA: 4.63 + */ + + 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); + + auto rc = detectAnyBurst(sv, tsc, BURST_THRESH, 4, rs.ct, 40, &ebp); + auto rxBurst = std::unique_ptr<SoftVector>(demodAnyBurst(sv, (CorrType)rc, 4, &ebp)); + + std::cerr << "toa " << std::setprecision(2) << ebp.toa << std::endl; + + for (size_t i = 0; i < delay; i++) // maybe pad rach op? + demodded_softbits[i] = 0; + for (size_t i = 0 + delay; i < rs.bits.size() + delay; i++) + demodded_softbits[i] = (rxBurst->bit(i) ? 1 : 0); + + std::cerr << "sigp "; + for (size_t i = 0; i < rs.bits.size(); i++) + std::cerr << (demodded_softbits[i] ? "1" : "0"); + std::cerr << std::endl; + + std::cerr << "diff "; + for (size_t i = 0; i < rs.bits.size(); i++) + std::cerr << (demodded_softbits[i] ^ rs.bits[i] ? "1" : "0"); + std::cerr << std::endl; +} + +void demod_test_offsets() +{ + const int tsc = 0; + const int delaybuffer_realoffset = 100; + + { + auto rs = gen_burst(CorrType::RACH, 0, tsc); + typeof(*rs.convolved) delay_buffer(rs.convolved->size() * 2); // plenty of space.. + + for (int delay = -10; delay < 60; delay++) { + std::fill(delay_buffer.begin(), delay_buffer.end(), 0); + std::copy(rs.convolved->begin(), rs.convolved->end(), + delay_buffer.begin() + delaybuffer_realoffset + delay); + + auto conved_beg = &delay_buffer[delaybuffer_realoffset]; + + std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR]; + float ncmax; + auto va_burst_start = get_access_imp_resp(conved_beg, &chan_imp_resp[0], &ncmax, 60); + + complex *rx_sigproc_cfloat = reinterpret_cast<complex *>(conved_beg); + struct estim_burst_params ebp; + signalVector sv(rx_sigproc_cfloat, 0, rs.convolved->size(), dummy_alloc, dummy_free); + detectAnyBurst(sv, tsc, BURST_THRESH, 4, rs.ct, 60, &ebp); + std::cerr << "delay:" << std::setw(3) << std::setprecision(2) << delay; + std::cerr << " va: " << std::setw(3) << std::setprecision(2) << va_burst_start; + std::cerr << " sg: " << std::setw(3) << std::setprecision(2) << ebp.toa; + std::cerr << " d: " << std::setw(3) << std::setprecision(2) << (ebp.toa * 4) - va_burst_start; + std::cerr << " ! " << float(va_burst_start + 13) / 4 << std::endl; + } + } + { + auto rs = gen_burst(CorrType::TSC, 0, tsc); + typeof(*rs.convolved) delay_buffer(rs.convolved->size() * 2); // plenty of space.. + + for (int delay = -10; delay < 10; delay++) { + std::fill(delay_buffer.begin(), delay_buffer.end(), 0); + std::copy(rs.convolved->begin(), rs.convolved->end(), + delay_buffer.begin() + delaybuffer_realoffset + delay); + + auto conved_beg = &delay_buffer[delaybuffer_realoffset]; + + std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR]; + float ncmax; + auto va_burst_start = get_norm_chan_imp_resp(conved_beg, &chan_imp_resp[0], &ncmax, tsc); + + complex *rx_sigproc_cfloat = reinterpret_cast<complex *>(conved_beg); + struct estim_burst_params ebp; + signalVector sv(rx_sigproc_cfloat, 0, rs.convolved->size(), dummy_alloc, dummy_free); + detectAnyBurst(sv, tsc, BURST_THRESH, 4, rs.ct, 60, &ebp); + std::cerr << "delay:" << std::setw(3) << std::setprecision(2) << delay; + std::cerr << " va: " << std::setw(3) << std::setprecision(2) << va_burst_start; + std::cerr << " sg: " << std::setw(3) << std::setprecision(2) << ebp.toa; + std::cerr << " d: " << std::setw(3) << std::setprecision(2) << (ebp.toa * 4) - va_burst_start; + std::cerr << " ! " << float(va_burst_start + 19) / 4 << std::endl; + } + } +} + +int main() +{ + convolve_init(); + convert_init(); + sigProcLibSetup(); + initvita(); + + for (int i = 0; i < 1; i++) { + demod_real_burst(i); + demod_generated_burst(CorrType::RACH); + demod_generated_burst(CorrType::TSC); + demod_test_offsets(); + } +} diff --git a/utils/va-test/demodbits_tsc7.s8 b/utils/va-test/demodbits_tsc7.s8 new file mode 100644 index 0000000..c91cd6c --- /dev/null +++ b/utils/va-test/demodbits_tsc7.s8 Binary files differ diff --git a/utils/va-test/nb_chunk_tsc7.cfile b/utils/va-test/nb_chunk_tsc7.cfile new file mode 100644 index 0000000..67e577e --- /dev/null +++ b/utils/va-test/nb_chunk_tsc7.cfile Binary files differ -- To view, visit https://gerrit.osmocom.org/c/osmo-trx/+/33929 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-trx Gerrit-Branch: master Gerrit-Change-Id: Ie2cf3066500062920201c6fa4c2a4286fd5bbcb0 Gerrit-Change-Number: 33929 Gerrit-PatchSet: 1 Gerrit-Owner: Hoernchen <ewild(a)sysmocom.de> Gerrit-MessageType: newchange
1 0
0 0
[M] Change in osmo-trx[master]: transceiver: add experimental viterbi equalizer support
by Hoernchen 25 Jul '23

25 Jul '23
Hoernchen has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-trx/+/33930 ) Change subject: transceiver: add experimental viterbi equalizer support ...................................................................... transceiver: add experimental viterbi equalizer support The VA is already being used by the ms side and is part of the original gsm design. It only works for gmsk, 4sps, and needs a bit of rx burst scaling and burst shifting. Change-Id: I9d7a4ff72e323832a94d885d5714fcde01ceeb3d --- M CommonLibs/config_defs.h M CommonLibs/trx_vty.c M Transceiver52M/Makefile.am M Transceiver52M/Transceiver.cpp M Transceiver52M/osmo-trx.cpp M Transceiver52M/radioInterface.h 6 files changed, 132 insertions(+), 12 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/30/33930/1 diff --git a/CommonLibs/config_defs.h b/CommonLibs/config_defs.h index bf49bcf..07a3981 100644 --- a/CommonLibs/config_defs.h +++ b/CommonLibs/config_defs.h @@ -67,4 +67,5 @@ double ul_gain; double dl_gain; } overrides; + bool use_va; }; diff --git a/CommonLibs/trx_vty.c b/CommonLibs/trx_vty.c index 1878d83..dab1e75 100644 --- a/CommonLibs/trx_vty.c +++ b/CommonLibs/trx_vty.c @@ -339,6 +339,26 @@ return CMD_SUCCESS; } +DEFUN_ATTR(cfg_use_viterbi, cfg_use_viterbi_cmd, + "viterbi-eq (disable|enable)", + "Use viterbi equalizer for gmsk (default=disable)\n" + "Disable VA\n" + "Enable VA\n", + CMD_ATTR_HIDDEN) +{ + struct trx_ctx *trx = trx_from_vty(vty); + + if (strcmp("disable", argv[0]) == 0) { + trx->cfg.use_va = false; + } else if (strcmp("enable", argv[0]) == 0) { + trx->cfg.use_va = true; + } else { + return CMD_WARNING; + } + + return CMD_SUCCESS; +} + DEFUN(cfg_swap_channels, cfg_swap_channels_cmd, "swap-channels (disable|enable)", "Swap primary and secondary channels of the PHY (if any)\n" @@ -700,6 +720,8 @@ vty_out(vty, " dl-gain-override %f%s", trx->cfg.overrides.dl_gain, VTY_NEWLINE); if (trx->cfg.overrides.ul_gain_override) vty_out(vty, " ul-gain-override %f%s", trx->cfg.overrides.ul_gain, VTY_NEWLINE); + if (trx->cfg.use_va) + vty_out(vty, " viterbi-eq %s%s", trx->cfg.use_va ? "enable" : "disable", VTY_NEWLINE); trx_rate_ctr_threshold_write_config(vty, " "); for (i = 0; i < trx->cfg.num_chans; i++) { @@ -869,6 +891,7 @@ install_element(TRX_NODE, &cfg_dl_freq_override_cmd); install_element(TRX_NODE, &cfg_ul_gain_override_cmd); install_element(TRX_NODE, &cfg_dl_gain_override_cmd); + install_element(TRX_NODE, &cfg_use_viterbi_cmd); install_node(&chan_node, dummy_config_write); install_element(CHAN_NODE, &cfg_chan_rx_path_cmd); install_element(CHAN_NODE, &cfg_chan_tx_path_cmd); diff --git a/Transceiver52M/Makefile.am b/Transceiver52M/Makefile.am index f8556f0..e82111e 100644 --- a/Transceiver52M/Makefile.am +++ b/Transceiver52M/Makefile.am @@ -40,7 +40,9 @@ ChannelizerBase.cpp \ Channelizer.cpp \ Synthesis.cpp \ - proto_trxd.c + proto_trxd.c \ + grgsm_vitac/grgsm_vitac.cpp \ + grgsm_vitac/viterbi_detector.cc libtransceiver_common_la_SOURCES = \ $(COMMON_SOURCES) \ diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp index c9894f0..c5110a0 100644 --- a/Transceiver52M/Transceiver.cpp +++ b/Transceiver52M/Transceiver.cpp @@ -29,6 +29,7 @@ #include <fstream> #include "Transceiver.h" #include <Logger.h> +#include <grgsm_vitac/grgsm_vitac.h> extern "C" { #include "osmo_signal.h" @@ -208,6 +209,8 @@ return false; } + initvita(); + mDataSockets.resize(mChans, -1); @@ -614,6 +617,44 @@ return mRadioInterface->rssiOffset(chan) + cfg->rssi_offset; } +static SoftVector *demodAnyBurst_va(const signalVector &burst, CorrType type, int sps, int rach_max_toa, int tsc) +{ + auto conved_beg = reinterpret_cast<const std::complex<float> *>(&burst.begin()[0]); + std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR]; + float ncmax; + char demodded_softbits[148 + 8]; + SoftVector *bits = new SoftVector(148 + 8); + + if (type == CorrType::TSC) { + auto rach_burst_start = get_norm_chan_imp_resp(conved_beg, chan_imp_resp, &ncmax, tsc); + rach_burst_start = std::max(rach_burst_start, 0); + detect_burst_nb(conved_beg, chan_imp_resp, rach_burst_start, demodded_softbits); + } else { + auto normal_burst_start = get_access_imp_resp(conved_beg, chan_imp_resp, &ncmax, 0); + normal_burst_start = std::max(normal_burst_start, 0); + detect_burst_access_burst(conved_beg, chan_imp_resp, normal_burst_start, demodded_softbits, + rach_max_toa); + } + + float *s = &bits->begin()[0]; + for (int i = 0; i < 148; i++) + s[i] = demodded_softbits[i] * -1; + for (int i = 148; i < bits->size(); i++) + s[i] = 0; + return bits; +} + +#define USE_VA + +#ifdef USE_VA +// signalvector is owning despite claiming not to, but we can pretend, too.. +static void dummy_free(void *wData){}; +static void *dummy_alloc(size_t newSize) +{ + return 0; +}; +#endif + /* * Pull bursts from the FIFO and handle according to the slot * and burst correlation type. Equalzation is currently disabled. @@ -634,6 +675,9 @@ TransceiverState *state = &mStates[chan]; bool ctr_changed = false; double rssi_offset; + static complex burst_shift_buffer[625]; + static signalVector shift_vec(burst_shift_buffer, 0, 625, dummy_alloc, dummy_free); + signalVector *shvec_ptr = &shift_vec; /* Blocking FIFO read */ radioVector *radio_burst = mReceiveFIFO[chan]->read(); @@ -713,8 +757,15 @@ max_toa = (type == RACH || type == EXT_RACH) ? mMaxExpectedDelayAB : mMaxExpectedDelayNB; + if (cfg->use_va) { + // shifted burst copy to make the old demod and detection happy + std::copy(burst->begin() + 20, burst->end() - 20, shift_vec.begin()); + } else { + shvec_ptr = burst; + } + /* Detect normal or RACH bursts */ - rc = detectAnyBurst(*burst, mTSC, BURST_THRESH, cfg->rx_sps, type, max_toa, &ebp); + rc = detectAnyBurst(*shvec_ptr, mTSC, BURST_THRESH, cfg->rx_sps, type, max_toa, &ebp); if (rc <= 0) { if (rc == -SIGERR_CLIP) { LOGCHAN(chan, DTRXDUL, INFO) << "Clipping detected on received RACH or Normal Burst"; @@ -728,7 +779,13 @@ goto ret_idle; } - rxBurst = demodAnyBurst(*burst, (CorrType) rc, cfg->rx_sps, &ebp); + if (cfg->use_va) { + scaleVector(*burst, { (1. / (float)((1 << 14) - 1)), 0 }); + rxBurst = demodAnyBurst_va(*burst, (CorrType)rc, cfg->rx_sps, max_toa, mTSC); + } else { + rxBurst = demodAnyBurst(*shvec_ptr, (CorrType)rc, cfg->rx_sps, &ebp); + } + bi->toa = ebp.toa; bi->tsc = ebp.tsc; bi->ci = ebp.ci; diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp index 89a577b..8f5cc85 100644 --- a/Transceiver52M/osmo-trx.cpp +++ b/Transceiver52M/osmo-trx.cpp @@ -77,6 +77,24 @@ static RadioDevice *usrp; static RadioInterface *radio; +/* adjusts read timestamp offset to make the viterbi equalizer happy by including the start tail bits */ +template <typename B> +class rif_va_wrapper : public B { + bool use_va; + + public: + template <typename... Args> + rif_va_wrapper(bool use_va, Args &&...args) : B(std::forward<Args>(args)...), use_va(use_va) + { + } + bool start() override + { + auto rv = B::start(); + B::readTimestamp -= use_va ? 20 : 0; + return rv; + }; +}; + /* Create radio interface * The interface consists of sample rate changes, frequency shifts, * channel multiplexing, and other conversions. The transceiver core @@ -91,17 +109,17 @@ switch (type) { case RadioDevice::NORMAL: - radio = new RadioInterface(usrp, trx->cfg.tx_sps, - trx->cfg.rx_sps, trx->cfg.num_chans); + radio = new rif_va_wrapper<RadioInterface>(trx->cfg.use_va, usrp, trx->cfg.tx_sps, trx->cfg.rx_sps, + trx->cfg.num_chans); break; case RadioDevice::RESAMP_64M: case RadioDevice::RESAMP_100M: - radio = new RadioInterfaceResamp(usrp, trx->cfg.tx_sps, - trx->cfg.rx_sps); + radio = new rif_va_wrapper<RadioInterfaceResamp>(trx->cfg.use_va, usrp, trx->cfg.tx_sps, + trx->cfg.rx_sps); break; case RadioDevice::MULTI_ARFCN: - radio = new RadioInterfaceMulti(usrp, trx->cfg.tx_sps, - trx->cfg.rx_sps, trx->cfg.num_chans); + radio = new rif_va_wrapper<RadioInterfaceMulti>(trx->cfg.use_va, usrp, trx->cfg.tx_sps, trx->cfg.rx_sps, + trx->cfg.num_chans); break; default: LOG(ALERT) << "Unsupported radio interface configuration"; @@ -465,6 +483,12 @@ return -1; } + if (trx->cfg.use_va && + (trx->cfg.egprs || trx->cfg.multi_arfcn || trx->cfg.tx_sps != 4 || trx->cfg.rx_sps != 4)) { + LOG(ERROR) << "Viterbi equalizer only works for gmsk with 4 tx/rx samples per symbol!"; + return -1; + } + return 0; } diff --git a/Transceiver52M/radioInterface.h b/Transceiver52M/radioInterface.h index cd40ddf..b05af78 100644 --- a/Transceiver52M/radioInterface.h +++ b/Transceiver52M/radioInterface.h @@ -75,7 +75,7 @@ public: /** start the interface */ - bool start(); + virtual bool start(); bool stop(); /** initialization */ @@ -151,7 +151,7 @@ public: RadioInterfaceResamp(RadioDevice* wDevice, size_t tx_sps, size_t rx_sps); - ~RadioInterfaceResamp(); + virtual ~RadioInterfaceResamp(); bool init(int type); void close(); @@ -184,7 +184,7 @@ public: RadioInterfaceMulti(RadioDevice* radio, size_t tx_sps, size_t rx_sps, size_t chans = 1); - ~RadioInterfaceMulti(); + virtual ~RadioInterfaceMulti(); bool init(int type); void close(); -- To view, visit https://gerrit.osmocom.org/c/osmo-trx/+/33930 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-trx Gerrit-Branch: master Gerrit-Change-Id: I9d7a4ff72e323832a94d885d5714fcde01ceeb3d Gerrit-Change-Number: 33930 Gerrit-PatchSet: 1 Gerrit-Owner: Hoernchen <ewild(a)sysmocom.de> Gerrit-MessageType: newchange
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • ...
  • 306
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.