GNU Radio:如何在接收器块

时间:2015-11-24 15:19:42

标签: c++ eclipse ubuntu block gnuradio

我想用C ++中的GNU Radio为1个输入端口和0个输出端口编写自己的接收器块。我阅读并按照这里描述的步骤进行操作:

我正在使用

  • Ubuntu 14.04.3 LTS
  • Eclipse 4.5.1
  • CDT 8.8.0.201509131935
  • GNU Radio 3.7.8

使用gr_modtool我创建了新模块“jammertrap”。在里面,我创建了块“bandpower”。这创造了三个文件

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

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 //结果:“test_jammertrap”和“qa_bandpower”成功通过
  • sudo make install

此接收器块“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中写些什么?

1 个答案:

答案 0 :(得分:1)

普通OOT布局的公共API位于bandpower.h,因此您必须添加

virtual double get_bandpower() = 0;

在该文件中。

然后,您就像在_impl.cc / _impl.h一样重载/实现它。

顺便说一下,我稍微反对你的实现背后的数学:作为noutput_items,即。可用的输入项目数量,根据缓冲区内容/运行时行为而变化,您的“平均长度”不是恒定的,这意味着如果您的流程图快速运行,您的缓冲区通常会满,并且您的平均长度很高,而在一个“涓涓细流”的情况,长度会小很多(在极端情况下会降至noutput_items==1)。因此,功率估算器的方差将取决于计算方面。

这不是一件好事。使用平均数量的物品可以更好地完成工作。在您的情况下,您可以使用set_output_multiple(因为接收器也是同步块,这也会影响输入倍数),以保证您始终获得固定数字的倍数。

除此之外,已经存在可以做你想做的事情的块:

three ways to probe signal

  • ProbeAvgMag²:方法level()get_bandpower相同(除了√(。))
  • 复杂到Mag 抽取FIR滤波器探测信号:将√(Re²+Im²)传递到a之前过滤器使用123(这只是我的任意固定长度)1 /长度的抽头,并将其抽取到每个平均值的一个值。结果将发送到信号探测器,信号探测器具有signal()方法,可以执行get_bandpower所做的操作。 CPU负载相对较小 - 它实际上只是每个样本的幅度发现,然后123个实数乘法+ 123个实际加法每123个样本,在滤波器中,所有SIMD都增加了,所以基本上每个样本少于1个FMAC。
  • 复杂到Mag 移动平均线探测信号:名称全部说明。这里没什么神奇的。