diff options
author | Ron Economos <w6rz@comcast.net> | 2020-02-10 17:24:15 -0800 |
---|---|---|
committer | mormj <34754695+mormj@users.noreply.github.com> | 2020-02-13 10:17:55 -0500 |
commit | 36680f338e0b7ae7e5bcf7d2a860527ca7b14dfe (patch) | |
tree | d73dc60afcde807eadb016c8431137df69841237 /gr-dtv | |
parent | 654bec7628ca6b47c69180e0f7042c35c1831552 (diff) |
gr-dtv: Use new FFT allocation scheme for DVB-T2 blocks.
Diffstat (limited to 'gr-dtv')
-rw-r--r-- | gr-dtv/lib/dvbt2/dvbt2_p1insertion_cc_impl.cc | 75 | ||||
-rw-r--r-- | gr-dtv/lib/dvbt2/dvbt2_p1insertion_cc_impl.h | 6 | ||||
-rw-r--r-- | gr-dtv/lib/dvbt2/dvbt2_paprtr_cc_impl.cc | 43 | ||||
-rw-r--r-- | gr-dtv/lib/dvbt2/dvbt2_paprtr_cc_impl.h | 4 | ||||
-rw-r--r-- | gr-dtv/lib/dvbt2/dvbt2_pilotgenerator_cc_impl.cc | 29 | ||||
-rw-r--r-- | gr-dtv/lib/dvbt2/dvbt2_pilotgenerator_cc_impl.h | 2 |
6 files changed, 66 insertions, 93 deletions
diff --git a/gr-dtv/lib/dvbt2/dvbt2_p1insertion_cc_impl.cc b/gr-dtv/lib/dvbt2/dvbt2_p1insertion_cc_impl.cc index ad4d2422e5..e8233cdd26 100644 --- a/gr-dtv/lib/dvbt2/dvbt2_p1insertion_cc_impl.cc +++ b/gr-dtv/lib/dvbt2/dvbt2_p1insertion_cc_impl.cc @@ -43,62 +43,78 @@ dvbt2_p1insertion_cc_impl::dvbt2_p1insertion_cc_impl(dvbt2_extended_carrier_t ca float vclip) : gr::block("dvbt2_p1insertion_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), - gr::io_signature::make(1, 1, sizeof(gr_complex))) + gr::io_signature::make(1, 1, sizeof(gr_complex))), + show_levels(showlevels), + real_positive(0.0), + real_negative(0.0), + imag_positive(0.0), + imag_negative(0.0), + real_positive_threshold(vclip), + real_negative_threshold(-vclip), + imag_positive_threshold(vclip), + imag_negative_threshold(-vclip), + real_positive_threshold_count(0), + real_negative_threshold_count(0), + imag_positive_threshold_count(0), + imag_negative_threshold_count(0), + p1_fft(1024, false, 1) { int s1, s2, index = 0; + int p1_fft_size = 1024; + int symbol_size, N_P2, guard_interval; const gr_complex* in = (const gr_complex*)p1_freq; gr_complex* out = (gr_complex*)p1_time; s1 = preamble; switch (fftsize) { case FFTSIZE_1K: - fft_size = 1024; + symbol_size = 1024; N_P2 = 16; break; case FFTSIZE_2K: - fft_size = 2048; + symbol_size = 2048; N_P2 = 8; break; case FFTSIZE_4K: - fft_size = 4096; + symbol_size = 4096; N_P2 = 4; break; case FFTSIZE_8K: case FFTSIZE_8K_T2GI: - fft_size = 8192; + symbol_size = 8192; N_P2 = 2; break; case FFTSIZE_16K: case FFTSIZE_16K_T2GI: - fft_size = 16384; + symbol_size = 16384; N_P2 = 1; break; case FFTSIZE_32K: case FFTSIZE_32K_T2GI: - fft_size = 32768; + symbol_size = 32768; N_P2 = 1; break; } switch (guardinterval) { case GI_1_32: - guard_interval = fft_size / 32; + guard_interval = symbol_size / 32; break; case GI_1_16: - guard_interval = fft_size / 16; + guard_interval = symbol_size / 16; break; case GI_1_8: - guard_interval = fft_size / 8; + guard_interval = symbol_size / 8; break; case GI_1_4: - guard_interval = fft_size / 4; + guard_interval = symbol_size / 4; break; case GI_1_128: - guard_interval = fft_size / 128; + guard_interval = symbol_size / 128; break; case GI_19_128: - guard_interval = (fft_size * 19) / 128; + guard_interval = (symbol_size * 19) / 128; break; case GI_19_256: - guard_interval = (fft_size * 19) / 256; + guard_interval = (symbol_size * 19) / 256; break; } init_p1_randomizer(); @@ -136,13 +152,11 @@ dvbt2_p1insertion_cc_impl::dvbt2_p1insertion_cc_impl(dvbt2_extended_carrier_t ca for (int i = 0; i < 384; i++) { p1_freq[p1_active_carriers[i] + 86] = float(dbpsk_modulation_sequence[i]); } - p1_fft_size = 1024; - p1_fft = new fft::fft_complex(p1_fft_size, false, 1); - gr_complex* dst = p1_fft->get_inbuf(); + gr_complex* dst = p1_fft.get_inbuf(); memcpy(&dst[p1_fft_size / 2], &in[0], sizeof(gr_complex) * p1_fft_size / 2); memcpy(&dst[0], &in[p1_fft_size / 2], sizeof(gr_complex) * p1_fft_size / 2); - p1_fft->execute(); - memcpy(out, p1_fft->get_outbuf(), sizeof(gr_complex) * p1_fft_size); + p1_fft.execute(); + memcpy(out, p1_fft.get_outbuf(), sizeof(gr_complex) * p1_fft_size); for (int i = 0; i < 1024; i++) { p1_time[i] /= std::sqrt(384.0); } @@ -152,31 +166,18 @@ dvbt2_p1insertion_cc_impl::dvbt2_p1insertion_cc_impl(dvbt2_extended_carrier_t ca p1_freqshft[0] = p1_freq[1023]; in = (const gr_complex*)p1_freqshft; out = (gr_complex*)p1_timeshft; - dst = p1_fft->get_inbuf(); + dst = p1_fft.get_inbuf(); memcpy(&dst[p1_fft_size / 2], &in[0], sizeof(gr_complex) * p1_fft_size / 2); memcpy(&dst[0], &in[p1_fft_size / 2], sizeof(gr_complex) * p1_fft_size / 2); - p1_fft->execute(); - memcpy(out, p1_fft->get_outbuf(), sizeof(gr_complex) * p1_fft_size); + p1_fft.execute(); + memcpy(out, p1_fft.get_outbuf(), sizeof(gr_complex) * p1_fft_size); for (int i = 0; i < 1024; i++) { p1_timeshft[i] /= std::sqrt(384.0); } frame_items = - ((numdatasyms + N_P2) * fft_size) + ((numdatasyms + N_P2) * guard_interval); + ((numdatasyms + N_P2) * symbol_size) + ((numdatasyms + N_P2) * guard_interval); insertion_items = frame_items + 2048; set_output_multiple(frame_items + 2048); - show_levels = showlevels; - real_positive = 0.0; - real_negative = 0.0; - imag_positive = 0.0; - imag_negative = 0.0; - real_positive_threshold = vclip; - real_negative_threshold = -vclip; - imag_positive_threshold = vclip; - imag_negative_threshold = -vclip; - real_positive_threshold_count = 0; - real_negative_threshold_count = 0; - imag_positive_threshold_count = 0; - imag_negative_threshold_count = 0; } void dvbt2_p1insertion_cc_impl::init_p1_randomizer(void) @@ -198,7 +199,7 @@ void dvbt2_p1insertion_cc_impl::init_p1_randomizer(void) /* * Our virtual destructor. */ -dvbt2_p1insertion_cc_impl::~dvbt2_p1insertion_cc_impl() { delete p1_fft; } +dvbt2_p1insertion_cc_impl::~dvbt2_p1insertion_cc_impl() {} void dvbt2_p1insertion_cc_impl::forecast(int noutput_items, gr_vector_int& ninput_items_required) diff --git a/gr-dtv/lib/dvbt2/dvbt2_p1insertion_cc_impl.h b/gr-dtv/lib/dvbt2/dvbt2_p1insertion_cc_impl.h index 0c51d00ada..e746c789c9 100644 --- a/gr-dtv/lib/dvbt2/dvbt2_p1insertion_cc_impl.h +++ b/gr-dtv/lib/dvbt2/dvbt2_p1insertion_cc_impl.h @@ -20,11 +20,8 @@ namespace dtv { class dvbt2_p1insertion_cc_impl : public dvbt2_p1insertion_cc { private: - int fft_size; - int guard_interval; int frame_items; int insertion_items; - int N_P2; int p1_randomize[384]; int modulation_sequence[384]; int dbpsk_modulation_sequence[385]; @@ -48,8 +45,7 @@ private: int imag_positive_threshold_count; int imag_negative_threshold_count; - fft::fft_complex* p1_fft; - int p1_fft_size; + fft::fft_complex p1_fft; const static int p1_active_carriers[384]; const static unsigned char s1_modulation_patterns[8][8]; diff --git a/gr-dtv/lib/dvbt2/dvbt2_paprtr_cc_impl.cc b/gr-dtv/lib/dvbt2/dvbt2_paprtr_cc_impl.cc index 3803cfe430..211dea1ac1 100644 --- a/gr-dtv/lib/dvbt2/dvbt2_paprtr_cc_impl.cc +++ b/gr-dtv/lib/dvbt2/dvbt2_paprtr_cc_impl.cc @@ -61,7 +61,15 @@ dvbt2_paprtr_cc_impl::dvbt2_paprtr_cc_impl(dvbt2_extended_carrier_t carriermode, unsigned int vlength) : gr::sync_block("dvbt2_paprtr_cc", gr::io_signature::make(1, 1, sizeof(gr_complex) * vlength), - gr::io_signature::make(1, 1, sizeof(gr_complex) * vlength)) + gr::io_signature::make(1, 1, sizeof(gr_complex) * vlength)), + fft_size(fftsize), + carrier_mode(carriermode), + papr_mode(paprmode), + version_num(version), + v_clip(vclip), + num_iterations(iterations), + papr_fft(vlength, false, 1), + papr_fft_size(vlength) { switch (fftsize) { case FFTSIZE_1K: @@ -512,35 +520,17 @@ dvbt2_paprtr_cc_impl::dvbt2_paprtr_cc_impl(dvbt2_extended_carrier_t carriermode, dy = 16; break; } - shift = 0; - papr_map = p2_papr_map; - fft_size = fftsize; - pilot_pattern = pilotpattern; - carrier_mode = carriermode; - papr_mode = paprmode; - version_num = version; if (version == VERSION_131 && papr_mode == PAPR_OFF) { v_clip = 3.0; num_iterations = 1; - } else { - v_clip = vclip; - num_iterations = iterations; } left_nulls = ((vlength - C_PS) / 2) + 1; right_nulls = (vlength - C_PS) / 2; - papr_fft_size = vlength; - papr_fft = new (std::nothrow) fft::fft_complex(papr_fft_size, false, 1); - if (papr_fft == NULL) { - GR_LOG_FATAL(d_logger, - "Tone Reservation PAPR, cannot allocate memory for papr_fft."); - throw std::bad_alloc(); - } ones_freq = (gr_complex*)volk_malloc(sizeof(gr_complex) * papr_fft_size, volk_get_alignment()); if (ones_freq == NULL) { GR_LOG_FATAL(d_logger, "Tone Reservation PAPR, cannot allocate memory for ones_freq."); - delete papr_fft; throw std::bad_alloc(); } ones_time = (gr_complex*)volk_malloc(sizeof(gr_complex) * papr_fft_size, @@ -549,7 +539,6 @@ dvbt2_paprtr_cc_impl::dvbt2_paprtr_cc_impl(dvbt2_extended_carrier_t carriermode, GR_LOG_FATAL(d_logger, "Tone Reservation PAPR, cannot allocate memory for ones_time."); volk_free(ones_freq); - delete papr_fft; throw std::bad_alloc(); } c = (gr_complex*)volk_malloc(sizeof(gr_complex) * papr_fft_size, @@ -558,7 +547,6 @@ dvbt2_paprtr_cc_impl::dvbt2_paprtr_cc_impl(dvbt2_extended_carrier_t carriermode, GR_LOG_FATAL(d_logger, "Tone Reservation PAPR, cannot allocate memory for c."); volk_free(ones_time); volk_free(ones_freq); - delete papr_fft; throw std::bad_alloc(); } ctemp = (gr_complex*)volk_malloc(sizeof(gr_complex) * papr_fft_size, @@ -569,7 +557,6 @@ dvbt2_paprtr_cc_impl::dvbt2_paprtr_cc_impl(dvbt2_extended_carrier_t carriermode, volk_free(c); volk_free(ones_time); volk_free(ones_freq); - delete papr_fft; throw std::bad_alloc(); } magnitude = (float*)volk_malloc(sizeof(float) * papr_fft_size, volk_get_alignment()); @@ -580,7 +567,6 @@ dvbt2_paprtr_cc_impl::dvbt2_paprtr_cc_impl(dvbt2_extended_carrier_t carriermode, volk_free(c); volk_free(ones_time); volk_free(ones_freq); - delete papr_fft; throw std::bad_alloc(); } r = (gr_complex*)volk_malloc(sizeof(gr_complex) * N_TR, volk_get_alignment()); @@ -591,7 +577,6 @@ dvbt2_paprtr_cc_impl::dvbt2_paprtr_cc_impl(dvbt2_extended_carrier_t carriermode, volk_free(c); volk_free(ones_time); volk_free(ones_freq); - delete papr_fft; throw std::bad_alloc(); } rNew = (gr_complex*)volk_malloc(sizeof(gr_complex) * N_TR, volk_get_alignment()); @@ -603,7 +588,6 @@ dvbt2_paprtr_cc_impl::dvbt2_paprtr_cc_impl(dvbt2_extended_carrier_t carriermode, volk_free(c); volk_free(ones_time); volk_free(ones_freq); - delete papr_fft; throw std::bad_alloc(); } v = (gr_complex*)volk_malloc(sizeof(gr_complex) * N_TR, volk_get_alignment()); @@ -616,7 +600,6 @@ dvbt2_paprtr_cc_impl::dvbt2_paprtr_cc_impl(dvbt2_extended_carrier_t carriermode, volk_free(c); volk_free(ones_time); volk_free(ones_freq); - delete papr_fft; throw std::bad_alloc(); } num_symbols = numdatasyms + N_P2; @@ -636,7 +619,6 @@ dvbt2_paprtr_cc_impl::~dvbt2_paprtr_cc_impl() volk_free(c); volk_free(ones_time); volk_free(ones_freq); - delete papr_fft; } void dvbt2_paprtr_cc_impl::init_pilots(int symbol) @@ -692,6 +674,7 @@ int dvbt2_paprtr_cc_impl::work(int noutput_items, { const gr_complex* in = (const gr_complex*)input_items[0]; gr_complex* out = (gr_complex*)output_items[0]; + const int* papr_map; const gr_complex one(1.0, 0.0); const gr_complex zero(0.0, 0.0); const float normalization = 1.0 / N_TR; @@ -755,16 +738,16 @@ int dvbt2_paprtr_cc_impl::work(int noutput_items, valid = TRUE; } if (valid == TRUE) { - dst = papr_fft->get_inbuf(); + dst = papr_fft.get_inbuf(); memcpy(&dst[papr_fft_size / 2], &ones_freq[0], sizeof(gr_complex) * papr_fft_size / 2); memcpy(&dst[0], &ones_freq[papr_fft_size / 2], sizeof(gr_complex) * papr_fft_size / 2); - papr_fft->execute(); + papr_fft.execute(); memcpy(ones_time, - papr_fft->get_outbuf(), + papr_fft.get_outbuf(), sizeof(gr_complex) * papr_fft_size); volk_32fc_s32fc_multiply_32fc( ones_time, ones_time, normalization, papr_fft_size); diff --git a/gr-dtv/lib/dvbt2/dvbt2_paprtr_cc_impl.h b/gr-dtv/lib/dvbt2/dvbt2_paprtr_cc_impl.h index fba4363a98..01a5499891 100644 --- a/gr-dtv/lib/dvbt2/dvbt2_paprtr_cc_impl.h +++ b/gr-dtv/lib/dvbt2/dvbt2_paprtr_cc_impl.h @@ -37,13 +37,11 @@ private: int fft_size; int left_nulls; int right_nulls; - int pilot_pattern; int carrier_mode; int papr_mode; int version_num; double v_clip; int num_iterations; - const int* papr_map; const int* p2_papr_map; const int* tr_papr_map; int p2_carrier_map[MAX_CARRIERS]; @@ -69,7 +67,7 @@ private: int shift; void init_pilots(int); - fft::fft_complex* papr_fft; + fft::fft_complex papr_fft; int papr_fft_size; const static int p2_papr_map_1k[10]; diff --git a/gr-dtv/lib/dvbt2/dvbt2_pilotgenerator_cc_impl.cc b/gr-dtv/lib/dvbt2/dvbt2_pilotgenerator_cc_impl.cc index b377f34e57..a387948967 100644 --- a/gr-dtv/lib/dvbt2/dvbt2_pilotgenerator_cc_impl.cc +++ b/gr-dtv/lib/dvbt2/dvbt2_pilotgenerator_cc_impl.cc @@ -64,7 +64,14 @@ dvbt2_pilotgenerator_cc_impl::dvbt2_pilotgenerator_cc_impl( unsigned int vlength) : gr::block("dvbt2_pilotgenerator_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), - gr::io_signature::make(1, 1, sizeof(gr_complex) * vlength)) + gr::io_signature::make(1, 1, sizeof(gr_complex) * vlength)), + fft_size(fftsize), + pilot_pattern(pilotpattern), + carrier_mode(carriermode), + papr_mode(paprmode), + equalization_enable(equalization), + ofdm_fft(vlength, false, 1), + ofdm_fft_size(vlength) { int step, ki; double x, sinc, sincrms = 0.0; @@ -1071,10 +1078,6 @@ dvbt2_pilotgenerator_cc_impl::dvbt2_pilotgenerator_cc_impl( } else { active_items = (N_P2 * C_P2) + ((numdatasyms - 1) * C_DATA) + N_FC; } - fft_size = fftsize; - pilot_pattern = pilotpattern; - carrier_mode = carriermode; - papr_mode = paprmode; left_nulls = ((vlength - C_PS) / 2) + 1; right_nulls = (vlength - C_PS) / 2; if ((fftsize == FFTSIZE_32K || fftsize == FFTSIZE_32K_T2GI) && (miso == FALSE)) { @@ -1129,14 +1132,6 @@ dvbt2_pilotgenerator_cc_impl::dvbt2_pilotgenerator_cc_impl( for (unsigned int i = 0; i < vlength; i++) { inverse_sinc[i] *= sincrms; } - equalization_enable = equalization; - ofdm_fft_size = vlength; - ofdm_fft = new (std::nothrow) fft::fft_complex(ofdm_fft_size, false, 1); - if (ofdm_fft == NULL) { - GR_LOG_FATAL(d_logger, - "Pilot Generator and IFFT, cannot allocate memory for ofdm_fft."); - throw std::bad_alloc(); - } num_symbols = numdatasyms + N_P2; data_carrier_map.resize(num_symbols); @@ -1152,7 +1147,7 @@ dvbt2_pilotgenerator_cc_impl::dvbt2_pilotgenerator_cc_impl( /* * Our virtual destructor. */ -dvbt2_pilotgenerator_cc_impl::~dvbt2_pilotgenerator_cc_impl() { delete ofdm_fft; } +dvbt2_pilotgenerator_cc_impl::~dvbt2_pilotgenerator_cc_impl() {} void dvbt2_pilotgenerator_cc_impl::forecast(int noutput_items, gr_vector_int& ninput_items_required) @@ -2700,14 +2695,14 @@ int dvbt2_pilotgenerator_cc_impl::general_work(int noutput_items, if (equalization_enable == EQUALIZATION_ON) { volk_32fc_x2_multiply_32fc(out, out, inverse_sinc, ofdm_fft_size); } - dst = ofdm_fft->get_inbuf(); + dst = ofdm_fft.get_inbuf(); memcpy( &dst[ofdm_fft_size / 2], &out[0], sizeof(gr_complex) * ofdm_fft_size / 2); memcpy( &dst[0], &out[ofdm_fft_size / 2], sizeof(gr_complex) * ofdm_fft_size / 2); - ofdm_fft->execute(); + ofdm_fft.execute(); volk_32fc_s32fc_multiply_32fc( - out, ofdm_fft->get_outbuf(), normalization, ofdm_fft_size); + out, ofdm_fft.get_outbuf(), normalization, ofdm_fft_size); out += ofdm_fft_size; } } diff --git a/gr-dtv/lib/dvbt2/dvbt2_pilotgenerator_cc_impl.h b/gr-dtv/lib/dvbt2/dvbt2_pilotgenerator_cc_impl.h index ac8ab17300..293854496a 100644 --- a/gr-dtv/lib/dvbt2/dvbt2_pilotgenerator_cc_impl.h +++ b/gr-dtv/lib/dvbt2/dvbt2_pilotgenerator_cc_impl.h @@ -73,7 +73,7 @@ private: void init_prbs(void); void init_pilots(void); - fft::fft_complex* ofdm_fft; + fft::fft_complex ofdm_fft; int ofdm_fft_size; const static unsigned char pn_sequence_table[CHIPS / 8]; |