(元の文章は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 |