diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2013-02-27 11:46:27 +0100 |
---|---|---|
committer | Steve Markgraf <steve@steve-m.de> | 2021-10-23 18:51:19 +0200 |
commit | 5f71fbcb706388a64a167265f0cf249cbf0a708b (patch) | |
tree | 015c96baa522b29d6e3145d42480eece43c046f9 | |
parent | af8b7571db59fe3a5eb1896e84cca3fe5763d583 (diff) |
Always forward the strongest received access burst of one multiframe
Instead of forwarding access bursts that are above some average noise
floor, the strongest of burst of a multiframe is always forwarded, no
matter how weak it is.
Since bandwidth of serial interface is limited, it is not possible to
forward all received access bursts. If there are suddenly many access
bursts or if a temporary noise causes detection of several bursts, only
the strongest of them is forwarded. This prevents overflow of serial
interface.
Detection of bursts is possible, no matter how weak they are. Tests have
shown that detection works up to 100%, even at border of BTS coverage.
-rw-r--r-- | src/target/firmware/layer1/prim_bts.c | 57 |
1 files changed, 36 insertions, 21 deletions
diff --git a/src/target/firmware/layer1/prim_bts.c b/src/target/firmware/layer1/prim_bts.c index fd35f81e..36ae53b1 100644 --- a/src/target/firmware/layer1/prim_bts.c +++ b/src/target/firmware/layer1/prim_bts.c @@ -135,39 +135,54 @@ l1s_bts_resp(uint8_t p1, uint8_t p2, uint16_t p3) /* Access Burst ? */ if (db->rx[0].cmd == DSP_EXT_RX_CMD_AB) { - static int energy_avg = 0x8000; + static struct l1ctl_bts_burst_ab_ind _bi[51]; + static int energy[51]; + struct l1ctl_bts_burst_ab_ind *bi = &_bi[rx_time.t3]; + int i, j; + uint16_t *iq = &db->data[32]; - if (db->rx[0].data > (energy_avg << 1)) - { + energy[rx_time.t3] = 0; + + /* Frame number */ + bi->fn = htonl(rx_time.fn); + + /* Data (cut to 8 bits */ + bi->toa = db->rx[1].cmd; + if (bi->toa > 68) + goto exit; + for (i=0,j=(db->rx[1].cmd)<<1; i<2*88; i++,j++) + bi->iq[i] = iq[j] >> 8; + + /* energy */ + energy[rx_time.t3] = db->rx[0].data; + + if (rx_time.t3 == 46) { struct msgb *msg; - struct l1ctl_bts_burst_ab_ind *bi; - uint16_t *iq = &db->data[32]; - int i, j; + int energy_max = 0, energy_avg = 0; + + /* find strongest burst */ + j = 0; + for (i = 0; i < 51; i++) { + energy_avg += energy[i]; + if (energy[i] > energy_max) { + energy_max = energy[i]; + j = i; + } + energy[i] = 0; + } - printf("### RACH ### (%04x %04x - %04x)\n", - db->rx[0].data, energy_avg, db->rx[1].cmd); + printf("### RACH ### (%04x %04x)\n", energy_max, energy_avg); /* Create message */ msg = l1ctl_msgb_alloc(L1CTL_BTS_BURST_AB_IND); if (!msg) goto exit; - bi = (struct l1ctl_bts_burst_ab_ind *) msgb_put(msg, sizeof(*bi)); - - /* Frame number */ - bi->fn = htonl(rx_time.fn); - - /* Data (cut to 8 bits */ - bi->toa = db->rx[1].cmd; - if (bi->toa > 68) - goto exit; - for (i=0,j=(db->rx[1].cmd)<<1; i<2*88; i++,j++) - bi->iq[i] = iq[j] >> 8; + memcpy(msgb_put(msg, sizeof(*bi)), &_bi[j], sizeof(*bi)); /* Send it ! */ l1_queue_for_l2(msg); - } else - energy_avg = ((energy_avg * 7) + db->rx[0].data) >> 3; + } } /* Normal Burst ? */ |