GNU Radio не выводит из других блоков параллельно с моим собственным OOT-блоком

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

Я подключаю график потока как:

                            /-> 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>

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

1

Решение

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

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

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

              /->A->Null Sink
File Source -|
\->B->File Sink
[…]

Итак, механизм ниже: выходной буфер File Source является
входной буфер A и входной буфер B. Нет дублирования памяти
Вот.

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

Когда File Source создает N элементов, указатель записи увеличивается на N.

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

Когда вызывается (general_) работает, буфер (ы) input_items действительно
просто указатель (start_of_buffer + чтение указателя). Эквивалентно,
буфер (ы) output_items на самом деле просто указывает на запись
указатель.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]