我想用C++中的GNU Radio为1个输入端口和0个输出端口编写自己的接收器块。我阅读并遵循此处描述的步骤:

  • http://gnuradio.org/redmine/projects/gnuradio/wiki/BlocksCodingGuide
  • http://gnuradio.org/redmine/projects/gnuradio/wiki/OutOfTreeModules
  • http://gnuradio.org/redmine/projects/gnuradio/wiki/OutOfTreeModulesConfig
  • http://gnuradio.org/redmine/projects/gnuradio/wiki/Guided_Tutorial_GNU_Radio_in_C++

  • 我正在使用
  • Ubuntu 14.04.3 LTS
  • Eclipse 4.5.1
  • CDT 8.8.0.201509131935
  • GNU Radio 3.7.8

  • 使用gr_modtool我创建了新模块“jammertrap”。在其中,我创建了“bandpower”块。这创建了其他三个文件

    在/ home / sdr / gnuradio / gr-jammertrap / include / jammertrap / 中的
  • bandpower.h
    在/ home / sdr / gnuradio / gr-jammertrap / lib /
  • 内的
  • bandpower_impl.h
    在/ home / sdr / gnuradio / gr-jammertrap / lib /
  • 中的
  • bandpower_impl.cc

    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中输入了以下命令:
  • cmake ../
  • 使
  • make测试//结果:“test_jammertrap”和“qa_bandpower”成功通过
  • sudo使安装

  • 该接收器块“bandpower”应接收gr_complex类型的项目,计算平均接收功率,并将此值存储在私有(private)成员“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()来读取计算的带宽,但是Eclipse没有显示任何方法“bandpower_measurement _-> get_bandpower()”

    我忘记在bandpower.h,bandpower_impl.h或bandpower_impl.cc中写什么?

    最佳答案

    普通OOT布局的公共(public)API在bandpower.h中,因此您必须添加一个

    virtual double get_bandpower() = 0;
    

    在那个文件中。

    然后,您像在_impl.cc / _impl.h中那样重载/实现。

    顺便说一句,我稍微反对您的实现背后的数学原理:noutput_items,即。可用输入项的数量(取决于缓冲区填充/运行时行为而变化),您的“平均长度”不是恒定的,这意味着如果流程图运行速度很快,缓冲区通常将已满,并且平均长度很高,而如果出现“点滴”情况,则长度会小得多(在极端情况下,减小到noutput_items==1)。因此,您的功效估算器的方差将取决于计算方面。

    那不是好事。更好地处理平均数量不变的物品。在您的情况下,可以使用set_output_multiple(因为接收器也是同步块(synchronized block),这也会影响输入倍数),以确保始终获得固定数字的倍数。

    除此之外,已经有可以执行您想要的功能的块:

    c&#43;&#43; - GNU Radio:如何在接收器块内定义 “get_*”方法-LMLPHP
  • 探查平均Mag²:具有一种level()方法,它与您的get_bandpower相同(除了√(.))
  • 到Mag的复合体 oji 抽取FIR滤波器探测信号:在将√(Re²+Im²)传递给具有123(即我的任意固定长度)抽头1 /长度的滤波器之前,先做√(Re²+Im²)。 ,并将其平均抽取为一个值。结果被发送到信号探针,该信号探针具有signal()方法,该方法执行get_bandpower的作用。 CPU负载相对较小-实际上只是每个样本的幅度发现,然后每123个样本进行123次实乘+ 123次实加,在过滤器中,所有SIMD都增加了,因此基本上每个样本的FMAC少于1个。
  • 复杂到Mag 移动平均探测信号:名称说明了一切。这里没什么神奇的。
  • 关于c++ - GNU Radio:如何在接收器块内定义 “get_*”方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33897371/

    10-13 09:31