2016-02-26 5 views
1

Я хотел бы закодировать свой собственный общий блок с 1 входным и 1 выходом для GNU Radio в C++. Я выполнил шаги в gnuradio.org, используя gr_modtool. Он может работать хорошо. Но когда я подключаю другой блок (scope sink2) с тем же источником, в нем нет выхода.GNU Radio нет вывода из других блоков, параллельных моему собственному блоку OOT

подключить потоковый граф, как:

      /-> Scope Sink2 
Signal Source -> Throttle -| 
          \-> my own block -> Scope Sink1 

Я использую GNU Radio Companion v3.7.6.1-65-g500517ac

Я создал блок 'energy_de'. Это создание среди других четырех файлов: energy_de.h

#ifndef INCLUDED_CPP_ENERGY_DE_H 
#define INCLUDED_CPP_ENERGY_DE_H 

#include <cpp/api.h> 
#include <gnuradio/block.h> 

namespace gr { 
    namespace cpp { 

    /*! 
    * \brief <+description of block+> 
    * \ingroup cpp 
    * 
    */ 
    class CPP_API energy_de : virtual public gr::block 
    { 
    public: 
     typedef boost::shared_ptr<energy_de> sptr; 

     /*! 
     * \brief Return a shared_ptr to a new instance of cpp::energy_de. 
     * 
     * To avoid accidental use of raw pointers, cpp::energy_de's 
     * constructor is in a private implementation 
     * class. cpp::energy_de::make is the public interface for 
     * creating new instances. 
     */ 
     static sptr make(float makenoise); 

     virtual float noise() const = 0; 
     virtual void set_noise (float noise) = 0; 
    }; 

    } // namespace cpp 
} // namespace gr 

energy_de_impl.h

#ifndef INCLUDED_CPP_ENERGY_DE_IMPL_H 
#define INCLUDED_CPP_ENERGY_DE_IMPL_H 

#include <cpp/energy_de.h> 

namespace gr { 
    namespace cpp { 

    class energy_de_impl : public energy_de 
    { 
    private: 
     float d_noise; 

    public: 
     energy_de_impl(float noise); 
     ~energy_de_impl(); 

     // Where all the action really happens 
     void forecast (int noutput_items, gr_vector_int &ninput_items_required); 
     float noise() const { return d_noise; } 
     void set_noise(float noise) { d_noise = noise; } 

     int general_work(int noutput_items, 
       gr_vector_int &ninput_items, 
       gr_vector_const_void_star &input_items, 
       gr_vector_void_star &output_items); 
    }; 

    } // namespace cpp 
} // namespace gr 

energy_de_impl.cc

#ifdef HAVE_CONFIG_H 
#include "config.h" 
#endif 

#include <gnuradio/io_signature.h> 
#include "energy_de_impl.h" 

namespace gr { 
    namespace cpp { 

    energy_de::sptr 
    energy_de::make(float noise) 
    { 
     return gnuradio::get_initial_sptr 
     (new energy_de_impl(noise)); 
    } 

    /* 
    * The private constructor 
    */ 
    energy_de_impl::energy_de_impl(float noise) 
     : gr::block("energy_de", 
       gr::io_signature::make(1, 1, sizeof(float)), 
       gr::io_signature::make(1, 1, sizeof(float))), 
     d_noise(noise) 
    { 
    } 

    /* 
    * Our virtual destructor. 
    */ 
    energy_de_impl::~energy_de_impl() 
    { 
    } 

    void 
    energy_de_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required) 
    { 
     ninput_items_required[0] = noutput_items; 
    } 

    int 
    energy_de_impl::general_work (int noutput_items, 
         gr_vector_int &ninput_items, 
         gr_vector_const_void_star &input_items, 
         gr_vector_void_star &output_items) 
    { 
     const float *in = (const float *) input_items[0]; 
     float *out = (float *) output_items[0]; 

     for(int i = 0; i < noutput_items; i++){ 
      if (in[i]*in[i] > d_noise){ 
       out[i] = 1.0; 
      } 
      else{ 
       out[i] = 0.0; 
      } 
     } 

     return noutput_items; 
    } 

    } /* namespace cpp */ 
} /* namespace gr */ 

cpp_energy_de.xml

<?xml version="1.0"?> 
<block> 
    <name>energy_de</name> 
    <key>cpp_energy_de</key> 
    <category>cpp</category> 
    <import>import cpp</import> 
    <make>cpp.energy_de($noise)</make> 
    <callback>set_niose($noise)</callback> 

    <param> 
    <name>noise</name> 
    <key>noise</key> 
    <type>float</type> 
    </param> 


    <sink> 
    <name>in</name> 
    <type>float</type> 
    </sink> 

    <source> 
    <name>out</name> 
    <type>float</type> 
    </source> 
</block> 

Почему я с annot получить выход из Scope Sink2? Что я забыл написать в четырех файлах? Это проблема с буфером input_items моего блока?

ответ

1

При использовании общего block, а не sync_block, ваш general_workнеобходимо вызов consume, указывая, сколько элементов вы читали, в противном случае входного буфер вашего собственного блока (== выходного буфер дроссельной заслонки в) быстро заполняется, дроссель может 'Поместите новые образцы в него, и ваш график потока остановится. В этот момент ваша раковина может просто не иметь достаточного ввода, чтобы показать что-либо.

Я думаю, что для вашего случая использования, просто используя sync_block было бы намного проще, и, следовательно, правильный способ сделать это.

Я хотел бы указать вам на mail. Я написал сегодня discuss GNU Radio mailing list. В нем объясняются концепции пространства буфера, стоящие за этим.

   /->A->Null Sink 
File Source -| 
       \->B->File Sink 

[...]

Так механизм ниже: выходной буфер файла источника является входной буфер и входной буфер B. Нет дублирования памяти здесь.

В файле Source есть буферный писатель с указателем записи, а A и B имеют свои собственные указатели чтения, указывающие на этот буфер.

Когда исходного файла производит N элементов, указатель записи перемещается на N.

Аналогично, когда А потребляет M элементов, А прочитаем указатель продвигается на М.

При вызове (general_) работы, input_items buffer (s) is (are) действительно просто указатель (start_of_buffer + read pointer). Эквивалентно, буфер (ы) output_items 10() действительно указывает на указатель записи .

Источник файла разрешен только для создания так много элементов, что указатель записи не продвигается за пределы минимального указателя чтения, поскольку в этом случае он перезаписывает образцы, которые не потреблял нисходящий блок.

+0

Большое спасибо! После использования «потреблять» я получаю сигнал из области sink2. – Betty

 Смежные вопросы

  • Нет связанных вопросов^_^