【问题标题】:Using gr::fec::code::cc_encoder class in a hierarchical block在分层块中使用 gr::fec::code::cc_encoder 类
【发布时间】:2018-09-15 04:50:54
【问题描述】:

我已经实现了一个非常基本的 C++ CCSDS 卷积编码器 (k = 7,r = 1/2),它工作正常。但是,它非常基础,缺少操作模式(CC_STREAMINGCC_TERMINATEDCC_TAILBITINGCC_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 .. && make)给出了这个错误:

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<:fec::generic_encoder>}”行到 'gr::basic_block_sptr {aka boost::shared_ptr}'" 表示共享指针 gr::fec::generic_encoder 不能按照 hier_block2.connect (basic_block_sptr src, int src_port, basic_block_sptr dst, int dst_port) 的要求转换为 gr::basic_block。

我以这种方式创建了许多分层块,但从未遇到此错误。我很确定我缺少一些重要的东西。任何帮助将不胜感激。顺便说一句,如果需要更多信息,请告诉我。 干杯。

【问题讨论】:

    标签: c++ gnuradio gnuradio-companion


    【解决方案1】:

    我终于能够解决这个问题。结果 Gnu 无线电 FECAPI 提供了编码器变量来定义 FEC 属性(从 gr::fec::generic_encoder 类派生的类,例如 cc_encoder、ldpc_encoder 等)和部署变量(与调度程序和 GNU 中的编码器变量交互)无线电流程图。部署变量“gr::fec::encoder”可以与许多编码器变量一起使用,例如 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);
    }
    

    【讨论】:

      【解决方案2】:

      cc_encoder 不是块,因此您不能像块一样在流程图中连接它。

      事实上,你不应该实例化它,即使它只是一个抽象基类:

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

      我不太确定你需要什么样的编码器,但无论如何,这门课不是要走的路。

      【讨论】:

      • 谢谢@Marcus。你说的很对。我忽略了 cc_encoder.cc 文件。它有一个“generic_work”函数,而不是标准的工作函数。我正在尝试创建一个标准的 ccsds 卷积编码器和解码器。我知道已经有一个 encode_ccsds_27 和一个 decode_ccsds_27 块,但据报道,在处理了几兆字节的数据后,它们的 BER 会下降。还有扩展编码器,但不幸的是它是用 Python 编写的。所以现在我正在寻找替代解决方案。
      猜你喜欢
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多