手把手教你如何编写自己的信号处理模块(how to write a signal processing block?) 虽然目前的基于Python的信号处理模块网上有丰富的资源,但是完全按照自己需求的信号处理模块还是自己动手写比较好,我建议初次接触编写模块的人可以从下面三个步骤进行。
一、下载gr-how-to-write-signal-processing-block 的模板,然后将其编译成功 下载地址为:ftp://ftp.gnu.org/gnu/gnuradio/
下载后解压,然后通过terminal 进入到该目录(以根用户的权限进入) 然后
./configure make check make install
只要gnuradio 安装正确,且版本和gr-howto一致,就不会出错了,make check 会显示2 pass, 多长多长时间等等信息。
问题:很多人用该模板,发现生成的qa_howto.py在make check时,没有问题,而独立运行时提示无法import howto 模块
原因:在qa_howto.py里面直接是 import howto, 所以只有当前的python路径和其安装路径一致,才可以调用否则无法成功
解决方法:1)首先需要让make install 将howto 模块装入到gnuradio的路径中 需要重新初始化,需要注意的是configure 需指定路径为 /usr ./configure --prefix=/usr make check make install
此时当你进入到usr/lib/python2.6/site-packages/gnuradio 你会发现里面有一个howto.py了
2)如果要直接运行qa_howto.py 则需要修改其源程序 将 import howto 改为 from gnuradio import howto 此时运行就能够成功了,到目前为止,我们得到了一个howto模块,具有平方的运算功能,这个以后都可以直接使用了。
二、如何按照自己的命名要求得到所需的模块
比如说我要写一个数学运算的模块mathbase 然后给其添加一个根号运算子模块
类似qa_howto.py的平方运算调用方式sqr=howto.square_ff() 我们希望通过这样的调用 sqr = mathbase.sqrt_ff (),就能得到一个实现根号运算的子模块
这个过程大家要比较细致,但是一步一步来就不会出错了,首先不解释原因,我们先看看如何做就行了。
进入到相应的目录 src/lib 中 1)重新命名几个文件名 howto.i 改为 mathbase.i
howto_square_ff.h 改为 mathbase_sqrt_ff.h howto_square_ff.cc改为 mathbase_sqrt_ff.cc
2)将下列文件中的howto 字符都替换为 mathbase,
square 字符都替换成 sqrt square2 字符相关的都删除 需要替换的文件为都在src/lib 中: mathbase.i mathbase_sqrt_ff.h mathbase_sqrt_ff.cc makefile.am makefile.in 建议采用search 功能的replace 来实现 首先search square2 字符串,然后将其对应的部分都删除但要保留square相关的 然后 search square 字符 replace 为 sqrt 最后 search howto 字符 replace 为 mathbase 3)qa_howto.py里面也需要修改 复制代码 1. from gnuradio import gr, gr_unittest 2. import mathbase 3. 4. class qa_howto (gr_unittest.TestCase): 5. 6. def setUp (self): 7. self.tb = gr.top_block () 8. 9. def tearDown (self): 10. self.tb = None 11. 12. def test_001_square_ff (self): 13. src_data = (-3, 4, -5.5, 2, 3) 14. expected_result = (9, 16, 30.25, 4, 9) 15. src = gr.vector_source_f (src_data) 16. sqr = mathbase.sqrt_ff () 17. dst = gr.vector_sink_f () 18. self.tb.connect (src, sqr) 19. self.tb.connect (sqr, dst) 20. self.tb.run () 21. result_data = dst.data () 22. self.assertFloatTuplesAlmostEqual (expected_result, result_data, 6) 23. 24. 25. if __name__ == '__main__': 26. gr_unittest.main () 27.
细心完成上面的过程,然后重新编译 ./configure --prefix=/usr make check make install
通过则说明,你已经得到了一个包含sqrt_ff()的mathbase.py模块
三、实现真正的求根运算
上面的方法其实只是改了一个名字而已,内核还是square运算,要实现真正的求根运算还需要进行如下修改
1) 进入到mathbase_sqrt_ff.cc 找到
复制代码
1. mathbase_sqrt_ff::general_work() 2. { 3. .....
4. for (int i = 0; i < noutput_items; i++){ 5. out[ i ]=in[ i ]*in[ i ]; 6. } 7. ..... 8. } 9.
将 out[ i ] = in[ i ]*in[ i ];改为 out[ i ] = sqrt(in[ i ]); 2)修改qa_howto.py 将验证数据改一下 src_data = (9, 16, 30.25, 4, 9) expected_result = (3, 4, 5.5, 2, 3)
重新编译,通过则说明你的修改正确,以后就可以使用自己的编写的求根运算了 如果要添加新的运算,则需要编写mathbase_xxxx_ff.cc以及在前面提到的需要修改的几个
文件中添加适当的语句,如果有兴趣,我也可以给出具体的步骤。
附件中是编译成功的例子 示例 gr-mathbase.tar.gz (1660 K) 下载次数:179
最后需要注意的一点就是新模快的命名, 得避开gnuradio已经存在的模块,如常用的math,test 等等,这个编译时不会提醒。我们自己不妨将模块名称取的有自己的特色一点但也不影响程序的阅读。