Использование класса gr :: fec :: code :: cc_encoder в иерархическом блоке

Я реализовал очень простой C ++ CCSDS сверточный кодер (k = 7, r = 1/2), и он отлично работает. Тем не менее, он очень простой и в нем отсутствуют такие параметры, как режим работы (CC_STREAMING, CC_TERMINATED, CC_TAILBITING, CC_TRUNCATED) и т. Д. И т. Д. Поэтому я решил использовать стандартный класс gnuradio gr :: fec :: code :: cc_encoder. Мой суперкласс кодирования будет включать в себя прокалывание и другие блоки, и поэтому все будет в иерархическом блоке. До сих пор я помещаю блоки один за другим в иерархический блок, начиная с gr :: fec :: code :: cc_encoder. Ниже мой файл реализации .cc.

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

#include <gnuradio/io_signature.h>
#include "debug_conv_encoder_impl.h"
namespace gr {
namespace baseband {

debug_conv_encoder::sptr
debug_conv_encoder::make(int frame_size, std::vector<int> polys, int mode, int pad)
{
return gnuradio::get_initial_sptr
(new debug_conv_encoder_impl(frame_size, polys, mode, pad));
}

/*
* The private constructor
*/
debug_conv_encoder_impl::debug_conv_encoder_impl(int frame_size, std::vector<int> polys, int mode, int pad)
: gr::hier_block2("debug_conv_encoder",
gr::io_signature::make(1, 1, sizeof(unsigned char)),
gr::io_signature::make(1, 1, sizeof(unsigned char)))
{
//Creating convolutional encoder
int k = 7;
int rate = 2;
bool d_pad = (pad == 1) ? true : false;
cc_mode_t d_mode = get_mode(mode);
gr::fec::code::cc_encoder::sptr encoder(gr::fec::code::cc_encoder::make(frame_size,k,rate,polys,0,d_mode,d_pad));
//connect(self(),0,self(),0); -- Works fine
connect(self() , 0 , encoder , 0); // --gives an error
connect(encoder , 0 , self() , 0); // --gives an error
//connect(encoder);
}
cc_mode_t debug_conv_encoder_impl::get_mode(int mode)
{
switch(mode)
{
case 0:
return CC_STREAMING;
case 1:
return CC_TERMINATED;
case 2:
return CC_TRUNCATED;
case 3:
return CC_TAILBITING;
default:
return CC_STREAMING;
}
}

/*
* Our virtual destructor.
*/
debug_conv_encoder_impl::~debug_conv_encoder_impl()
{
}} /* namespace baseband */
} /* namespace gr */

А вот и заголовочный файл

#ifndef INCLUDED_BASEBAND_DEBUG_CONV_ENCODER_IMPL_H
#define INCLUDED_BASEBAND_DEBUG_CONV_ENCODER_IMPL_H

#include <baseband/debug_conv_encoder.h>
#include <gnuradio/fec/cc_encoder.h>
namespace gr {
namespace baseband {

class debug_conv_encoder_impl : public debug_conv_encoder
{
private:
cc_mode_t get_mode(int mode);

public:
debug_conv_encoder_impl(int frame_size, std::vector<int> polys, int mode, int pad);
~debug_conv_encoder_impl();

// Where all the action really happens
};

} // namespace baseband
} // namespace gr

#endif /* INCLUDED_BASEBAND_DEBUG_CONV_ENCODER_IMPL_H */

К сожалению, компилирование и компоновка файла (cmake .. && сделать) выдать эту ошибку:

xxx/GRC/baseband/gr-baseband/lib/debug_conv_encoder_impl.cc:53:39: error: no matching function for call to ‘gr::baseband::debug_conv_encoder_impl::connect(gr::hier_block2::opaque_self, int, gr::fec::generic_encoder::sptr&, int)’
connect(self() , 0 , encoder , 0);
/usr/local/include/gnuradio/hier_block2.h:105:10: note:   no known conversion for argument 3 from ‘gr::fec::generic_encoder::sptr {aka boost::shared_ptr<gr::fec::generic_encoder>}’ to ‘gr::basic_block_sptr {aka boost::shared_ptr<gr::basic_block>}’

По сути, строка «gr :: fec :: generic_encoder :: sptr {aka boost :: shared_ptr} ‘в’ gr :: basic_block_sptr {aka boost :: shared_ptr} ‘» подразумевает, что общий указатель gr :: fec :: generic_encoder не может быть преобразовано в gr :: basic_block, как того требует hier_block2.connect (basic_block_sptr src, int src_port, basic_block_sptr dst, int dst_port).

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

1

Решение

Я наконец смог решить проблему. Оказывается, Gnu-радио FECAPI предоставляет переменные кодера для определения свойства FEC (классы, производные от класса gr :: fec :: generic_encoder, например, cc_encoder, ldpc_encoder и т. Д.) И переменных развертывания (которые взаимодействуют с планировщиком и переменной кодера в GNU). радиопрограмма. Переменная развертываниягр :: ПИО :: кодировщик«может использоваться с рядом переменных кодировщика, таких как кодер cc_encoder или LDPC. Теперь рабочая функция выглядит так, как показано ниже. Теперь OOT компилируется и работает как надо.

debug_conv_encoder_impl::debug_conv_encoder_impl(int frame_size, std::vector<int> polys, int mode, int pad)
: gr::hier_block2("debug_conv_encoder",
gr::io_signature::make(1, 1, sizeof(unsigned char)),
gr::io_signature::make(1, 1, sizeof(unsigned char)))
{
//Creating a coder variable
int k = 7;
int rate = 2;
bool d_pad = (pad == 1) ? true : false;
cc_mode_t d_mode = get_mode(mode);
gr::fec::code::cc_encoder::sptr coder_variable(gr::fec::code::cc_encoder::make(frame_size,k,rate,polys,0,d_mode,d_pad));

//Creating a deployment variable
gr::fec::encoder::sptr coder_deployment(gr::fec::encoder::make(coder_variable,sizeof(unsigned char),sizeof(unsigned char)));
connect(self() , 0 , coder_deployment , 0);
connect(coder_deployment , 0 , self() , 0);
//connect(encoder);
}
1

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

cc_encoder не является блоком, поэтому вы не можете соединить его в потоковом графе, как блок.

На самом деле, вы не должны иметь возможность его создавать, даже если это только абстрактный базовый класс:

https://gnuradio.org/doc/doxygen/classgr_1_1fec_1_1code_1_1cc__encoder.html

Я не совсем уверен, какой кодировщик вам нужен, но в любом случае этот класс не подходит.

0

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