- fixed creating too many peaks in last stage

- added comments
- improved tags

git-svn-id: http://moon:8086/svn/software/trunk/projects/GnuRadio@459 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
2019-05-25 05:21:18 +00:00
parent 109d2368c8
commit 045de0c155
2 changed files with 26 additions and 8 deletions
+25 -7
View File
@@ -156,7 +156,9 @@ namespace gr {
m_pX[i] = x; m_pX[i] = x;
} }
// -----------------------------------------------------------------
// Update of input statistics // Update of input statistics
// -----------------------------------------------------------------
for (int i = 0; i < nitems_per_block; i++) for (int i = 0; i < nitems_per_block; i++)
{ {
float x = m_pX[i]; float x = m_pX[i];
@@ -182,21 +184,28 @@ namespace gr {
} }
} }
// -----------------------------------------------------------------
// Peak detection // Peak detection
// -----------------------------------------------------------------
// Detrend onput data X
for (int i = 0; i < nitems_per_block; i++) for (int i = 0; i < nitems_per_block; i++)
{ {
// Create peak distances by subtracting Xm // Create peak distances by subtracting Xm
float Xd = m_pX[i]-m_pXm[i]; float Xd = m_pX[i]-m_pXm[i];
m_pXd[i] = Xd; m_pXd[i] = Xd;
*(optr++) = Xd; // *(optr++) = Xd;
} }
// -----------------------------------------------------------------
// Create peak list // Create peak list
// -----------------------------------------------------------------
// Find peak candidates by thresholding // Find peak candidates by thresholding
threshold(m_pPeakData, m_pXd, nitems_per_block, 20.f); threshold(m_pPeakData, m_pXd, nitems_per_block, 20.f);
int numPeaks = findPeakPos(m_pPeakPos, m_pPeakData, nitems_per_block); int numPeaks = findPeakPos(m_pPeakPos, m_pPeakData, nitems_per_block);
// -----------------------------------------------------------------
// Search true maximum peak using hill climbing // Search true maximum peak using hill climbing
// -----------------------------------------------------------------
int numPeaksLast = 0; int numPeaksLast = 0;
while(1) while(1)
{ {
@@ -238,7 +247,9 @@ namespace gr {
} }
numPeaks = findPeakPos(m_pPeakPos, m_pPeakData, nitems_per_block); numPeaks = findPeakPos(m_pPeakPos, m_pPeakData, nitems_per_block);
// -----------------------------------------------------------------
// Sort peaks // Sort peaks
// -----------------------------------------------------------------
std::vector<int> peakPos; std::vector<int> peakPos;
for (int i = 0; i < numPeaks; i++) for (int i = 0; i < numPeaks; i++)
{ {
@@ -249,7 +260,9 @@ namespace gr {
std::sort(peakPos.begin(), peakPos.end(), cmp); std::sort(peakPos.begin(), peakPos.end(), cmp);
// -----------------------------------------------------------------
// Construct peak boxes // Construct peak boxes
// -----------------------------------------------------------------
numPeaks = 0; numPeaks = 0;
memcpy(m_pPeakBox_abs, m_pXm, nitems_per_block*sizeof(float)); memcpy(m_pPeakBox_abs, m_pXm, nitems_per_block*sizeof(float));
memset(m_pPeakBox_rel, 0, nitems_per_block*sizeof(float)); memset(m_pPeakBox_rel, 0, nitems_per_block*sizeof(float));
@@ -335,31 +348,36 @@ namespace gr {
break; break;
} }
} }
if (does_intersect == 0) if (!does_intersect)
{ {
for (int n=pbox_start; n <= pbox_end; n++) for (int n=pbox_start; n <= pbox_end; n++)
{ {
m_pPeakBox_abs[n] = box_height_abs; m_pPeakBox_abs[n] = box_height_abs;
m_pPeakBox_rel[n] = box_height_rel; m_pPeakBox_rel[n] = box_height_rel;
m_pPeakPos[numPeaks++] = pos;
} }
m_pPeakPos[numPeaks++] = pos;
} }
} }
// -----------------------------------------------------------------
// Output peak box // Output peak box
// -----------------------------------------------------------------
for (int i = 0; i < nitems_per_block; i++) for (int i = 0; i < nitems_per_block; i++)
{ {
*(optr++) = m_pPeakBox_abs[i]; *(optr++) = m_pPeakBox_abs[i];
} }
// -----------------------------------------------------------------
// Output tags // Output tags
// -----------------------------------------------------------------
for (int i = 0; i < numPeaks; i++) for (int i = 0; i < numPeaks; i++)
{ {
// Create peak tags // Create peak tags
// pmt::pmt_t dict = pmt::make_dict(); pmt::pmt_t tag_key = pmt::string_to_symbol("id");
// pmt::dict_add(&dict, &pmt::string_to_symbol("id"), &pmt::from_long(i)); pmt::pmt_t tag_value = pmt::from_long(i);
pmt::pmt_t tag_key = pmt::string_to_symbol("peak"); add_item_tag(0, nitems_written(0) + m_pPeakPos[i], tag_key, tag_value, m_tag_id);
pmt::pmt_t tag_value = pmt::from_long(m_pPeakPos[i]); tag_key = pmt::string_to_symbol("pos");
tag_value = pmt::from_long(m_pPeakPos[i]);
add_item_tag(0, nitems_written(0) + m_pPeakPos[i], tag_key, tag_value, m_tag_id); add_item_tag(0, nitems_written(0) + m_pPeakPos[i], tag_key, tag_value, m_tag_id);
} }