- improved Peak class

- added makeBox in Peak class
- sort on Peaks


git-svn-id: http://moon:8086/svn/software/trunk/projects/GnuRadio@474 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
2019-05-26 07:16:07 +00:00
parent 19fdc08f88
commit cee80819ab
2 changed files with 101 additions and 100 deletions
+18 -77
View File
@@ -202,7 +202,7 @@ namespace gr {
// -----------------------------------------------------------------
// Search true maximum peak using hill climbing
// -----------------------------------------------------------------
std::vector<int> newPeakPos;
std::vector<Peak> newPeakPos;
int numPeaksLast = 0;
while(1)
{
@@ -225,7 +225,9 @@ namespace gr {
}
else
{
addToList(newPeakPos, pos);
Peak peak(m_peak_id++, pos);
peak.height_abs = m_pXds[pos];
addToListByPos(newPeakPos, peak);
numPeaksClimbed++;
break;
}
@@ -237,100 +239,39 @@ namespace gr {
}
numPeaksLast = numPeaksClimbed;
}
peakPos = newPeakPos;
// -----------------------------------------------------------------
// Sort peaks
// -----------------------------------------------------------------
sort<float>(m_pXds, peakPos);
sort(newPeakPos);
// -----------------------------------------------------------------
// Find peak boxes
// -----------------------------------------------------------------
m_peakList.clear();
for (int i = 0; i < peakPos.size(); i++)
for (int i = 0; i < newPeakPos.size(); i++)
{
int pbh = 0;
int pos = peakPos[i];
int left = pos;
int right = pos;
float nom = 10;
int left_found = 0;
int right_found = 0;
while(!(left_found & right_found))
Peak &peak = newPeakPos[i];
bool success = peak.makeBox(m_peak_width_min, m_peak_width_max, m_pXds, nitems_per_block);
if (success)
{
// Determine peak width left from center (pos)
if (m_pXds[left] > nom)
// Intersection check
bool intersection = false;
for (int i = 0; i < m_peakList.size(); i++)
{
if (left > 0)
if (m_peakList[i].isInRange(peak))
{
left--;
}
else
{
break;
intersection = true;
}
}
else
{
left_found = 1;
}
// Determine peak width right from center (pos)
if (m_pXds[right] > nom)
{
if (right < (nitems_per_block-1))
{
right++;
}
else
{
break;
}
}
else
{
right_found = 1;
}
int pbh_left = pos - left;
int pbh_right = right - pos;
// Take larger peak width
pbh = std::max(pbh_left, pbh_right);
// Ensure peak box is at least pb_min
pbh = std::max(pbh, m_peak_width_min);
if (pbh > m_peak_width_max)
if (!intersection)
{
pbh = 0;
break;
peak.height_rel = m_pXds[peak.pos];
peak.height_abs = m_pXs[peak.pos];
m_peakList.push_back(peak);
}
}
if (pbh == 0)
{
continue;
}
Peak peak(m_peak_id, pos, pbh, m_pXds[pos], m_pXs[pos]);
// Intersection check
bool intersection = false;
for (int i = 0; i < m_peakList.size(); i++)
{
if (m_peakList[i].isInRange(peak))
{
intersection = true;
}
}
if (!intersection)
{
m_peakList.push_back(peak);
m_peak_id++;
}
}
// -----------------------------------------------------------------