我想用C ++中的GNU Radio为1个输入端口和0个输出端口编写自己的接收器块。我阅读并按照这里描述的步骤进行操作:
我正在使用
使用gr_modtool我创建了新模块“jammertrap”。在里面,我创建了块“bandpower”。这创造了三个文件
bandpower.h:
#ifndef INCLUDED_JAMMERTRAP_BANDPOWER_H
#define INCLUDED_JAMMERTRAP_BANDPOWER_H
#include <jammertrap/api.h>
#include <gnuradio/block.h>
namespace gr
{
namespace jammertrap
{
class JAMMERTRAP_API bandpower : virtual public gr::block
{
public:
typedef boost::shared_ptr<bandpower> sptr;
// Return a shared_ptr to a new instance of jammertrap::bandpower.
// To avoid accidental use of raw pointers, jammertrap::bandpower's constructor is in a private implementation class.
// jammertrap::bandpower::make is the public interface for creating new instances.
static sptr make();
};
} // namespace jammertrap
} // namespace gr
#endif /* INCLUDED_JAMMERTRAP_BANDPOWER_H */
bandpower_impl.h:
#ifndef INCLUDED_JAMMERTRAP_BANDPOWER_IMPL_H
#define INCLUDED_JAMMERTRAP_BANDPOWER_IMPL_H
#include <jammertrap/bandpower.h>
namespace gr
{
namespace jammertrap
{
class bandpower_impl : public bandpower
{
private:
double d_bandpower_;
public:
bandpower_impl();
~bandpower_impl();
void forecast (int noutput_items, gr_vector_int &ninput_items_required);
// Where all the action really happens
int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items);
// Returns the calculated RMS Bandpower
double get_bandpower();
};
} // namespace jammertrap
} // namespace gr
#endif /* INCLUDED_JAMMERTRAP_BANDPOWER_IMPL_H */
bandpower_impl.cc:
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gnuradio/io_signature.h>
#include "bandpower_impl.h"
namespace gr
{
namespace jammertrap
{
bandpower::sptr
bandpower::make()
{
return gnuradio::get_initial_sptr (new bandpower_impl());
}
// The private constructor
bandpower_impl::bandpower_impl() : gr::block("bandpower", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(0, 0, 0))
{
d_bandpower_ = 0;
}
// Our virtual destructor
bandpower_impl::~bandpower_impl()
{}
void bandpower_impl::forecast(int noutput_items, gr_vector_int &ninput_items_required)
{
// ninput_items_required[0] = noutput_items;
}
int bandpower_impl::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items)
{
const gr_complex *in = (const gr_complex *) input_items[0];
d_bandpower_ = 0;
for(int i = 0; i < noutput_items; i++)
{
d_bandpower_ += (in[i].real() * in[i].real()) + (in[i].imag() * in[i].imag());
}
d_bandpower_ = sqrt(d_bandpower_ / noutput_items);
// Tell runtime system how many input items we consumed on each input stream.
consume_each (noutput_items);
// Tell runtime system how many output items we produced
return noutput_items;
}
double bandpower_impl::get_bandpower()
{
return d_bandpower_;
}
} /* namespace jammertrap */
} /* namespace gr */
为了制作和安装这个新块,我在/ home / sdr / gnuradio / gr-jammertrap / build中输入了以下命令:
此接收器块“bandpower”应接收gr_complex类型的项目,计算平均接收功率并将此值存储在私有成员“d_bandpower_”内。 另外,我定义了方法“get_bandpower()”来获取存储的值。
在另一个程序中,我使用两个块
创建了一个流程图类osmosdr::source:sptr osmosdr_source_;
gr::jammertrap::bandpower::sptr bandpower_measurement_;
并使用
实例化它们osmosdr_source_ = osmosdr::source::make(std::string());
bandpower_measurement_ = gr::jammertrap::bandpower::make();
启动流程图之后,我想通过调用get_bandpower()读取计算出的bandpower,但Eclipse没有显示方法“bandpower_measurement _-&gt; get_bandpower()”
我忘了在bandpower.h,bandpower_impl.h或bandpower_impl.cc中写些什么?
答案 0 :(得分:1)
普通OOT布局的公共API位于bandpower.h
,因此您必须添加
virtual double get_bandpower() = 0;
在该文件中。
然后,您就像在_impl.cc
/ _impl.h
一样重载/实现它。
顺便说一下,我稍微反对你的实现背后的数学:作为noutput_items
,即。可用的输入项目数量,根据缓冲区内容/运行时行为而变化,您的“平均长度”不是恒定的,这意味着如果您的流程图快速运行,您的缓冲区通常会满,并且您的平均长度很高,而在一个“涓涓细流”的情况,长度会小很多(在极端情况下会降至noutput_items==1
)。因此,功率估算器的方差将取决于计算方面。
这不是一件好事。使用平均数量的物品可以更好地完成工作。在您的情况下,您可以使用set_output_multiple
(因为接收器也是同步块,这也会影响输入倍数),以保证您始终获得固定数字的倍数。
除此之外,已经存在可以做你想做的事情的块:
level()
与get_bandpower
相同(除了√(。))signal()
方法,可以执行get_bandpower
所做的操作。 CPU负载相对较小 - 它实际上只是每个样本的幅度发现,然后123个实数乘法+ 123个实际加法每123个样本,在滤波器中,所有SIMD都增加了,所以基本上每个样本少于1个FMAC。