在明白实现原理的基础上,使用功能强大的python直接编写gnuradio应用程序,也熟悉一下wxpython工具包的使用。实现的主要是常规调幅(要实现抑制载波的DSB比起来要简单一步)。最后的波形为:
载波为20khz的正弦,幅度为10,调制信号为1khz的正弦信号,幅度为0.5。调制系数为0.5。从图上也可以清楚地看到包络。下面的图为频谱显示,20khz的载波分量最大,其他的还有两个距离为1khz的分量。正是AM信号的常规频谱图。
编写程序的过程中也总结了下步骤:
1、第一步依然是导入相应的包,这里比以前要多导入的有wx,stdgui2,fftsink2还有scopesink2。这些都是利用wxpython这一GUI工具所必须的包。
2、以前定义的类母类都是gr.top_block。而这里新建了一个类,继承自stdgui2.std_top_block。具体追溯的话,这个类也最终继承自gr.top_block。
3、程序中用到了scopesink2和fftsink2。都是作为框架frame的零件添加上去的。wxpython里面的布局层次为:windows、frame、panel、vbox、button等等。大多数会涉及一个parent参数,用来设置把这个控件放在哪一个层次上。
4、最后在几行差不多都是一样的。用之前实例化的类来定义一个stdgui2.stdapp对象,然后开始对象的主进程mainloop。这样程序就能运行并显示结果。
查看stdgui2.py文件可以得到整个的文件结构。这个文件里定义了四个类:stdapp、stdframe、stdpanel以及之前的std_top_block。我对整个的过程理解是这样的:当用继承自stdgui2.std_top_block的类test_graph(我自己定义)来生成stdapp类的实例app时,这里先进行的是test_graph的初始化。实例化stdapp时,会将刚生成的test_graph做为参数来生成app。在app的OnInit方法中,又定义了一个实例frame=stdframe()。这样就产生了frame,并且它的各种方法也可以进行作用。在frame的__init__中又定义了一个panel。所以程序又依照stdpanel的定义将frame作为参数来生成panel。到这里,所有涉及的元素都进行了实例化。整个stdgui2,是一个整体调用的过程。这里挺乱的,不过看它的原始定义文件就可以明白其中的过程了。
|