- refactored

git-svn-id: http://moon:8086/svn/software/trunk/projects/GnuRadio@473 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
2019-05-26 06:27:04 +00:00
parent c4bab1d74c
commit 19fdc08f88
2 changed files with 94 additions and 65 deletions
+22 -50
View File
@@ -53,23 +53,19 @@ namespace gr {
, m_peakHistory(0)
, m_peak_id(0)
{
m_pPeakData = new float[vlen];
m_pX = new float[vlen];
m_pXs = new float[vlen];
m_pXm = new float[vlen];
m_pXd = new float[vlen];
m_pXds = new float[vlen];
m_pPeakPos = new int[vlen];
m_pPeakBox_rel = new float[vlen];
m_pPeakBox_abs = new float[vlen];
memset(m_pPeakData, 0, vlen*sizeof(int));
memset(m_pX, 0, vlen*sizeof(float));
memset(m_pXs, 0, vlen*sizeof(float));
memset(m_pXm, 0, vlen*sizeof(float));
memset(m_pXd, 0, vlen*sizeof(float));
memset(m_pXds, 0, vlen*sizeof(float));
memset(m_pPeakPos, 0, vlen*sizeof(int));
memset(m_pPeakBox_rel, 0, vlen*sizeof(float));
memset(m_pPeakBox_abs, 0, vlen*sizeof(float));
@@ -86,13 +82,11 @@ namespace gr {
{
delete [] m_pPeakBox_abs;
delete [] m_pPeakBox_rel;
delete [] m_pPeakPos;
delete [] m_pXds;
delete [] m_pXd;
delete [] m_pXm;
delete [] m_pXs;
delete [] m_pX;
delete [] m_pPeakData;
}
float peak_detect_impl::mean(float* pSrc, int length)
@@ -112,29 +106,20 @@ namespace gr {
pDst[i] = value;
}
}
int peak_detect_impl::threshold(float *pDst, float *pSrc, int length, float thresh)
std::vector<int> peak_detect_impl::findPeakPos(float* pSrc, int length, float thresh)
{
std::vector<int> result;
for (int i=0; i < length; i++)
{
pDst[i] = (int)(pSrc[i] >= thresh);
}
return length;
}
int peak_detect_impl::findPeakPos(int* pDst, float* pSrc, int length)
{
int count = 0;
for (int i=0; i < length; i++)
{
if (pSrc[i] > 0)
if (pSrc[i] > thresh)
{
pDst[count++] = i;
result.push_back(i);
}
}
return count;
return result;
}
int
peak_detect_impl::work(int noutput_items,
gr_vector_const_void_star &input_items,
@@ -212,19 +197,19 @@ namespace gr {
// Create peak list
// -----------------------------------------------------------------
// Find peak candidates by thresholding
threshold(m_pPeakData, m_pXds, nitems_per_block, m_peak_height_min);
int numPeaks = findPeakPos(m_pPeakPos, m_pPeakData, nitems_per_block);
std::vector<int> peakPos = findPeakPos(m_pXds, nitems_per_block, m_peak_height_min);
// -----------------------------------------------------------------
// Search true maximum peak using hill climbing
// -----------------------------------------------------------------
std::vector<int> newPeakPos;
int numPeaksLast = 0;
while(1)
{
int numPeaksClimbed = 0;
for (int i = 0; i < numPeaks; i++)
for (int i = 0; i < peakPos.size(); i++)
{
int pos = m_pPeakPos[i];
int pos = peakPos[i];
while(1)
{
float y0 = m_pXs[pos];
@@ -232,20 +217,15 @@ namespace gr {
int pos_n = std::max(0, pos-1);
if (m_pXs[pos_p] > y0)
{
m_pPeakData[pos] = 0;
m_pPeakData[pos_n] = 0;
pos = pos_p;
}
else if (m_pXs[pos_n] > y0)
{
m_pPeakData[pos] = 0;
m_pPeakData[pos_p] = 0;
pos = pos_n;
}
else
{
m_pPeakData[pos_n] = 0;
m_pPeakData[pos_p] = 0;
addToList(newPeakPos, pos);
numPeaksClimbed++;
break;
}
@@ -257,21 +237,21 @@ namespace gr {
}
numPeaksLast = numPeaksClimbed;
}
numPeaks = findPeakPos(m_pPeakPos, m_pPeakData, nitems_per_block);
peakPos = newPeakPos;
// -----------------------------------------------------------------
// Sort peaks
// -----------------------------------------------------------------
sort<float>(m_pXds, m_pPeakPos, numPeaks);
sort<float>(m_pXds, peakPos);
// -----------------------------------------------------------------
// Find peak boxes
// -----------------------------------------------------------------
m_peakList.clear();
for (int i = 0; i < numPeaks; i++)
for (int i = 0; i < peakPos.size(); i++)
{
int pbh = 0;
int pos = m_pPeakPos[i];
int pos = peakPos[i];
int left = pos;
int right = pos;
float nom = 10;
@@ -334,15 +314,7 @@ namespace gr {
continue;
}
Peak peak =
{
.id = m_peak_id,
.pos = (float)pos,
.half_width = (float)pbh,
.height_rel = m_pXds[pos],
.height_abs = m_pXs[pos],
.isConfirmed = true,
};
Peak peak(m_peak_id, pos, pbh, m_pXds[pos], m_pXs[pos]);
// Intersection check
bool intersection = false;
@@ -382,7 +354,7 @@ namespace gr {
if (!found)
{
peak.isConfirmed = 1;
peak.isValid = 1;
temp.push_back(peak);
fprintf(stderr, "New Peak #%u at %d\n", (int)peak.id, (int)peak.pos);
}
@@ -391,7 +363,7 @@ namespace gr {
for (int j=0; j < m_peakHistory.size(); j++)
{
Peak &peak = m_peakHistory[j];
if (!peak.isConfirmed)
if (!peak.isValid)
{
fprintf(stderr, "Lost Peak #%u at %d\n", (int)peak.id, (int)peak.pos);
}
@@ -408,8 +380,8 @@ namespace gr {
{
Peak &peak = m_peakHistory[i];
// Use peak width for peak box
int pbox_start = std::max(0, (int)(peak.pos - peak.half_width + 0.5f));
int pbox_end = std::min(nitems_per_block-1, (int)(peak.pos + peak.half_width + 0.5f));
int pbox_start = std::max(0, peak.left());
int pbox_end = std::min(nitems_per_block-1, peak.right());
for (int j=pbox_start; j <= pbox_end; j++)
{
@@ -437,7 +409,7 @@ 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.isConfirmed = false;
peak.isValid = false;
}
m_frameCount++;