Peak Manager

- renamed ports to status[0..N]
- emiut gain messages 

PekaDetect
- emit peak messages also on peak height changes

git-svn-id: http://moon:8086/svn/software/trunk/projects/GnuRadio@499 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
2019-05-29 09:58:23 +00:00
parent b665890f9e
commit a50f613991
4 changed files with 123 additions and 60 deletions
-5
View File
@@ -22,11 +22,6 @@
<source> <source>
<name>status</name> <name>status</name>
<type>message</type> <type>message</type>
<optional>1</optional>
</source>
<source>
<name>freq</name>
<type>message</type>
<nports>$numPeaksMax</nports> <nports>$numPeaksMax</nports>
<optional>1</optional> <optional>1</optional>
</source> </source>
+19 -15
View File
@@ -293,6 +293,7 @@ namespace gr {
{ {
Peak &peak = m_peakHistory[j]; Peak &peak = m_peakHistory[j];
peak.heightUpdate_rel(m_pXds, nitems_per_block); peak.heightUpdate_rel(m_pXds, nitems_per_block);
peak.heightUpdate_abs(m_pXs, nitems_per_block);
if (peak.height_rel >= (m_peak_height_min-10.f)) if (peak.height_rel >= (m_peak_height_min-10.f))
{ {
@@ -300,46 +301,49 @@ namespace gr {
} }
else else
{ {
// Output OFF-tags peak.setState(0);
pmt::pmt_t dict = peak.msg(0); // Output tags
pmt::pmt_t dict = peak.msg();
message_port_pub(m_msg_port_out, dict); message_port_pub(m_msg_port_out, dict);
add_item_tag(DATA, nitems_written(DATA) + k, pmt::string_to_symbol(std::string("peak")), dict, m_tag_id); add_item_tag(DATA, nitems_written(DATA) + k, pmt::string_to_symbol(std::string("peak")), dict, m_tag_id);
} }
} }
for (int i = 0; i < m_peakList.size(); i++) for (int i = 0; i < m_peakList.size(); i++)
{ {
Peak &peak = m_peakList[i]; Peak &peak = m_peakList[i];
peak.heightUpdate_rel(m_pXds, nitems_per_block);
peak.heightUpdate_abs(m_pXs, nitems_per_block);
bool found = false; bool found = false;
for (int j=0; j < temp.size(); j++) for (int j=0; j < temp.size(); j++)
{ {
if (temp[j].isInRange(peak)) if (temp[j].isInRange(peak))
{ {
bool changed = temp[j].update(peak);
found = true; found = true;
if (changed)
{
pmt::pmt_t dict = temp[j].msg(1);
message_port_pub(m_msg_port_out, dict);
add_item_tag(DATA, nitems_written(DATA) + k, pmt::string_to_symbol(std::string("peak")), dict, m_tag_id);
}
break; break;
} }
} }
if (!found) if (!found)
{ {
peak.setState(1);
temp.push_back(peak); temp.push_back(peak);
// Output ON-tags
pmt::pmt_t dict = peak.msg(1);
message_port_pub(m_msg_port_out, dict);
add_item_tag(DATA, nitems_written(DATA) + k, pmt::string_to_symbol(std::string("peak")), dict, m_tag_id);
} }
} }
for (int j=0; j < temp.size(); j++)
{
Peak &peak = temp[j];
if (peak.isModified)
{
pmt::pmt_t dict = peak.msg();
message_port_pub(m_msg_port_out, dict);
add_item_tag(DATA, nitems_written(DATA) + k, pmt::string_to_symbol(std::string("peak")), dict, m_tag_id);
}
}
m_peakHistory.clear(); m_peakHistory.clear();
m_peakHistory = temp; m_peakHistory = temp;
+74 -18
View File
@@ -42,6 +42,8 @@ namespace jay {
} }
Peak(uint64_t _id, int _pos, int _pbh, float _frequency, float _height_rel, float _height_abs) Peak(uint64_t _id, int _pos, int _pbh, float _frequency, float _height_rel, float _height_abs)
: id(_id) : id(_id)
, isModified(false)
, state(0)
, pos(_pos) , pos(_pos)
, pbh(_pbh) , pbh(_pbh)
, frequency(_frequency) , frequency(_frequency)
@@ -51,6 +53,8 @@ namespace jay {
} }
uint64_t id; uint64_t id;
bool isModified;
int state;
int pos; int pos;
int pbh; int pbh;
float height_rel; float height_rel;
@@ -69,22 +73,60 @@ namespace jay {
void heightUpdate_rel(float const *pData, int length) void heightUpdate_rel(float const *pData, int length)
{ {
float newHeight = -100.f; if (pbh)
for (int i=left(); i <= right(); i++)
{ {
newHeight = std::max(newHeight, pData[i]); int newPos = -1;
float newHeight = -100.f;
for (int i=left(); i <= right(); i++)
{
if (newHeight < pData[i])
{
newPos = i;
newHeight = pData[i];
}
}
if (pos != newPos)
{
isModified = true;
pos = newPos;
}
if (std::fabs(height_rel-newHeight) >= 3.0f)
{
isModified = true;
height_rel = newHeight;
}
} }
height_rel = newHeight;
} }
void heightUpdate_abs(float const *pData, int length) void heightUpdate_abs(float const *pData, int length)
{ {
float newHeight = -100.f; if (pbh)
for (int i=left(); i <= right(); i++)
{ {
newHeight = std::max(newHeight, pData[i]); int newPos = -1;
float newHeight = -100.f;
for (int i=left(); i <= right(); i++)
{
if (newHeight < pData[i])
{
newPos = i;
newHeight = pData[i];
}
}
if (pos != newPos)
{
isModified = true;
height_abs = newHeight;
}
if (std::fabs(height_abs-newHeight) >= 3.0f)
{
isModified = true;
height_rel = newHeight;
}
} }
height_abs = newHeight;
} }
bool makeBox(int pbh_min, int pbh_max, float const *pData, int length) bool makeBox(int pbh_min, int pbh_max, float const *pData, int length)
@@ -146,26 +188,30 @@ namespace jay {
break; break;
} }
} }
// isModified = true;
return pbh > 0; return pbh > 0;
} }
bool update(const Peak &other) bool update(const Peak &other)
{ {
bool changed = false; if (std::fabs(height_rel-other.height_rel) >= 3.0f)
{
isModified = true;
}
if (std::fabs(height_abs-other.height_abs) >= 3.0f)
{
isModified = true;
}
if (pos != other.pos) if (pos != other.pos)
{ {
changed = true; isModified = true;
}
if (std::abs(frequency-other.frequency) >= (0.01*1e6))
{
changed = true;
} }
frequency = other.frequency; frequency = other.frequency;
pos = other.pos; pos = other.pos;
pbh = other.pbh; pbh = other.pbh;
height_rel = other.height_rel; height_rel = other.height_rel;
height_abs = other.height_abs; height_abs = other.height_abs;
return changed; return isModified;
} }
int left() const int left() const
@@ -178,17 +224,27 @@ namespace jay {
return pos + pbh; return pos + pbh;
} }
pmt::pmt_t msg(int state) pmt::pmt_t msg()
{ {
pmt::pmt_t dict = pmt::make_dict(); pmt::pmt_t dict = pmt::make_dict();
dict = pmt::dict_add(dict, pmt::string_to_symbol(std::string("id")), pmt::from_long(id)); dict = pmt::dict_add(dict, pmt::string_to_symbol(std::string("id")), pmt::from_long(id));
dict = pmt::dict_add(dict, pmt::string_to_symbol(std::string("pos")), pmt::from_long(pos)); dict = pmt::dict_add(dict, pmt::string_to_symbol(std::string("pos")), pmt::from_long(pos));
dict = pmt::dict_add(dict, pmt::string_to_symbol(std::string("freq_Hz")), pmt::from_float(frequency)); dict = pmt::dict_add(dict, pmt::string_to_symbol(std::string("freq_Hz")), pmt::from_float(frequency));
dict = pmt::dict_add(dict, pmt::string_to_symbol(std::string("height")), pmt::from_float(height_rel)); dict = pmt::dict_add(dict, pmt::string_to_symbol(std::string("height")), pmt::from_float(height_abs));
dict = pmt::dict_add(dict, pmt::string_to_symbol(std::string("state")), pmt::from_long(state)); dict = pmt::dict_add(dict, pmt::string_to_symbol(std::string("state")), pmt::from_long(state));
isModified = false;
return dict; return dict;
} }
void setState(int _state)
{
if (_state != state)
{
isModified = true;
}
state = _state;
}
}; };
private: private:
+30 -22
View File
@@ -45,12 +45,12 @@ class peak_manager(gr.basic_block):
self.message_port_register_out(pmt.intern("status")) self.message_port_register_out(pmt.intern("status"))
if self.numPeaksMax < 2: if self.numPeaksMax < 2:
out_port_name = "freq" out_port_name = "status"
self.ports_avail.append(out_port_name) self.ports_avail.append(out_port_name)
self.message_port_register_out(pmt.intern(out_port_name)) self.message_port_register_out(pmt.intern(out_port_name))
else: else:
for n in range(0, self.numPeaksMax): for n in range(0, self.numPeaksMax):
out_port_name = "freq" + str(n) out_port_name = "status" + str(n)
self.ports_avail.append(out_port_name) self.ports_avail.append(out_port_name)
self.message_port_register_out(pmt.intern(out_port_name)) self.message_port_register_out(pmt.intern(out_port_name))
@@ -84,7 +84,7 @@ class peak_manager(gr.basic_block):
if pmt.is_dict(msg): if pmt.is_dict(msg):
items = pmt.dict_items(msg) items = pmt.dict_items(msg)
peak = {} peakMsg = {}
for n in range(0, pmt.length(items)): for n in range(0, pmt.length(items)):
pair = pmt.nth(n, items) pair = pmt.nth(n, items)
key = pmt.car(pair) key = pmt.car(pair)
@@ -94,41 +94,49 @@ class peak_manager(gr.basic_block):
if pmt.is_integer(val): if pmt.is_integer(val):
value = pmt.to_long(val) value = pmt.to_long(val)
peak[key_str] = value peakMsg[key_str] = value
# print("{}={}".format(key_str, value)) # print("{}={}".format(key_str, value))
elif pmt.is_real(val): elif pmt.is_real(val):
value = pmt.to_float(val) value = pmt.to_float(val)
peak[key_str] = value peakMsg[key_str] = value
# print("{}={}".format(key_str, value)) # print("{}={}".format(key_str, value))
elif pmt.is_bool(val): elif pmt.is_bool(val):
value = pmt.to_bool(val) value = pmt.to_bool(val)
peak[key_str] = value peakMsg[key_str] = value
# print("{}={}".format(key_str, value)) # print("{}={}".format(key_str, value))
id = peak['id'] id = peakMsg['id']
freq_MHz = peak['freq_Hz']*1e-6 freq_MHz = peakMsg['freq_Hz']*1e-6
peak_key = 'peak' + str(id) peak_key = 'peak' + str(id)
peak0 = self.peak_get(peak_key) peakEntry = self.peak_get(peak_key)
if peak['state'] == 1: if peakMsg['state'] == 1:
if peak0 is not None: if peakEntry is not None:
pair = pmt.cons(pmt.intern("freq"), pmt.from_float(peak['freq_Hz'])) portname = peakEntry['port_name']
portname = peak0['port_name']
print("Update " + peak_key + "(" + portname + ")") print("Update " + peak_key + "(" + portname + ")")
pair = pmt.cons(pmt.intern("freq"), pmt.from_float(peakMsg['freq_Hz']))
self.message_port_pub(pmt.intern(portname), pair)
pair = pmt.cons(pmt.intern("gain"), pmt.from_float(-peakMsg['height']))
self.message_port_pub(pmt.intern(portname), pair) self.message_port_pub(pmt.intern(portname), pair)
else: else:
print ("New peak #{} at {:0.2f} MHz".format(id, freq_MHz)) print ("New peak #{} at {:0.2f} MHz".format(id, freq_MHz))
peak0 = self.peak_add(peak_key, peak) peakEntry = self.peak_add(peak_key, peakMsg)
pair = pmt.cons(pmt.intern("freq"), pmt.from_float(peak['freq_Hz'])) if peakEntry is not None:
portname = peak0['port_name'] portname = peakEntry['port_name']
print("Added " + peak_key + "(" + portname + ")") print("Added " + peak_key + "(" + portname + ")")
self.message_port_pub(pmt.intern(portname), pair) pair = pmt.cons(pmt.intern("freq"), pmt.from_float(peakMsg['freq_Hz']))
self.message_port_pub(pmt.intern(portname), pair)
pair = pmt.cons(pmt.intern("gain"), pmt.from_float(-peakMsg['height']))
self.message_port_pub(pmt.intern(portname), pair)
else: else:
print ("Lost peak #{} at {:0.2f} MHz".format(id, freq_MHz)) if peakEntry is not None:
portname = peak0['port_name'] print ("Lost peak #{} at {:0.2f} MHz".format(id, freq_MHz))
if self.peak_del(peak_key): portname = peakEntry['port_name']
print("Deleted " + peak_key + "(" + portname + ")") pair = pmt.cons(pmt.intern("gain"), pmt.from_float(-120.0))
self.message_port_pub(pmt.intern(portname), pair)
if self.peak_del(peak_key):
print("Deleted " + peak_key + "(" + portname + ")")
else: else: