- Peak detector delivers frequency instead of bin
git-svn-id: http://moon:8086/svn/software/trunk/projects/GnuRadio@492 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
<key>jay_peak_detect</key>
|
<key>jay_peak_detect</key>
|
||||||
<category>[jay]</category>
|
<category>[jay]</category>
|
||||||
<import>import jay</import>
|
<import>import jay</import>
|
||||||
<make>jay.peak_detect($vlen, $framerate, $peak_height_min, $peak_width_min, $peak_width_max, $alpha_s, $alpha_m)</make>
|
<make>jay.peak_detect($vlen, $framerate, $bandwidth, $fcenter, $peak_height_min, $peak_width_min, $peak_width_max, $alpha_s, $alpha_m)</make>
|
||||||
<!-- Make one 'param' node for every Parameter you want settable from the GUI.
|
<!-- Make one 'param' node for every Parameter you want settable from the GUI.
|
||||||
Sub-nodes:
|
Sub-nodes:
|
||||||
* name
|
* name
|
||||||
@@ -22,6 +22,18 @@
|
|||||||
<value>30</value>
|
<value>30</value>
|
||||||
<type>float</type>
|
<type>float</type>
|
||||||
</param>
|
</param>
|
||||||
|
<param>
|
||||||
|
<name>Bandwidth (Hz)</name>
|
||||||
|
<key>bandwidth</key>
|
||||||
|
<value>samp_rate</value>
|
||||||
|
<type>float</type>
|
||||||
|
</param>
|
||||||
|
<param>
|
||||||
|
<name>Center Frequency (Hz)</name>
|
||||||
|
<key>fcenter</key>
|
||||||
|
<value>0</value>
|
||||||
|
<type>float</type>
|
||||||
|
</param>
|
||||||
<param>
|
<param>
|
||||||
<name>Peak Height Minimum [dB]</name>
|
<name>Peak Height Minimum [dB]</name>
|
||||||
<key>peak_height_min</key>
|
<key>peak_height_min</key>
|
||||||
|
|||||||
@@ -4,7 +4,15 @@
|
|||||||
<key>jay_peak_manager</key>
|
<key>jay_peak_manager</key>
|
||||||
<category>[jay]</category>
|
<category>[jay]</category>
|
||||||
<import>import jay</import>
|
<import>import jay</import>
|
||||||
<make>jay.peak_manager()</make>
|
<make>jay.peak_manager($test)</make>
|
||||||
|
|
||||||
|
<param>
|
||||||
|
<name>Test</name>
|
||||||
|
<key>test</key>
|
||||||
|
<value>1024</value>
|
||||||
|
<type>int</type>
|
||||||
|
</param>
|
||||||
|
|
||||||
<sink>
|
<sink>
|
||||||
<name>control</name>
|
<name>control</name>
|
||||||
<type>message</type>
|
<type>message</type>
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ namespace gr {
|
|||||||
* class. jay::peak_detect::make is the public interface for
|
* class. jay::peak_detect::make is the public interface for
|
||||||
* creating new instances.
|
* creating new instances.
|
||||||
*/
|
*/
|
||||||
static sptr make(int vlen, float framerate, float peak_height_min, int peak_width_min, int peak_width_max, float alpha_s, float alpha_m);
|
static sptr make(int vlen, float framerate, float bandwidth, float fcenter, float peak_height_min, int peak_width_min, int peak_width_max, float alpha_s, float alpha_m);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace jay
|
} // namespace jay
|
||||||
|
|||||||
@@ -29,20 +29,23 @@ namespace gr {
|
|||||||
namespace jay {
|
namespace jay {
|
||||||
|
|
||||||
peak_detect::sptr
|
peak_detect::sptr
|
||||||
peak_detect::make(int vlen, float framerate, float peak_height_min, int peak_width_min, int peak_width_max, float alpha_s, float alpha_m)
|
peak_detect::make(int vlen, float framerate, float bandwidth, float fcenter, float peak_height_min, int peak_width_min, int peak_width_max, float alpha_s, float alpha_m)
|
||||||
{
|
{
|
||||||
return gnuradio::get_initial_sptr
|
return gnuradio::get_initial_sptr
|
||||||
(new peak_detect_impl(vlen, framerate, peak_height_min, peak_width_min, peak_width_max, alpha_s, alpha_m));
|
(new peak_detect_impl(vlen, framerate, bandwidth, fcenter, peak_height_min, peak_width_min, peak_width_max, alpha_s, alpha_m));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The private constructor
|
* The private constructor
|
||||||
*/
|
*/
|
||||||
peak_detect_impl::peak_detect_impl(int vlen, float framerate, float peak_height_min, int peak_width_min, int peak_width_max, float alpha_s, float alpha_m)
|
peak_detect_impl::peak_detect_impl(int vlen, float framerate, float bandwidth, float fcenter, float peak_height_min, int peak_width_min, int peak_width_max, float alpha_s, float alpha_m)
|
||||||
: gr::sync_block("peak_detect"
|
: gr::sync_block("peak_detect"
|
||||||
, gr::io_signature::make(1, 1, vlen*sizeof(float))
|
, gr::io_signature::make(1, 1, vlen*sizeof(float))
|
||||||
, gr::io_signature::make(2, 2, vlen*sizeof(float)))
|
, gr::io_signature::make(2, 2, vlen*sizeof(float)))
|
||||||
|
, m_vlen(vlen)
|
||||||
, m_framerate (framerate)
|
, m_framerate (framerate)
|
||||||
|
, m_bandwidth (bandwidth)
|
||||||
|
, m_fcenter (fcenter)
|
||||||
, m_peak_height_min (peak_height_min)
|
, m_peak_height_min (peak_height_min)
|
||||||
, m_peak_width_min (peak_width_min)
|
, m_peak_width_min (peak_width_min)
|
||||||
, m_peak_width_max (peak_width_max)
|
, m_peak_width_max (peak_width_max)
|
||||||
@@ -230,7 +233,12 @@ namespace gr {
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Peak peak(m_peak_id++, pos);
|
// pos = float(peak['pos'] - self.nfft / 2)
|
||||||
|
// freq_Hz = self.fcenter + 1.0 / self.nfft * self.bandwidth * pos
|
||||||
|
|
||||||
|
float pos_shifted = (float)(pos-m_vlen/2);
|
||||||
|
float freq_Hz = m_fcenter + m_bandwidth*pos_shifted/m_vlen;
|
||||||
|
Peak peak(m_peak_id++, pos, freq_Hz);
|
||||||
peak.height_rel = m_pXds[pos];
|
peak.height_rel = m_pXds[pos];
|
||||||
addToListByPos(peaks, peak);
|
addToListByPos(peaks, peak);
|
||||||
numPeaksClimbed++;
|
numPeaksClimbed++;
|
||||||
|
|||||||
@@ -31,19 +31,20 @@ namespace jay {
|
|||||||
struct Peak
|
struct Peak
|
||||||
{
|
{
|
||||||
Peak()
|
Peak()
|
||||||
: Peak(0, 0, 0, 0.0, 0.0)
|
: Peak(0, 0, 0, 0.0, 0.0, 0.0)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
Peak(uint64_t _id, int _pos)
|
Peak(uint64_t _id, int _pos, float frequency)
|
||||||
: Peak(_id, _pos, 0, 0.0, 0.0)
|
: Peak(_id, _pos, 0, frequency, 0.0, 0.0)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
Peak(uint64_t _id, int _pos, int _pbh, 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)
|
||||||
, pos(_pos)
|
, pos(_pos)
|
||||||
, pbh(_pbh)
|
, pbh(_pbh)
|
||||||
|
, frequency(_frequency)
|
||||||
, height_rel(_height_rel)
|
, height_rel(_height_rel)
|
||||||
, height_abs(_height_abs)
|
, height_abs(_height_abs)
|
||||||
{
|
{
|
||||||
@@ -54,6 +55,7 @@ namespace jay {
|
|||||||
int pbh;
|
int pbh;
|
||||||
float height_rel;
|
float height_rel;
|
||||||
float height_abs;
|
float height_abs;
|
||||||
|
float frequency;
|
||||||
|
|
||||||
bool isInRange(const Peak &other) const
|
bool isInRange(const Peak &other) const
|
||||||
{
|
{
|
||||||
@@ -153,6 +155,7 @@ namespace jay {
|
|||||||
float alpha = (1.f-beta);
|
float alpha = (1.f-beta);
|
||||||
float pos_f = alpha*(float)pos + beta*(float)other.pos;
|
float pos_f = alpha*(float)pos + beta*(float)other.pos;
|
||||||
float pbh_f = alpha*(float)pbh + beta*(float)other.pbh;
|
float pbh_f = alpha*(float)pbh + beta*(float)other.pbh;
|
||||||
|
float frequency = alpha*(float)frequency + beta*(float)other.frequency;
|
||||||
pos = (int)(pos_f + 0.5f);
|
pos = (int)(pos_f + 0.5f);
|
||||||
pbh = (int)(pbh_f + 0.5f);
|
pbh = (int)(pbh_f + 0.5f);
|
||||||
height_rel = other.height_rel;
|
height_rel = other.height_rel;
|
||||||
@@ -175,6 +178,7 @@ namespace jay {
|
|||||||
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("height")), pmt::from_float(height_rel));
|
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("state")), pmt::from_long(state));
|
dict = pmt::dict_add(dict, pmt::string_to_symbol(std::string("state")), pmt::from_long(state));
|
||||||
|
|
||||||
@@ -222,7 +226,10 @@ namespace jay {
|
|||||||
return !found;
|
return !found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int m_vlen;
|
||||||
float m_framerate;
|
float m_framerate;
|
||||||
|
float m_bandwidth;
|
||||||
|
float m_fcenter;
|
||||||
float m_peak_height_min;
|
float m_peak_height_min;
|
||||||
int m_peak_width_min;
|
int m_peak_width_min;
|
||||||
int m_peak_width_max;
|
int m_peak_width_max;
|
||||||
@@ -245,7 +252,7 @@ namespace jay {
|
|||||||
pmt::pmt_t m_msg_port_out;
|
pmt::pmt_t m_msg_port_out;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
peak_detect_impl(int vlen, float framerate, float peak_height_min, int peak_width_min, int peak_width_max, float alpha_s, float alpha_m);
|
peak_detect_impl(int vlen, float framerate, float bandwidth, float fcenter, float peak_height_min, int peak_width_min, int peak_width_max, float alpha_s, float alpha_m);
|
||||||
~peak_detect_impl();
|
~peak_detect_impl();
|
||||||
|
|
||||||
// Where all the action really happens
|
// Where all the action really happens
|
||||||
|
|||||||
@@ -27,12 +27,16 @@ class peak_manager(gr.basic_block):
|
|||||||
"""
|
"""
|
||||||
docstring for block peak_manager
|
docstring for block peak_manager
|
||||||
"""
|
"""
|
||||||
def __init__(self):
|
def __init__(self, test):
|
||||||
gr.basic_block.__init__(self,
|
gr.basic_block.__init__(self,
|
||||||
name="peak_manager",
|
name="peak_manager",
|
||||||
in_sig=None,
|
in_sig=None,
|
||||||
out_sig=None)
|
out_sig=None)
|
||||||
|
|
||||||
|
self.test = test
|
||||||
|
|
||||||
|
print ("test : ", test)
|
||||||
|
|
||||||
# Register in / out message ports
|
# Register in / out message ports
|
||||||
self.message_port_register_in(pmt.intern("control"))
|
self.message_port_register_in(pmt.intern("control"))
|
||||||
self.message_port_register_out(pmt.intern("status"))
|
self.message_port_register_out(pmt.intern("status"))
|
||||||
@@ -43,22 +47,38 @@ class peak_manager(gr.basic_block):
|
|||||||
#self.message_port_pub(pmt.intern("port name"), < pmt message >)
|
#self.message_port_pub(pmt.intern("port name"), < pmt message >)
|
||||||
|
|
||||||
def msg_handler(self, msg):
|
def msg_handler(self, msg):
|
||||||
|
|
||||||
print ("Message received:")
|
|
||||||
if pmt.is_dict(msg):
|
if pmt.is_dict(msg):
|
||||||
items = pmt.dict_items(msg)
|
items = pmt.dict_items(msg)
|
||||||
|
|
||||||
|
peak = {}
|
||||||
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)
|
||||||
val = pmt.cdr(pair)
|
val = pmt.cdr(pair)
|
||||||
|
|
||||||
|
key_str = pmt.symbol_to_string(key)
|
||||||
|
|
||||||
if pmt.is_integer(val):
|
if pmt.is_integer(val):
|
||||||
print("{}={}".format(pmt.symbol_to_string(key), pmt.to_long(val)))
|
value = pmt.to_long(val)
|
||||||
|
peak[key_str] = value
|
||||||
|
# print("{}={}".format(key_str, value))
|
||||||
elif pmt.is_real(val):
|
elif pmt.is_real(val):
|
||||||
print("{}={}".format(pmt.symbol_to_string(key), pmt.to_float(val)))
|
value = pmt.to_float(val)
|
||||||
|
peak[key_str] = value
|
||||||
|
# print("{}={}".format(key_str, value))
|
||||||
elif pmt.is_bool(val):
|
elif pmt.is_bool(val):
|
||||||
print("{}={}".format(pmt.symbol_to_string(key), pmt.to_bool(val)))
|
value = pmt.to_bool(val)
|
||||||
|
peak[key_str] = value
|
||||||
|
# print("{}={}".format(key_str, value))
|
||||||
|
|
||||||
|
id = peak['id']
|
||||||
|
freq_MHz = peak['freq_Hz']*1e-6
|
||||||
|
|
||||||
|
if peak['state'] == 1:
|
||||||
|
print ("New peak #{} at {:0.2f} MHz".format(id, freq_MHz))
|
||||||
|
else:
|
||||||
|
print ("Lost peak #{} at {:0.2f} MHz".format(id, freq_MHz))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print(pmt.symbol_to_string(msg))
|
print(pmt.symbol_to_string(msg))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user