Gnuradio中FM接收机的实现是一个经典的例子,从它的源代码中可以学习python语言的一些特点,还有软件无线电的一些基本概念。其中的python程序是重点。1、初识Pyhton语言的特点 Python语言是一种解释性语言,利用解释器即时的执行命令,不需要编译和链接。它对类的组织管理是以module/package的形式实现的。其中模块(module)文件包含了python的一些定义和声明,后缀为.py。包(package)是有相似功能的模块的集合,这些模块通常都在同一个目录下。一个package下的可以是模块,也可以是子包(sub-package)。如a.b即是指a包中的b模块。 任何一段程序都需要预先包含进相应的包或者模块。这些的导入很灵活,可以导入整个包,也可以导入子包、模块,甚至也可以导入某个模块下一个类的定义。 python语言中没有明确的像C中的大括号或者其他语言中类似的标识程序开始的符号,它是通过缩进来实现的(个人觉得这点在一开始编程时,会很容易出错,而且不容易找出来,但是这是一个好的习惯,可以编写出条理的程序)。注释语句是通过#来标注的。所以#后的语句,解释器都自动忽略。 在函数参数中有可能出现的*表示在函数被调用时,参数可为任意。即参数的数目是可以变化的,也可以没有这个参数。 2、Gnuradio中一种非常重要的类:flow_graph(流图类)。 gr是gnuradio中重要的一个子包,也是整个gnuradio软件的核心。flow_graph类即在gr中定义。现在程序里用到了stdgui.gui_flow_graph,它继承于gr.flow_graph,而gr.flow_graph又继承自gr.basic_flow_graph.这样形成了一个很大的graph 家庭。它的编写以及连接机制暂时还不清楚。只知道SWIG作为了python和C++的接口,在后台做了很多事。许多以gr开头的模块都是以C++来编写的,其形式为gr_sig_source_f,通过SWIG的工作,使得我们可以在python中以gr.sig_source_f来调用它。 3、每个程序结尾处的if _name_='_main_': 每一个模块都有一个属性"_name_"来指明当前模块的名字。当其被导入时,就会在模块名称空间创建_name_来保存模块的名称。但是如果不是被导入而是直接运行脚本的话,就需要语句得到执行。在执行过程中,系统会自动将_name_设为_main_(其他情况下,模块是不会得到main的名称的),因此if _name_='_main_'这个判断语句下的语句就可以得到执行了。
|