diff --git a/gr-jay/lib/peak_detect_impl.cc b/gr-jay/lib/peak_detect_impl.cc index aa60c5f..c76e791 100644 --- a/gr-jay/lib/peak_detect_impl.cc +++ b/gr-jay/lib/peak_detect_impl.cc @@ -202,7 +202,7 @@ namespace gr { // ----------------------------------------------------------------- // Search true maximum peak using hill climbing // ----------------------------------------------------------------- - std::vector newPeakPos; + std::vector peaks; int numPeaksLast = 0; while(1) { @@ -226,8 +226,8 @@ namespace gr { else { Peak peak(m_peak_id++, pos); - peak.height_abs = m_pXds[pos]; - addToListByPos(newPeakPos, peak); + peak.heightUpdate_rel(m_pXds, nitems_per_block); + addToListByPos(peaks, peak); numPeaksClimbed++; break; } @@ -243,15 +243,15 @@ namespace gr { // ----------------------------------------------------------------- // Sort peaks // ----------------------------------------------------------------- - sort(newPeakPos); + sort(peaks); // ----------------------------------------------------------------- // Find peak boxes // ----------------------------------------------------------------- m_peakList.clear(); - for (int i = 0; i < newPeakPos.size(); i++) + for (int i = 0; i < peaks.size(); i++) { - Peak &peak = newPeakPos[i]; + Peak &peak = peaks[i]; bool success = peak.makeBox(m_peak_width_min, m_peak_width_max, m_pXds, nitems_per_block); if (success) { @@ -259,9 +259,10 @@ namespace gr { bool intersection = false; for (int i = 0; i < m_peakList.size(); i++) { - if (m_peakList[i].isInRange(peak)) + if (m_peakList[i].isIntersect(peak)) { intersection = true; + break; } } @@ -278,16 +279,31 @@ namespace gr { // Peak management // ----------------------------------------------------------------- temp.clear(); + for (int j=0; j < m_peakHistory.size(); j++) + { + Peak &peak = m_peakHistory[j]; + peak.heightUpdate_rel(m_pXds, nitems_per_block); + + if (peak.height_rel >= (m_peak_height_min-6.f)) + { + temp.push_back(peak); + } + else + { + fprintf(stderr, "Lost Peak #%u at %d\n", (int)peak.id, (int)peak.pos); + } + } + for (int i = 0; i < m_peakList.size(); i++) { Peak &peak = m_peakList[i]; - + bool found = false; - for (int j=0; j < m_peakHistory.size(); j++) + for (int j=0; j < temp.size(); j++) { - if (m_peakHistory[j].isInRange(peak)) + if (temp[j].isInRange(peak)) { - temp.push_back(m_peakHistory[j].update(peak)); + temp[j].merge(peak); found = true; break; } @@ -295,20 +311,11 @@ namespace gr { if (!found) { - peak.isValid = 1; temp.push_back(peak); fprintf(stderr, "New Peak #%u at %d\n", (int)peak.id, (int)peak.pos); } } - for (int j=0; j < m_peakHistory.size(); j++) - { - Peak &peak = m_peakHistory[j]; - if (!peak.isValid) - { - fprintf(stderr, "Lost Peak #%u at %d\n", (int)peak.id, (int)peak.pos); - } - } m_peakHistory.clear(); m_peakHistory = temp; @@ -350,7 +357,6 @@ namespace gr { pmt::pmt_t tag_key = pmt::string_to_symbol(std::string("pos_id_") + std::to_string(peak.id)); pmt::pmt_t tag_value = pmt::from_long(peak.pos); add_item_tag(DATA, nitems_written(DATA) + k, tag_key, tag_value, m_tag_id); - peak.isValid = false; } m_frameCount++; diff --git a/gr-jay/lib/peak_detect_impl.h b/gr-jay/lib/peak_detect_impl.h index 77016a9..b84095f 100644 --- a/gr-jay/lib/peak_detect_impl.h +++ b/gr-jay/lib/peak_detect_impl.h @@ -46,7 +46,6 @@ namespace jay { , pbh(_pbh) , height_rel(_height_rel) , height_abs(_height_abs) - , isValid(true) { } @@ -55,13 +54,37 @@ namespace jay { int pbh; float height_rel; float height_abs; - bool isValid; - bool isInRange(const Peak &other) + bool isInRange(const Peak &other) const { return (other.pos >= left()) and (other.pos <= right()); } + bool isIntersect(const Peak &other) const + { + return (right() >= other.left()) and (other.right() >= left()); + } + + void heightUpdate_rel(float const *pData, int length) + { + float newHeight = -100.f; + for (int i=left(); i <= right(); i++) + { + newHeight = std::max(newHeight, pData[i]); + } + height_rel = newHeight; + } + + void heightUpdate_abs(float const *pData, int length) + { + float newHeight = -100.f; + for (int i=left(); i <= right(); i++) + { + newHeight = std::max(newHeight, pData[i]); + } + height_abs = newHeight; + } + bool makeBox(int pbh_min, int pbh_max, float const *pData, int length) { pbh = 0; @@ -124,7 +147,7 @@ namespace jay { return pbh > 0; } - const Peak& update(const Peak &other) + const Peak& merge(const Peak &other) { float beta = 0.1f; float alpha = (1.f-beta); @@ -132,16 +155,15 @@ namespace jay { pbh = alpha*pbh + beta*other.pbh; height_rel = std::max(height_rel, other.height_rel); height_abs = std::max(height_abs, other.height_abs); - isValid = true; return *this; } - int left() + int left() const { return pos - pbh; } - int right() + int right() const { return pos + pbh; } @@ -215,7 +237,7 @@ namespace jay { int newn = 1; for (int i=0; i < (n-1); i++) { - if (peaks[i].height_abs < peaks[i+1].height_abs) + if (peaks[i].height_rel < peaks[i+1].height_rel) { Peak temp = peaks[i+1]; peaks[i+1] = peaks[i];