From 37b31be5878a4a48a96ad5529b39ad699b0852f8 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Fri, 24 May 2019 16:55:02 +0000 Subject: [PATCH] - added input buffer git-svn-id: http://moon:8086/svn/software/trunk/projects/GnuRadio@454 b431acfa-c32f-4a4a-93f1-934dc6c82436 --- gr-jay/lib/peak_detect_impl.cc | 63 +++++++++++++++++++++++++--------- gr-jay/lib/peak_detect_impl.h | 5 ++- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/gr-jay/lib/peak_detect_impl.cc b/gr-jay/lib/peak_detect_impl.cc index 586fba7..aeb1886 100644 --- a/gr-jay/lib/peak_detect_impl.cc +++ b/gr-jay/lib/peak_detect_impl.cc @@ -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++; } diff --git a/gr-jay/lib/peak_detect_impl.h b/gr-jay/lib/peak_detect_impl.h index 729cde6..7b0b6d7 100644 --- a/gr-jay/lib/peak_detect_impl.h +++ b/gr-jay/lib/peak_detect_impl.h @@ -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