diff options
Diffstat (limited to 'gr-dtv/lib/dvbt/dvbt_reference_signals_impl.h')
-rw-r--r-- | gr-dtv/lib/dvbt/dvbt_reference_signals_impl.h | 463 |
1 files changed, 236 insertions, 227 deletions
diff --git a/gr-dtv/lib/dvbt/dvbt_reference_signals_impl.h b/gr-dtv/lib/dvbt/dvbt_reference_signals_impl.h index 06a74f936c..0ab7193a26 100644 --- a/gr-dtv/lib/dvbt/dvbt_reference_signals_impl.h +++ b/gr-dtv/lib/dvbt/dvbt_reference_signals_impl.h @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -26,233 +26,242 @@ #include <vector> #include <deque> - // This should eventually go into a const file - const int SYMBOLS_PER_FRAME = 68; - const int FRAMES_PER_SUPERFRAME = 4; +// This should eventually go into a const file +const int SYMBOLS_PER_FRAME = 68; +const int FRAMES_PER_SUPERFRAME = 4; - const int SCATTERED_PILOT_SIZE_2k = 142; - const int CONTINUAL_PILOT_SIZE_2k = 45; - const int TPS_PILOT_SIZE_2k = 17; +const int SCATTERED_PILOT_SIZE_2k = 142; +const int CONTINUAL_PILOT_SIZE_2k = 45; +const int TPS_PILOT_SIZE_2k = 17; - const int SCATTERED_PILOT_SIZE_8k = 568; - const int CONTINUAL_PILOT_SIZE_8k = 177; - const int TPS_PILOT_SIZE_8k = 68; +const int SCATTERED_PILOT_SIZE_8k = 568; +const int CONTINUAL_PILOT_SIZE_8k = 177; +const int TPS_PILOT_SIZE_8k = 68; namespace gr { - namespace dtv { - - class dvbt_pilot_gen { - private: - // this should be first in order to be initialized first - const dvbt_configure &config; - - int d_Kmin; - int d_Kmax; - int d_fft_length; - int d_payload_length; - int d_zeros_on_left; - int d_zeros_on_right; - int d_cp_length; - - static const int d_symbols_per_frame; - static const int d_frames_per_superframe; - - // 2k mode - // scattered pilot carriers info - static const int d_spilot_carriers_size_2k; - - // continual pilot carriers info - static const int d_cpilot_carriers_size_2k; - static const int d_cpilot_carriers_2k[]; - - // TPS carriers info - static const int d_tps_carriers_size_2k; - static const int d_tps_carriers_2k[]; - - //8k mode - // scattered pilot carriers info - static const int d_spilot_carriers_size_8k; - - // continual pilot carriers info - static const int d_cpilot_carriers_size_8k; - static const int d_cpilot_carriers_8k[]; - - // TPS carriers info - static const int d_tps_carriers_size_8k; - static const int d_tps_carriers_8k[]; - - // TPS sync data - static const int d_tps_sync_size; - static const int d_tps_sync_even[]; - static const int d_tps_sync_odd[]; - - // Variables to keep data for 2k, 8k, 4k - int d_spilot_carriers_size; - gr_complex * d_spilot_carriers_val; - gr_complex * d_channel_gain; - - int d_cpilot_carriers_size; - const int * d_cpilot_carriers; - float * d_known_phase_diff; - float * d_cpilot_phase_diff; - int d_freq_offset; - float d_carrier_freq_correction; - float d_sampling_freq_correction; - - // Variable to keep corrected OFDM symbol - gr_complex * d_derot_in; - - int d_tps_carriers_size; - const int * d_tps_carriers; - gr_complex * d_tps_carriers_val; - - // Keeps TPS data - unsigned char * d_tps_data; - // Keep TPS carriers values from previous symbol - gr_complex * d_prev_tps_symbol; - // Keep TPS carriers values from current symbol - gr_complex * d_tps_symbol; - // Keeps the rcv TPS data, is a FIFO - std::deque<char> d_rcv_tps_data; - // Keeps the TPS sync sequence - std::deque<char> d_tps_sync_evenv; - std::deque<char> d_tps_sync_oddv; - - // Keeps channel estimation carriers - // we use both continual and scattered carriers - int * d_chanestim_carriers; - - // Keeps paload carriers - int * d_payload_carriers; - - // Indexes for all carriers - int d_spilot_index; - int d_cpilot_index; - int d_tpilot_index; - int d_symbol_index; - int d_symbol_index_known; - int d_frame_index; - int d_superframe_index; - int d_freq_offset_max; - int d_trigger_index; - int d_payload_index; - int d_chanestim_index; - int d_prev_mod_symbol_index; - int d_mod_symbol_index; - int d_equalizer_ready; - - // PRPS generator data buffer - char * d_wk; - // Generate PRBS - void generate_prbs(); - - // TPS private methods - void set_tps_bits(int start, int stop, unsigned int data); - - void set_symbol_index(int index); - int get_symbol_index(); - void set_tps_data(); - void get_tps_data(); - - void reset_pilot_generator(); - - // Scattered pilot generator methods - int get_current_spilot(int spilot) const; - gr_complex get_spilot_value(int spilot); - void set_spilot_value(int spilot, gr_complex val); - void advance_spilot(int sindex); - // Methods used to quick iterate through all spilots - int get_first_spilot(); - int get_last_spilot() const; - int get_next_spilot(); - // Scattered pilot data processing method - int process_spilot_data(const gr_complex * in); - - // Channel estimation methods - void set_channel_gain(int spilot, gr_complex val); - - // Continual pilot generator methods - int get_current_cpilot() const; - gr_complex get_cpilot_value(int cpilot); - void advance_cpilot(); - // Continual pilot data processing methods - void process_cpilot_data(const gr_complex * in); - void compute_oneshot_csft(const gr_complex * in); - gr_complex * frequency_correction(const gr_complex * in, gr_complex * out); - - // TPS generator methods - int get_current_tpilot() const; - gr_complex get_tpilot_value(int tpilot); - void advance_tpilot(); - // TPS data - void format_tps_data(); - // Encode TPS data - void generate_bch_code(); - // Verify parity on TPS data - int verify_bch_code(std::deque<char> data); - // TPS data processing methods - int process_tps_data(const gr_complex * in, const int diff_symbo_index); - - // Channel estimation methods - void set_chanestim_carrier(int k); - - // Payload data processing methods - int get_current_payload(); - void advance_chanestim(); - void set_payload_carrier(int k); - void advance_payload(); - void process_payload_data(const gr_complex *in, gr_complex *out); - - public: - dvbt_pilot_gen(const dvbt_configure &config); - ~dvbt_pilot_gen(); - - /*! - * ETSI EN 300 744 Clause 4.5. \n - * Update a set of carriers with the pilot signals. \n - */ - void update_output(const gr_complex *in, gr_complex *out); - - /*! - * TODO - * ETSI EN 300 744 Clause 4.5. \n - * Extract data from a set of carriers using pilot signals. \n - * This is doing frequency correcton, equalization. \n - */ - int parse_input(const gr_complex *in, gr_complex *out, int * symbol_index, int * frame_index); - }; - - class dvbt_reference_signals_impl : public dvbt_reference_signals - { - // configuration object for this class - const dvbt_configure config; - - private: - // Pilot Generator object - dvbt_pilot_gen d_pg; - - //In and Out data length - int d_ninput; - int d_noutput; - - public: - dvbt_reference_signals_impl(int itemsize, int ninput, int noutput, \ - dvb_constellation_t constellation, dvbt_hierarchy_t hierarchy, \ - dvb_code_rate_t code_rate_HP, dvb_code_rate_t code_rate_LP, \ - dvb_guardinterval_t guard_interval, \ - dvbt_transmission_mode_t transmission_mode = gr::dtv::T2k, int include_cell_id = 0, int cell_id = 0); - ~dvbt_reference_signals_impl(); - - void forecast (int noutput_items, gr_vector_int &ninput_items_required); - - int general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); - }; - - } // namespace dtv +namespace dtv { + +class dvbt_pilot_gen +{ +private: + // this should be first in order to be initialized first + const dvbt_configure& config; + + int d_Kmin; + int d_Kmax; + int d_fft_length; + int d_payload_length; + int d_zeros_on_left; + int d_zeros_on_right; + int d_cp_length; + + static const int d_symbols_per_frame; + static const int d_frames_per_superframe; + + // 2k mode + // scattered pilot carriers info + static const int d_spilot_carriers_size_2k; + + // continual pilot carriers info + static const int d_cpilot_carriers_size_2k; + static const int d_cpilot_carriers_2k[]; + + // TPS carriers info + static const int d_tps_carriers_size_2k; + static const int d_tps_carriers_2k[]; + + // 8k mode + // scattered pilot carriers info + static const int d_spilot_carriers_size_8k; + + // continual pilot carriers info + static const int d_cpilot_carriers_size_8k; + static const int d_cpilot_carriers_8k[]; + + // TPS carriers info + static const int d_tps_carriers_size_8k; + static const int d_tps_carriers_8k[]; + + // TPS sync data + static const int d_tps_sync_size; + static const int d_tps_sync_even[]; + static const int d_tps_sync_odd[]; + + // Variables to keep data for 2k, 8k, 4k + int d_spilot_carriers_size; + gr_complex* d_spilot_carriers_val; + gr_complex* d_channel_gain; + + int d_cpilot_carriers_size; + const int* d_cpilot_carriers; + float* d_known_phase_diff; + float* d_cpilot_phase_diff; + int d_freq_offset; + float d_carrier_freq_correction; + float d_sampling_freq_correction; + + // Variable to keep corrected OFDM symbol + gr_complex* d_derot_in; + + int d_tps_carriers_size; + const int* d_tps_carriers; + gr_complex* d_tps_carriers_val; + + // Keeps TPS data + unsigned char* d_tps_data; + // Keep TPS carriers values from previous symbol + gr_complex* d_prev_tps_symbol; + // Keep TPS carriers values from current symbol + gr_complex* d_tps_symbol; + // Keeps the rcv TPS data, is a FIFO + std::deque<char> d_rcv_tps_data; + // Keeps the TPS sync sequence + std::deque<char> d_tps_sync_evenv; + std::deque<char> d_tps_sync_oddv; + + // Keeps channel estimation carriers + // we use both continual and scattered carriers + int* d_chanestim_carriers; + + // Keeps paload carriers + int* d_payload_carriers; + + // Indexes for all carriers + int d_spilot_index; + int d_cpilot_index; + int d_tpilot_index; + int d_symbol_index; + int d_symbol_index_known; + int d_frame_index; + int d_superframe_index; + int d_freq_offset_max; + int d_trigger_index; + int d_payload_index; + int d_chanestim_index; + int d_prev_mod_symbol_index; + int d_mod_symbol_index; + int d_equalizer_ready; + + // PRPS generator data buffer + char* d_wk; + // Generate PRBS + void generate_prbs(); + + // TPS private methods + void set_tps_bits(int start, int stop, unsigned int data); + + void set_symbol_index(int index); + int get_symbol_index(); + void set_tps_data(); + void get_tps_data(); + + void reset_pilot_generator(); + + // Scattered pilot generator methods + int get_current_spilot(int spilot) const; + gr_complex get_spilot_value(int spilot); + void set_spilot_value(int spilot, gr_complex val); + void advance_spilot(int sindex); + // Methods used to quick iterate through all spilots + int get_first_spilot(); + int get_last_spilot() const; + int get_next_spilot(); + // Scattered pilot data processing method + int process_spilot_data(const gr_complex* in); + + // Channel estimation methods + void set_channel_gain(int spilot, gr_complex val); + + // Continual pilot generator methods + int get_current_cpilot() const; + gr_complex get_cpilot_value(int cpilot); + void advance_cpilot(); + // Continual pilot data processing methods + void process_cpilot_data(const gr_complex* in); + void compute_oneshot_csft(const gr_complex* in); + gr_complex* frequency_correction(const gr_complex* in, gr_complex* out); + + // TPS generator methods + int get_current_tpilot() const; + gr_complex get_tpilot_value(int tpilot); + void advance_tpilot(); + // TPS data + void format_tps_data(); + // Encode TPS data + void generate_bch_code(); + // Verify parity on TPS data + int verify_bch_code(std::deque<char> data); + // TPS data processing methods + int process_tps_data(const gr_complex* in, const int diff_symbo_index); + + // Channel estimation methods + void set_chanestim_carrier(int k); + + // Payload data processing methods + int get_current_payload(); + void advance_chanestim(); + void set_payload_carrier(int k); + void advance_payload(); + void process_payload_data(const gr_complex* in, gr_complex* out); + +public: + dvbt_pilot_gen(const dvbt_configure& config); + ~dvbt_pilot_gen(); + + /*! + * ETSI EN 300 744 Clause 4.5. \n + * Update a set of carriers with the pilot signals. \n + */ + void update_output(const gr_complex* in, gr_complex* out); + + /*! + * TODO + * ETSI EN 300 744 Clause 4.5. \n + * Extract data from a set of carriers using pilot signals. \n + * This is doing frequency correcton, equalization. \n + */ + int parse_input(const gr_complex* in, + gr_complex* out, + int* symbol_index, + int* frame_index); +}; + +class dvbt_reference_signals_impl : public dvbt_reference_signals +{ + // configuration object for this class + const dvbt_configure config; + +private: + // Pilot Generator object + dvbt_pilot_gen d_pg; + + // In and Out data length + int d_ninput; + int d_noutput; + +public: + dvbt_reference_signals_impl(int itemsize, + int ninput, + int noutput, + dvb_constellation_t constellation, + dvbt_hierarchy_t hierarchy, + dvb_code_rate_t code_rate_HP, + dvb_code_rate_t code_rate_LP, + dvb_guardinterval_t guard_interval, + dvbt_transmission_mode_t transmission_mode = gr::dtv::T2k, + int include_cell_id = 0, + int cell_id = 0); + ~dvbt_reference_signals_impl(); + + void forecast(int noutput_items, gr_vector_int& ninput_items_required); + + int general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items); +}; + +} // namespace dtv } // namespace gr #endif /* INCLUDED_DTV_DVBT_REFERENCE_SIGNALS_IMPL_H */ - |