diff options
Diffstat (limited to 'lib/receiver/receiver_impl.cc')
-rw-r--r-- | lib/receiver/receiver_impl.cc | 89 |
1 files changed, 57 insertions, 32 deletions
diff --git a/lib/receiver/receiver_impl.cc b/lib/receiver/receiver_impl.cc index 77d41a4..bc1c2e4 100644 --- a/lib/receiver/receiver_impl.cc +++ b/lib/receiver/receiver_impl.cc @@ -55,16 +55,16 @@ typedef std::vector<float> vector_float; typedef boost::circular_buffer<float> circular_buffer_float; receiver::sptr -receiver::make(int osr, int arfcn) +receiver::make(int osr, const std::vector<float> &cell_allocation, const std::vector<int> &tseq_nums) { return gnuradio::get_initial_sptr - (new receiver_impl(osr, arfcn)); + (new receiver_impl(osr, cell_allocation, tseq_nums)); } /* * The private constructor */ -receiver_impl::receiver_impl(int osr, int arfcn) +receiver_impl::receiver_impl(int osr, const std::vector<float> &cell_allocation, const std::vector<int> &tseq_nums) : gr::sync_block("receiver", gr::io_signature::make(1, -1, sizeof(gr_complex)), gr::io_signature::make(0, 0, 0)), @@ -76,8 +76,9 @@ receiver_impl::receiver_impl(int osr, int arfcn) d_state(fcch_search), d_burst_nr(osr), d_failed_sch(0), - d_arfcn((int)(arfcn)), - d_signal_dbm(-120) + d_signal_dbm(-120), + d_tseq_nums(tseq_nums), + d_cell_allocation(cell_allocation) { int i; //don't send samples to the receiver until there are at least samples for one @@ -89,7 +90,8 @@ receiver_impl::receiver_impl(int osr, int arfcn) //if first bit of the seqeunce ==1 first symbol ==-1 gmsk_mapper(train_seq[i], N_TRAIN_BITS, d_norm_training_seq[i], startpoint); } - message_port_register_out(pmt::mp("bursts")); + message_port_register_out(pmt::mp("C0")); + message_port_register_out(pmt::mp("CX")); message_port_register_out(pmt::mp("measurements")); configure_receiver(); //configure the receiver - tell it where to find which burst type } @@ -193,7 +195,7 @@ receiver_impl::work(int noutput_items, burst_type b_type; - for(int input_nr=0;input_nr<input_items.size();input_nr++) + for(int input_nr=0; input_nr<d_cell_allocation.size(); input_nr++) { double signal_pwr = 0; input = (gr_complex *)input_items[input_nr]; @@ -225,7 +227,7 @@ receiver_impl::work(int noutput_items, const unsigned last_sample = first_sample + USEFUL_BITS * d_OSR - TAIL_BITS * d_OSR; double freq_offset_tmp = compute_freq_offset(input, first_sample, last_sample); //extract frequency offset from it - send_burst(d_burst_nr, fc_fb, b_type); + send_burst(d_burst_nr, fc_fb, b_type, input_nr); pmt::pmt_t msg = pmt::make_tuple(pmt::mp("freq_offset"),pmt::from_double(freq_offset_tmp-d_freq_offset_setting),pmt::mp("synchronized")); message_port_pub(pmt::mp("measurements"), msg); @@ -237,7 +239,7 @@ receiver_impl::work(int noutput_items, d_c0_burst_start = get_sch_chan_imp_resp(input, &channel_imp_resp[0]); //get channel impulse response detect_burst(input, &channel_imp_resp[0], d_c0_burst_start, output_binary); //MLSE detection of bits - send_burst(d_burst_nr, output_binary, b_type); + send_burst(d_burst_nr, output_binary, b_type, input_nr); if (decode_sch(&output_binary[3], &t1, &t2, &t3, &d_ncc, &d_bcc) == 0) //and decode SCH data { // d_burst_nr.set(t1, t2, t3, 0); //but only to check if burst_start value is correct @@ -263,7 +265,7 @@ receiver_impl::work(int noutput_items, float normal_corr_max; //if it's normal burst d_c0_burst_start = get_norm_chan_imp_resp(input, &channel_imp_resp[0], &normal_corr_max, d_bcc); //get channel impulse response for given training sequence number - d_bcc detect_burst(input, &channel_imp_resp[0], d_c0_burst_start, output_binary); //MLSE detection of bits - send_burst(d_burst_nr, output_binary, b_type); + send_burst(d_burst_nr, output_binary, b_type, input_nr); break; } case dummy_or_normal: @@ -278,19 +280,19 @@ receiver_impl::work(int noutput_items, { d_c0_burst_start = normal_burst_start; detect_burst(input, &channel_imp_resp[0], normal_burst_start, output_binary); - send_burst(d_burst_nr, output_binary, b_type); + send_burst(d_burst_nr, output_binary, b_type, input_nr); } else { d_c0_burst_start = dummy_burst_start; - send_burst(d_burst_nr, dummy_burst, b_type); + send_burst(d_burst_nr, dummy_burst, b_type, input_nr); } break; } case rach_burst: break; case dummy: - send_burst(d_burst_nr, dummy_burst, b_type); + send_burst(d_burst_nr, dummy_burst, b_type, input_nr); break; case normal_or_noise: { @@ -301,19 +303,34 @@ receiver_impl::work(int noutput_items, std::vector<gr_complex> v(input, input + noutput_items); if(d_signal_dbm>=d_c0_signal_dbm-13) { - plot(v); - - burst_start = get_norm_chan_imp_resp(input, &channel_imp_resp[0], &normal_corr_max, 7); -// if(abs(d_c0_burst_start-burst_start)<=2){ + if(d_tseq_nums.size()==0) //there is no information about training sequence + { //however the receiver can detect it + get_norm_chan_imp_resp(input, &channel_imp_resp[0], &normal_corr_max, 0); + float ts_max=normal_corr_max; //with use of a very simple algorithm based on finding + int ts_max_num=0; //maximum correlation + for(int ss=1; ss<=7; ss++) + { + get_norm_chan_imp_resp(input, &channel_imp_resp[0], &normal_corr_max, ss); + if(ts_max<normal_corr_max) + { + ts_max = normal_corr_max; + ts_max_num = ss; + } + } + d_tseq_nums.push_back(ts_max_num); + } + int tseq_num; + if(input_nr<=d_tseq_nums.size()){ + tseq_num = d_tseq_nums[input_nr-1]; + } else { + tseq_num = d_tseq_nums.back(); + } + burst_start = get_norm_chan_imp_resp(input, &channel_imp_resp[0], &normal_corr_max, tseq_num); +// if(abs(d_c0_burst_start-burst_start)<=2){ //unused check/filter based on timing if((normal_corr_max/sqrt(signal_pwr))>=0.9){ - std::cout << static_cast<int>(d_signal_dbm) << std::endl; - COUT("d_c0_burst_start: " << d_c0_burst_start); - COUT("burst_start: " << burst_start); - std::cout << "corr max to signal ratio: " << (normal_corr_max/sqrt(signal_pwr)) << std::endl; - usleep(4e6); + detect_burst(input, &channel_imp_resp[0], burst_start, output_binary); + send_burst(d_burst_nr, output_binary, b_type, input_nr); } - detect_burst(input, &channel_imp_resp[0], burst_start, output_binary); - send_burst(d_burst_nr, output_binary, b_type); } break; } @@ -622,7 +639,6 @@ int receiver_impl::get_sch_chan_imp_resp(const gr_complex *input, gr_complex * c } - void receiver_impl::detect_burst(const gr_complex * input, gr_complex * chan_imp_resp, int burst_start, unsigned char * output_binary) { float output[BURST_SIZE]; @@ -743,7 +759,7 @@ int receiver_impl::get_norm_chan_imp_resp(const gr_complex *input, gr_complex * correlation_buffer.push_back(correlation); power_buffer.push_back(std::pow(abs(correlation), 2)); } - //plot(power_buffer); +// plot(power_buffer); //compute window energies vector_float::iterator iter = power_buffer.begin(); bool loop_end = false; @@ -788,7 +804,7 @@ int receiver_impl::get_norm_chan_imp_resp(const gr_complex *input, gr_complex * // d_channel_imp_resp.push_back(correlation); chan_imp_resp[ii] = correlation; } - + *corr_max = max_correlation; //DCOUT("strongest_window_nr_new: " << strongest_window_nr); @@ -799,7 +815,7 @@ int receiver_impl::get_norm_chan_imp_resp(const gr_complex *input, gr_complex * } -void receiver_impl::send_burst(burst_counter burst_nr, const unsigned char * burst_binary, burst_type b_type) +void receiver_impl::send_burst(burst_counter burst_nr, const unsigned char * burst_binary, burst_type b_type, unsigned int input_nr) { boost::scoped_ptr<gsmtap_hdr> tap_header(new gsmtap_hdr()); @@ -809,13 +825,17 @@ void receiver_impl::send_burst(burst_counter burst_nr, const unsigned char * bur tap_header->timeslot = static_cast<uint8_t>(d_burst_nr.get_timeslot_nr()); tap_header->frame_number = d_burst_nr.get_frame_nr(); tap_header->sub_type = static_cast<uint8_t>(b_type); - tap_header->arfcn = d_arfcn; + tap_header->arfcn = d_cell_allocation[input_nr]; tap_header->signal_dbm = static_cast<int8_t>(d_signal_dbm); pmt::pmt_t header_blob=pmt::make_blob(tap_header.get(),sizeof(gsmtap_hdr)); pmt::pmt_t burst_binary_blob=pmt::make_blob(burst_binary,BURST_SIZE); pmt::pmt_t msg = pmt::cons(header_blob, burst_binary_blob); - message_port_pub(pmt::mp("bursts"), msg); + if(input_nr==0){ + message_port_pub(pmt::mp("C0"), msg); + } else { + message_port_pub(pmt::mp("CX"), msg); + } } void receiver_impl::configure_receiver() @@ -843,9 +863,14 @@ void receiver_impl::configure_receiver() d_channel_conf.set_burst_types(TIMESLOT7, TEST51, sizeof(TEST51) / sizeof(unsigned), dummy_or_normal); } -void receiver_impl::set_arfcn(int arfcn) //!! +void receiver_impl::set_cell_allocation(const std::vector<float> &cell_allocation) +{ + d_cell_allocation = cell_allocation; +} + +void receiver_impl::set_tseq_nums(const std::vector<int> & tseq_nums) { - d_arfcn = arfcn; + d_tseq_nums = tseq_nums; } void receiver_impl::reset() |