This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
fixeria gerrit-no-reply at lists.osmocom.orgHello tnt, I'd like you to do a code review. Please visit https://gerrit.osmocom.org/c/osmo-trx/+/22714 to review the following change. Change subject: sigProcLib: fix C/I computation for 8-PSK modulated bursts ...................................................................... sigProcLib: fix C/I computation for 8-PSK modulated bursts Change-Id: I860af60bc0fbd36dfb38316fad65ddd3a5827a8f Related: Ib4ceec553f2e5f77bf3f6777724968456a180f5e Related: OS#4006, OS#4373 --- M Transceiver52M/Transceiver.cpp M Transceiver52M/sigProcLib.cpp M Transceiver52M/sigProcLib.h 3 files changed, 38 insertions(+), 17 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/14/22714/1 diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp index 6de266c..0a1ba6f 100644 --- a/Transceiver52M/Transceiver.cpp +++ b/Transceiver52M/Transceiver.cpp @@ -734,11 +734,10 @@ goto ret_idle; } - type = (CorrType) rc; + rxBurst = demodAnyBurst(*burst, (CorrType) rc, cfg->rx_sps, &ebp); bi->toa = ebp.toa; bi->tsc = ebp.tsc; bi->ci = ebp.ci; - rxBurst = demodAnyBurst(*burst, cfg->rx_sps, ebp.amp, ebp.toa, type); /* EDGE demodulator returns 444 (gSlotLen * 3) bits */ if (rxBurst->size() == EDGE_BURST_NBITS) { diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp index 04f7e30..b7c41ba 100644 --- a/Transceiver52M/sigProcLib.cpp +++ b/Transceiver52M/sigProcLib.cpp @@ -1792,15 +1792,15 @@ * stages. */ static signalVector *demodCommon(const signalVector &burst, int sps, - complex chan, float toa) + const struct estim_burst_params *ebp) { signalVector *delay, *dec; if ((sps != 1) && (sps != 4)) return NULL; - delay = delayVector(&burst, NULL, -toa * (float) sps); - scaleVector(*delay, (complex) 1.0 / chan); + delay = delayVector(&burst, NULL, -ebp->toa * (float) sps); + scaleVector(*delay, (complex) 1.0 / ebp->amp); if (sps == 1) return delay; @@ -1816,13 +1816,13 @@ * 4 SPS (if activated) to minimize distortion through the fractional * delay filters. Symbol rotation and after always operates at 1 SPS. */ -static SoftVector *demodGmskBurst(const signalVector &rxBurst, - int sps, complex channel, float TOA) +static SoftVector *demodGmskBurst(const signalVector &rxBurst, int sps, + const struct estim_burst_params *ebp) { SoftVector *bits; signalVector *dec; - dec = demodCommon(rxBurst, sps, channel, TOA); + dec = demodCommon(rxBurst, sps, ebp); if (!dec) return NULL; @@ -1835,6 +1835,27 @@ return bits; } +static float computeEdgeCI(const signalVector *rot) +{ + float err_pwr = 0.0f; + float step = 2.0f * M_PI_F / 8.0f; + + for (size_t i = 8; i < rot->size() - 8; i++) { + /* Compute the ideal symbol */ + complex sym = (*rot)[i]; + float phase = step * roundf(sym.arg() / step); + complex ideal = complex(cos(phase), sin(phase)); + + /* Compute the error vector */ + complex err = ideal - sym; + + /* Accumulate power */ + err_pwr += err.norm2(); + } + + return 3.0103f * log2f(1.0f * (rot->size() - 16) / err_pwr); +} + /* * Demodulate an 8-PSK burst. Prior to symbol rotation, operate at * 4 SPS (if activated) to minimize distortion through the fractional @@ -1845,19 +1866,20 @@ * through the fractional delay filters at 1 SPS renders signal * nearly unrecoverable. */ -static SoftVector *demodEdgeBurst(const signalVector &burst, - int sps, complex chan, float toa) +static SoftVector *demodEdgeBurst(const signalVector &burst, int sps, + struct estim_burst_params *ebp) { SoftVector *bits; signalVector *dec, *rot, *eq; - dec = demodCommon(burst, sps, chan, toa); + dec = demodCommon(burst, sps, ebp); if (!dec) return NULL; /* Equalize and derotate */ eq = convolve(dec, GSMPulse4->c0_inv, NULL, NO_DELAY); rot = derotateEdgeBurst(*eq, 1); + ebp->ci = computeEdgeCI(rot); /* Soft slice and normalize */ bits = softSliceEdgeBurst(*rot); @@ -1869,13 +1891,13 @@ return bits; } -SoftVector *demodAnyBurst(const signalVector &burst, int sps, complex amp, - float toa, CorrType type) +SoftVector *demodAnyBurst(const signalVector &burst, CorrType type, + int sps, struct estim_burst_params *ebp) { if (type == EDGE) - return demodEdgeBurst(burst, sps, amp, toa); + return demodEdgeBurst(burst, sps, ebp); else - return demodGmskBurst(burst, sps, amp, toa); + return demodGmskBurst(burst, sps, ebp); } bool sigProcLibSetup() diff --git a/Transceiver52M/sigProcLib.h b/Transceiver52M/sigProcLib.h index dd03190..0c3c7c6 100644 --- a/Transceiver52M/sigProcLib.h +++ b/Transceiver52M/sigProcLib.h @@ -134,7 +134,7 @@ struct estim_burst_params *ebp); /** Demodulate burst basde on type and output soft bits */ -SoftVector *demodAnyBurst(const signalVector &burst, int sps, - complex amp, float toa, CorrType type); +SoftVector *demodAnyBurst(const signalVector &burst, CorrType type, + int sps, struct estim_burst_params *ebp); #endif /* SIGPROCLIB_H */ -- To view, visit https://gerrit.osmocom.org/c/osmo-trx/+/22714 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-trx Gerrit-Branch: master Gerrit-Change-Id: I860af60bc0fbd36dfb38316fad65ddd3a5827a8f Gerrit-Change-Number: 22714 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy at sysmocom.de> Gerrit-Reviewer: tnt <tnt at 246tNt.com> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210204/d3250618/attachment.htm>