- added input buffer

git-svn-id: http://moon:8086/svn/software/trunk/projects/GnuRadio@454 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
2019-05-24 16:55:02 +00:00
parent c3451c5f5b
commit 37b31be587
2 changed files with 51 additions and 17 deletions
+47 -16
View File
@@ -46,11 +46,14 @@ namespace gr {
, m_alpha_m(alpha_m)
, m_frameCount(0)
{
m_pPeak = new int[vlen];
m_pPeak = new float[vlen];
m_pX = new float[vlen];
m_pXs = new float[vlen];
m_pXm = new float[vlen];
m_pPeakPos = new int[vlen];
memset(m_pPeak, 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));
@@ -64,8 +67,10 @@ namespace gr {
*/
peak_detect_impl::~peak_detect_impl()
{
delete [] m_pPeakPos;
delete [] m_pXm;
delete [] m_pXs;
delete [] m_pX;
delete [] m_pPeak;
}
@@ -86,7 +91,20 @@ namespace gr {
pDst[i] = value;
}
}
int peak_detect_impl::findPeakPos(int* pDst, float* pSrc, int length, float thresh)
{
int count = 0;
for (int i=0; i < length; i++)
{
if (pSrc[i] > thresh)
{
pDst[count++] = i;
}
}
return count;
}
int
peak_detect_impl::work(int noutput_items,
gr_vector_const_void_star &input_items,
@@ -112,10 +130,18 @@ namespace gr {
fill(m_pXm, nitems_per_block, xmean);
}
// Peak detection
// Create input vector
for (int i = 0; i < nitems_per_block; i++)
{
float x = *(iptr++);
*(optr++) = x;
m_pX[i] = x;
}
// Update of input statistics
for (int i = 0; i < nitems_per_block; i++)
{
float x = m_pX[i];
// Update of Xs
m_pXs[i] = (1.f-m_alpha_s)*m_pXs[i] + m_alpha_s*x;
@@ -136,20 +162,25 @@ namespace gr {
m_pXm[j] = last;
}
}
float peak_dist = x-m_pXm[i];
int peak = (int)(peak_dist > 10.f);
m_pPeak[i] = peak;
if (peak)
{
pmt::pmt_t tag_key = pmt::string_to_symbol("peak");
pmt::pmt_t tag_value = pmt::from_float(peak_dist);
add_item_tag(0, nitems_written(0) + i, tag_key, tag_value, m_tag_id);
}
*optr++ = x-m_pXm[i];
}
// Peak detection
for (int i = 0; i < nitems_per_block; i++)
{
float peak_dist = m_pX[i]-m_pXm[i];
m_pPeak[i] = peak_dist;
}
// Create peak list
int numPeaks = findPeakPos(m_pPeakPos, m_pPeak, nitems_per_block, 10);
for (int i = 0; i < numPeaks; i++)
{
// Create peak tags
pmt::pmt_t tag_key = pmt::string_to_symbol("peak");
pmt::pmt_t 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);
}
m_frameCount++;
}
+4 -1
View File
@@ -32,9 +32,11 @@ namespace jay {
// Nothing to declare in this block.
float m_alpha_s;
float m_alpha_m;
int *m_pPeak;
float *m_pPeak;
float *m_pX;
float *m_pXs;
float *m_pXm;
int *m_pPeakPos;
uint64_t m_frameCount;
pmt::pmt_t m_tag_id;
@@ -46,6 +48,7 @@ namespace jay {
int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items);
void fill(float *pDst, int length, float value);
float mean(float *pSrc, int length);
int findPeakPos(int *pDst, float *pSrc, int length, float thresh);
};
} // namespace jay