完全抄的别人的,有一点是别忘了makefil.in的修改

手把手教你如何编写自己的信号处理模块(how to write a signal processing block?)

手把手教你如何编写自己的信号处理模块(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
    import mathbase

    class qa_howto (gr_unittest.TestCase):

        def setUp (self):
            self.tb = gr.top_block ()

        def tearDown (self):
            self.tb = None

        def test_001_square_ff (self):
            src_data = (-3, 4, -5.5, 2, 3)
            expected_result = (9, 16, 30.25, 4, 9)
            src = gr.vector_source_f (src_data)
            sqr = mathbase.sqrt_ff ()
            dst = gr.vector_sink_f ()
            self.tb.connect (src, sqr)
            self.tb.connect (sqr, dst)
            self.tb.run ()
            result_data = dst.data ()
            self.assertFloatTuplesAlmostEqual (expected_result, result_data, 6)

            
    if __name__ == '__main__':
        gr_unittest.main ()


细心完成上面的过程,然后重新 编译
./configure --prefix=/usr
    make check
make install
通过则说明,你已经得到了一个包含sqrt_ff()的mathbase.py模块


三、实现真正的求根运算
上面的方法其实只是改了一个名字而已,内核还是square运算,要实现真正的求根运算还需要进行如下修改
1)    进入到mathbase_sqrt_ff.cc
找到
复制代码

  1. mathbase_sqrt_ff::general_work()
    {
    .....
      for (int i = 0; i < noutput_items; i++){
        out[ i ]=in[ i ]*in[ i ];
      }
    .....
    }

将 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以及在前面提到的需要修改的几个文件中添加适当的语句,如果有兴趣,我也可以给出具体的步骤。
附件中是编译成功的例子 [attachment=100] 
最后需要注意的一点就是新模快的命名, 得避开gnuradio已经存在的模块,如常用的math,test 等等,这个编译时不会提醒。我们自己不妨将模块名称取的有自己的特色一点但也不影响程序的阅读。

meteor 2010-06-13 17:18
这里给出一个编译好的例子,以供大家参考

meteor 2010-06-21 08:21
不知道有没有人通过gr_howto写过滤波器,对于编写这些有记忆的处理单元我一直没有想到好的方法。
我的做法还是将数据一段一段的分段处理,然而这样的分段则会照成滤波后的波形不连续,在分段处会跳跃。不知道谁有比较好的方法?

魏忠山 2010-06-22 12:03
版主,src/lib下的makefile.in文件要改么?看教程里面好像它不需要改.

魏忠山 2010-06-22 14:09
版主我想编写自己的模块,照你说的做了,不过因为makefile.in文件没有修改权限,没有修改,然后我在src/lib目录下make 出来结果为“没有规则可以创建“howto.cc”需要的目标“howto.i” “,是否必须得改makefile.in阿?
急切盼望您的指点 

魏忠山 2010-06-22 14:30
chmod 后把makefile改了后,的确就make install 成功 ,谢谢版主啦!

你可能感兴趣的:(完全抄的别人的,有一点是别忘了makefil.in的修改)