diff options
Diffstat (limited to 'gsm-tvoid/src/lib/gsm_burst.cc')
-rwxr-xr-x | gsm-tvoid/src/lib/gsm_burst.cc | 74 |
1 files changed, 66 insertions, 8 deletions
diff --git a/gsm-tvoid/src/lib/gsm_burst.cc b/gsm-tvoid/src/lib/gsm_burst.cc index b862d69..14950c6 100755 --- a/gsm-tvoid/src/lib/gsm_burst.cc +++ b/gsm-tvoid/src/lib/gsm_burst.cc @@ -13,12 +13,15 @@ #include "gsmstack.h" -gsm_burst::gsm_burst () : +gsm_burst::gsm_burst (gr_feval_ll *t) : + p_tuner(t), d_clock_options(DEFAULT_CLK_OPTS), d_print_options(0), d_equalizer_type(EQ_FIXED_DFE) { +// fprintf(stderr,"gsm_burst: enter constructor (t=%8.8x)\n",(unsigned int)t); + // M_PI = M_PI; //4.0 * atan(1.0); full_reset(); @@ -348,14 +351,15 @@ void gsm_burst::shift_burst(int shift_bits) //of the mean phase from pi/2. void gsm_burst::calc_freq_offset(void) { - int start = d_burst_start + 10; - int end = d_burst_start + USEFUL_BITS - 10; + const int padding = 20; + int start = d_burst_start + padding; + int end = d_burst_start + USEFUL_BITS - padding; float sum = 0.0; for (int j = start; j <= end; j++) { sum += d_burst_buffer[j]; } - float mean = sum / ((float)USEFUL_BITS - 20.0); + float mean = sum / ((float)USEFUL_BITS - (2.0 * (float)padding) ); float p_off = mean - (M_PI / 2); d_freq_offset = p_off * 1625000.0 / (12.0 * M_PI); @@ -466,7 +470,8 @@ float gsm_burst::correlate_pattern(const float *pattern,const int pat_size,const corr = 0.0; for (int i = 1; i < pat_size; i++) { //Start a 1 to skip first bit due to diff encoding //d_corr[j+distance] += d_burst_buffer[center+i+j] * pattern[i]; - corr += SIGNUM(d_burst_buffer[center+i+j]) * pattern[i]; //binary corr/sliced + //corr += SIGNUM(d_burst_buffer[center+i+j]) * pattern[i]; //binary corr/sliced + corr += d_burst_buffer[center+i+j] * pattern[i]; } corr /= pat_size - 1; //normalize, -1 for skipped first bit if (corr > d_corr_max) { @@ -609,8 +614,9 @@ int gsm_burst::get_burst(void) case PARTIAL_SCH: d_sync_state = WAIT_SCH; break; - case SCH: - d_sync_state = SYNCHRONIZED; + //case SCH: + //let the burst type switch handle this so it knows if new or old sync + // d_sync_state = SYNCHRONIZED; break; default: break; @@ -645,6 +651,18 @@ int gsm_burst::get_burst(void) d_ts = 0; //TODO: check this break; case SCH: +#ifndef TEST_TUNE_TIMING + //TODO: it would be better to adjust tuning on first FCCH (for better SCH detection), + // but tuning can run away with false FCCHs + // Some logic to retune back to original offset on false FCCH might work + if (p_tuner) { + if (SYNCHRONIZED == d_sync_state) + p_tuner->calleval(BURST_CB_ADJ_OFFSET); + else + p_tuner->calleval(BURST_CB_SYNC_OFFSET); + + } +#endif d_burst_count++; d_sch_count++; d_last_sch = d_burst_count; @@ -672,7 +690,6 @@ int gsm_burst::get_burst(void) d_last_good = d_burst_count; } - //Check for loss of sync int bursts_since_good = d_burst_count - d_last_good; if (bursts_since_good > MAX_SYNC_WAIT) { @@ -686,6 +703,47 @@ int gsm_burst::get_burst(void) //print info print_burst(); + ///////////////////// + //start tune testing +#ifdef TEST_TUNE_TIMING + + static int good_count = -1; //-1: wait sch, >=0: got sch, counting + static int wait_count = 0; + + if (UNKNOWN == d_burst_type) { + if (good_count >= 0) { + fprintf(stdout,"good_count: %d\n",good_count); + + if (p_tuner) { + next_arfcn = TEST_TUNE_GOOD_ARFCN; + p_tuner->calleval(BURST_CB_TUNE); + } + } + good_count = -1; // start again at resync + + } else { + + if (good_count >= 0 ) { + good_count++; + } + + if (SCH == d_burst_type) { + if ((good_count < 0) && (++wait_count > 20)) { // get some good syncs before trying again + fprintf(stdout,"restarting good_count\n"); + good_count = wait_count = 0; + //tune away + if (p_tuner) { + next_arfcn = TEST_TUNE_EMPTY_ARFCN; + p_tuner->calleval(BURST_CB_TUNE); + } + } + } + } +#endif + //end tune testing + ///////////////////// + + //Adjust the buffer write position to align on MAX_CORR_DIST if ( d_clock_options & CLK_CORR_TRACK ) d_bbuf_pos += MAX_CORR_DIST - d_burst_start; |