GnuRadio companion で新しい機能ブロック

(元の文章は2015/05/13のものです)

GnuRadio companion でGUIベースで用意された信号処理ブロックを結線してラジオをはじめいろいろなものが作れます. 新しいブロックの作成は意外に簡単です.

Extending GNU Radio with own functionality and blocks

に従ってg新部さんの NeuG を信号ソースにしてみました.

neugはg新部さんの FST-01 を使った乱数発生器です. FSFでも紹介されています [1]

作業はDebien jessieでやったのですがパッケージとして gnuradio-dev, cmake, boost, libcppunit-dev, liblog4cpp5-devなどをインストールしておくことが必要でした.

  • ツリーを作製:

    gr_modtool newmod neug         # これで gr-neugができるので
    cd gr-neug
    gr_modtool add -t sync neug    # syncのところはgeneric,decimator,interpolator...
    
  • python/qa_neug.pyを編集: unit testをかく

  • python/CMakeLists.txtを編集: ここのunit testsの最後にGR_ADD_TEST行を追加

  • lib/neug_impl.ccを編集: テンプレートとしての.ccのあちこちを埋めます. 結果はこんな感じ:

namespace gr {
  namespace neug {

    static int neug_fd;

    neug::sptr
    neug::make()
    {
      return gnuradio::get_initial_sptr
        (new neug_impl());
    }

    /*
     * The private constructor
     */
    neug_impl::neug_impl()
      : gr::sync_block("neug",
              gr::io_signature::make(0, 0, sizeof(int)),
              gr::io_signature::make(1, 1, sizeof(int)))
    {
      neug_fd = open ("/dev/ttyACM1", O_RDONLY);
      if (neug_fd < 0)
        throw std::runtime_error("can't open /dev/ttyACM1");
    }

    /*
     * Our virtual destructor.
     */
    neug_impl::~neug_impl()
    {
      close (neug_fd);
    }

    int
    neug_impl::work(int noutput_items,
                        gr_vector_const_void_star &input_items,
                        gr_vector_void_star &output_items)
    {
        const int *in = (const int *) input_items[0];
        int *out = (int *) output_items[0];

        // Do <+signal processing+>
      for(int i = 0; i < noutput_items; i++)
        {
          read (neug_fd, (void *)&out[i], sizeof(int));
        }

        // Tell runtime system how many output items we produced.
        return noutput_items;
    }

  } /* namespace howto */
} /* namespace gr */

.

  • ビルド:

    mkdir build
    cd build/
    cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ../
    make
    make test
    cd ..
    gr_modtool makexml neug       # grc/howto_neug.xmlができる
    
    # この.xmlファイルがgnuradio-companionのbuilding blockを表しています
    
  • インストール

    sudo make install

うまくいっていればgnuradio-compnionのカテゴリーにNEUGが追加されneugブロックが使えるようになっているはずです.

参考リンク

[1]GNU press NeuG article

links

social