From d173f9e256e809b5222740c8c288ec52e9373a45 Mon Sep 17 00:00:00 2001 From: Nick Foster Date: Fri, 19 Nov 2010 16:38:32 -0800 Subject: [PATCH] Preamble detector cleanup. Better for >2 samps/symbol. --- src/lib/air_modes_preamble.cc | 67 ++++++++++++++--------------------- src/lib/air_modes_slicer.cc | 2 +- 2 files changed, 27 insertions(+), 42 deletions(-) diff --git a/src/lib/air_modes_preamble.cc b/src/lib/air_modes_preamble.cc index 994aa93..4ef3c8c 100644 --- a/src/lib/air_modes_preamble.cc +++ b/src/lib/air_modes_preamble.cc @@ -85,15 +85,15 @@ int air_modes_preamble::work(int noutput_items, //the packets are so short we choose not to do any sort of closed-loop synchronization after this simple gating. if we get a good center sample, the drift should be negligible. - pulse_offsets[0] = i; - pulse_offsets[1] = i+int(1.0 * d_samples_per_symbol); - pulse_offsets[2] = i+int(3.5 * d_samples_per_symbol); - pulse_offsets[3] = i+int(4.5 * d_samples_per_symbol); + pulse_offsets[0] = 0; + pulse_offsets[1] = int(1.0 * d_samples_per_symbol); + pulse_offsets[2] = int(3.5 * d_samples_per_symbol); + pulse_offsets[3] = int(4.5 * d_samples_per_symbol); - bit_energies[0] = bit_energy(&inraw[pulse_offsets[0]], d_samples_per_chip); - bit_energies[1] = bit_energy(&inraw[pulse_offsets[1]], d_samples_per_chip); - bit_energies[2] = bit_energy(&inraw[pulse_offsets[2]], d_samples_per_chip); - bit_energies[3] = bit_energy(&inraw[pulse_offsets[3]], d_samples_per_chip); + bit_energies[0] = bit_energy(&inraw[i+pulse_offsets[0]], d_samples_per_chip); + bit_energies[1] = bit_energy(&inraw[i+pulse_offsets[1]], d_samples_per_chip); + bit_energies[2] = bit_energy(&inraw[i+pulse_offsets[2]], d_samples_per_chip); + bit_energies[3] = bit_energy(&inraw[i+pulse_offsets[3]], d_samples_per_chip); //search for the rest of the pulses at their expected positions if( bit_energies[1] < pulse_threshold) continue; @@ -128,40 +128,25 @@ int air_modes_preamble::work(int noutput_items, //just for kicks, after validating a preamble, you might want to use all four peaks to form a more accurate "average" center sample time, so that if noise corrupts the first leading edge //sample, you don't mis-sample the entire packet. - //this could also be done in a separate packet, although it probably saves CPU to do it here - //for the 2 samples per chip case, you can just add up the peaks at the expected peak times, then do the same for +1, and -1. + //this could also be done in a separate block, although it probably saves CPU to do it here + //for the 2 samples per chip case, you can just add up the peaks at the expected peak times, then do the same for +1. if(valid_preamble) { - - gate_sum_now = bit_energies[0] + bit_energies[1] + bit_energies[2] + bit_energies[3]; -// gate_sum_early = bit_energy(&inraw[pulse_offsets[0]-1], d_samples_per_chip) -// + bit_energy(&inraw[pulse_offsets[1]-1], d_samples_per_chip) -// + bit_energy(&inraw[pulse_offsets[2]-1], d_samples_per_chip) -// + bit_energy(&inraw[pulse_offsets[3]-1], d_samples_per_chip); - gate_sum_late = bit_energy(&inraw[pulse_offsets[0]+1], d_samples_per_chip) - + bit_energy(&inraw[pulse_offsets[1]+1], d_samples_per_chip) - + bit_energy(&inraw[pulse_offsets[2]+1], d_samples_per_chip) - + bit_energy(&inraw[pulse_offsets[3]+1], d_samples_per_chip); -/* - if(d_samples_per_chip <= 2) { - gate_sum_now = inraw[pulse_offsets[0]+0] + inraw[pulse_offsets[1]+0] + inraw[pulse_offsets[2]+0] + inraw[pulse_offsets[3]+0]; - gate_sum_early = inraw[pulse_offsets[0]-1] + inraw[pulse_offsets[1]-1] + inraw[pulse_offsets[2]-1] + inraw[pulse_offsets[3]-1]; - gate_sum_late = inraw[pulse_offsets[0]+1] + inraw[pulse_offsets[1]+1] + inraw[pulse_offsets[2]+1] + inraw[pulse_offsets[3]+1]; - } else { - for(int j = 1-d_samples_per_chip/2; j < d_samples_per_chip/2; j++) { - gate_sum_now += inraw[j+pulse_offsets[0]+0] + inraw[j+pulse_offsets[1]+0] + inraw[j+pulse_offsets[2]+0] + inraw[j+pulse_offsets[3]+0]; - gate_sum_early += inraw[j+pulse_offsets[0]-1] + inraw[j+pulse_offsets[1]-1] + inraw[j+pulse_offsets[2]-1] + inraw[j+pulse_offsets[3]-1]; - gate_sum_late += inraw[j+pulse_offsets[0]+1] + inraw[j+pulse_offsets[1]+1] + inraw[j+pulse_offsets[2]+1] + inraw[j+pulse_offsets[3]+1]; - } - } -*/ -// if(gate_sum_early > gate_sum_now) { //i think this is redundant -// outattrib[i-1] = 1; -// } - /*else*/ if(gate_sum_late > gate_sum_now) { - outattrib[i+1] = 1; - i+=1; //so we skip the next one and don't overwrite it - } - else outattrib[i] = 1; + i--; + do { + i++; + gate_sum_now = bit_energy(&inraw[i+pulse_offsets[0]], d_samples_per_chip) + + bit_energy(&inraw[i+pulse_offsets[1]], d_samples_per_chip) + + bit_energy(&inraw[i+pulse_offsets[2]], d_samples_per_chip) + + bit_energy(&inraw[i+pulse_offsets[3]], d_samples_per_chip); + + + gate_sum_late = bit_energy(&inraw[i+pulse_offsets[0]+1], d_samples_per_chip) + + bit_energy(&inraw[i+pulse_offsets[1]+1], d_samples_per_chip) + + bit_energy(&inraw[i+pulse_offsets[2]+1], d_samples_per_chip) + + bit_energy(&inraw[i+pulse_offsets[3]+1], d_samples_per_chip); + } while(gate_sum_late > gate_sum_now); + + outattrib[i] = 1; } else outattrib[i] = 0; } diff --git a/src/lib/air_modes_slicer.cc b/src/lib/air_modes_slicer.cc index d83ecbb..3402ce1 100644 --- a/src/lib/air_modes_slicer.cc +++ b/src/lib/air_modes_slicer.cc @@ -167,7 +167,7 @@ int air_modes_slicer::work(int noutput_items, uint64_t timestamp_secs, timestamp_sample, timestamp_delta; double timestamp_frac; - pmt::pmt_t timestamp = pmt::mp(pmt::mp(0), pmt::mp(0)); //so we don't barf if there isn't one + pmt::pmt_t timestamp; get_tags_in_range(tags, 0, abs_sample_cnt, abs_sample_cnt + i, pmt::pmt_string_to_symbol("packet_time_stamp")); //tags.back() is the most recent timestamp, then.