summaryrefslogtreecommitdiff
path: root/gr-dtv
diff options
context:
space:
mode:
authorRon Economos <w6rz@comcast.net>2020-02-10 17:24:15 -0800
committermormj <34754695+mormj@users.noreply.github.com>2020-02-13 10:17:55 -0500
commit36680f338e0b7ae7e5bcf7d2a860527ca7b14dfe (patch)
treed73dc60afcde807eadb016c8431137df69841237 /gr-dtv
parent654bec7628ca6b47c69180e0f7042c35c1831552 (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.cc75
-rw-r--r--gr-dtv/lib/dvbt2/dvbt2_p1insertion_cc_impl.h6
-rw-r--r--gr-dtv/lib/dvbt2/dvbt2_paprtr_cc_impl.cc43
-rw-r--r--gr-dtv/lib/dvbt2/dvbt2_paprtr_cc_impl.h4
-rw-r--r--gr-dtv/lib/dvbt2/dvbt2_pilotgenerator_cc_impl.cc29
-rw-r--r--gr-dtv/lib/dvbt2/dvbt2_pilotgenerator_cc_impl.h2
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];