diff options
-rw-r--r-- | gr-dtv/lib/atsc/atsc_sync_impl.cc | 42 | ||||
-rw-r--r-- | gr-dtv/lib/atsc/atsc_sync_impl.h | 10 | ||||
-rw-r--r-- | gr-qtgui/include/gnuradio/qtgui/freqcontrolpanel.h | 1 | ||||
-rw-r--r-- | gr-qtgui/lib/freqcontrolpanel.cc | 13 | ||||
-rw-r--r-- | gr-qtgui/lib/freqdisplayform.cc | 3 |
5 files changed, 41 insertions, 28 deletions
diff --git a/gr-dtv/lib/atsc/atsc_sync_impl.cc b/gr-dtv/lib/atsc/atsc_sync_impl.cc index d83bccc5e0..7ecc33612a 100644 --- a/gr-dtv/lib/atsc/atsc_sync_impl.cc +++ b/gr-dtv/lib/atsc/atsc_sync_impl.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2014 Free Software Foundation, Inc. + * Copyright 2014,2016 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -35,8 +35,8 @@ namespace gr { static const double ADJUSTMENT_GAIN = 1.0e-5 / (10 * ATSC_DATA_SEGMENT_LENGTH); static const int SYMBOL_INDEX_OFFSET = 3; static const int MIN_SEG_LOCK_CORRELATION_VALUE = 5; - static const int SSI_MIN = -16; - static const int SSI_MAX = 15; + static const char SSI_MIN = -16; + static const char SSI_MAX = 15; atsc_sync::sptr atsc_sync::make(float rate) @@ -62,9 +62,6 @@ namespace gr { d_w = d_rx_clock_to_symbol_freq; d_mu = 0.5; - for (int i = 0; i < ATSC_DATA_SEGMENT_LENGTH; i++) - sample_mem[i] = 0; - d_timing_adjust = 0; d_counter = 0; d_symbol_index = 0; @@ -72,8 +69,9 @@ namespace gr { d_sr = 0; - for (int i = 0; i < ATSC_DATA_SEGMENT_LENGTH; i++) - d_integrator[i] = SSI_MIN; + memset(d_sample_mem, 0, ATSC_DATA_SEGMENT_LENGTH * sizeof(*d_sample_mem)); // (float)0 = 0x00000000 + memset(d_data_mem, 0, ATSC_DATA_SEGMENT_LENGTH * sizeof(*d_data_mem)); // (float)0 = 0x00000000 + memset(d_integrator, SSI_MIN, ATSC_DATA_SEGMENT_LENGTH * sizeof(*d_integrator)); // signed char } atsc_sync_impl::~atsc_sync_impl() @@ -103,7 +101,7 @@ namespace gr { // amount actually consumed d_si = 0; - for (output_produced = 0; output_produced < noutput_items && (d_si + (int)d_interp.ntaps()) < ninput_items[0];) { + for (d_output_produced = 0; d_output_produced < noutput_items && (d_si + (int)d_interp.ntaps()) < ninput_items[0];) { // First we interpolate a sample from input to work with interp_sample = d_interp.interpolate(&in[d_si], d_mu); @@ -119,7 +117,7 @@ namespace gr { d_si += d_incr; // Remember the sample at this count position - sample_mem[d_counter] = interp_sample; + d_sample_mem[d_counter] = interp_sample; // Is the sample positive or negative? int bit = (interp_sample < 0 ? 0 : 1); @@ -154,22 +152,22 @@ namespace gr { d_seg_locked = best_correlation_value >= MIN_SEG_LOCK_CORRELATION_VALUE; // the coefficients are -1,-1,+1,+1 - //d_timing_adjust = sample_mem[best_correlation_index - 3] + - // sample_mem[best_correlation_index - 2] - - // sample_mem[best_correlation_index - 1] - - // sample_mem[best_correlation_index]; + //d_timing_adjust = d_sample_mem[best_correlation_index - 3] + + // d_sample_mem[best_correlation_index - 2] - + // d_sample_mem[best_correlation_index - 1] - + // d_sample_mem[best_correlation_index]; //printf( "d_timing_adjust = %f\n", d_timing_adjust ); int corr_count = best_correlation_index; - d_timing_adjust = -sample_mem[corr_count--]; + d_timing_adjust = -d_sample_mem[corr_count--]; if( corr_count < 0 ) corr_count = ATSC_DATA_SEGMENT_LENGTH - 1; - d_timing_adjust -= sample_mem[corr_count--]; + d_timing_adjust -= d_sample_mem[corr_count--]; if( corr_count < 0 ) corr_count = ATSC_DATA_SEGMENT_LENGTH - 1; - d_timing_adjust += sample_mem[corr_count--]; + d_timing_adjust += d_sample_mem[corr_count--]; if( corr_count < 0 ) corr_count = ATSC_DATA_SEGMENT_LENGTH - 1; - d_timing_adjust += sample_mem[corr_count--]; + d_timing_adjust += d_sample_mem[corr_count--]; d_symbol_index = SYMBOL_INDEX_OFFSET - 1 - best_correlation_index; if (d_symbol_index < 0) @@ -183,19 +181,19 @@ namespace gr { // half full, this is OK becouse the fs_checker will not let packets though // untill a non-corrupted field packet is found if( d_seg_locked ) { - data_mem[d_symbol_index] = interp_sample; + d_data_mem[d_symbol_index] = interp_sample; if( d_symbol_index >= (ATSC_DATA_SEGMENT_LENGTH - 1) ) { for( int i = 0; i < ATSC_DATA_SEGMENT_LENGTH; i++ ) - soft_data_segment_out[output_produced].data[i] = data_mem[i]; - output_produced++; + soft_data_segment_out[d_output_produced].data[i] = d_data_mem[i]; + d_output_produced++; } } } consume_each(d_si); - return output_produced; + return d_output_produced; } diff --git a/gr-dtv/lib/atsc/atsc_sync_impl.h b/gr-dtv/lib/atsc/atsc_sync_impl.h index f5e645049c..670cb311e1 100644 --- a/gr-dtv/lib/atsc/atsc_sync_impl.h +++ b/gr-dtv/lib/atsc/atsc_sync_impl.h @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2014 Free Software Foundation, Inc. + * Copyright 2014,2016 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -44,16 +44,16 @@ namespace gr { double d_mu; // fractional delay [0,1] int d_incr; - float sample_mem[ATSC_DATA_SEGMENT_LENGTH]; - float data_mem[ATSC_DATA_SEGMENT_LENGTH]; + float d_sample_mem[ATSC_DATA_SEGMENT_LENGTH]; + float d_data_mem[ATSC_DATA_SEGMENT_LENGTH]; double d_timing_adjust; int d_counter; // free running mod 832 counter int d_symbol_index; bool d_seg_locked; - int d_sr; // 4 bit shift register + unsigned char d_sr; // 4 bit shift register signed char d_integrator[ATSC_DATA_SEGMENT_LENGTH]; - int output_produced; + int d_output_produced; public: atsc_sync_impl(float rate); diff --git a/gr-qtgui/include/gnuradio/qtgui/freqcontrolpanel.h b/gr-qtgui/include/gnuradio/qtgui/freqcontrolpanel.h index 548d693846..5fb8f462c5 100644 --- a/gr-qtgui/include/gnuradio/qtgui/freqcontrolpanel.h +++ b/gr-qtgui/include/gnuradio/qtgui/freqcontrolpanel.h @@ -44,6 +44,7 @@ public: public slots: void notifyAvgSlider(int val); + void setFFTAverage(float val); void toggleGrid(bool en); void toggleAxisLabels(bool en); void toggleMaxHold(bool en); diff --git a/gr-qtgui/lib/freqcontrolpanel.cc b/gr-qtgui/lib/freqcontrolpanel.cc index 8babdf0523..c0a8ed4158 100644 --- a/gr-qtgui/lib/freqcontrolpanel.cc +++ b/gr-qtgui/lib/freqcontrolpanel.cc @@ -249,12 +249,23 @@ FreqControlPanel::toggleMinHold(bool en) void FreqControlPanel::notifyAvgSlider(int val) { - float fval = static_cast<float>(val) / (d_slider_max - d_slider_min); + float fval = static_cast<float>(val) / (d_slider_max - d_slider_min + 1); emit signalAvgSlider(fval); emit signalAvg(true); } void +FreqControlPanel::setFFTAverage(float val) +{ + int slider_val = static_cast<int>(roundf(val * (d_slider_max - d_slider_min + 1))); + if (slider_val > d_slider_max) + slider_val = d_slider_max; + else if (slider_val < d_slider_min) + slider_val = d_slider_min; + d_avg_slider->setValue(slider_val); +} + +void FreqControlPanel::toggleFFTSize(int val) { int index = static_cast<int>(round(logf(static_cast<float>(val))/logf(2.0f))) - 5; diff --git a/gr-qtgui/lib/freqdisplayform.cc b/gr-qtgui/lib/freqdisplayform.cc index 21d4330722..6aa4894a96 100644 --- a/gr-qtgui/lib/freqdisplayform.cc +++ b/gr-qtgui/lib/freqdisplayform.cc @@ -191,6 +191,8 @@ FreqDisplayForm::setupControlPanel() d_controlpanel, SLOT(toggleMaxHold(bool))); connect(d_minhold_act, SIGNAL(triggered(bool)), d_controlpanel, SLOT(toggleMinHold(bool))); + connect(d_avgmenu, SIGNAL(whichTrigger(float)), + d_controlpanel, SLOT(setFFTAverage(float))); connect(d_tr_mode_menu, SIGNAL(whichTrigger(gr::qtgui::trigger_mode)), d_controlpanel, SLOT(toggleTriggerMode(gr::qtgui::trigger_mode))); connect(this, SIGNAL(signalTriggerMode(gr::qtgui::trigger_mode)), @@ -206,6 +208,7 @@ FreqDisplayForm::setupControlPanel() d_controlpanel->toggleTriggerMode(getTriggerMode()); d_controlpanel->toggleMaxHold(d_maxhold_act->isChecked()); d_controlpanel->toggleMinHold(d_minhold_act->isChecked()); + d_controlpanel->setFFTAverage(getFFTAverage()); emit signalFFTSize(getFFTSize()); emit signalFFTWindow(getFFTWindowType()); |