GNU Radio系列教程(九):中级篇之GNU Radio GRC流图生成的Python脚本
本文介绍GRC流图生成的python脚本的基本框架和主要函数。
目录
一、双音调流图
以下GRC流图实现了双音调合成,
当我们点击GRC中工具栏中的“Generate”代码生成按钮时,在“工作空间”会提示你,生成了一个文件名字为“tutorial_three_1.py”的python脚本。
打开该Python脚本,
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# SPDX-License-Identifier: GPL-3.0
#
# GNU Radio Python Flow Graph
# Title: tutorial_three_1
# GNU Radio version: 3.8.0.0
from distutils.version import StrictVersion
if __name__ == '__main__':
import ctypes
import sys
if sys.platform.startswith('linux'):
try:
x11 = ctypes.cdll.LoadLibrary('libX11.so')
x11.XInitThreads()
except:
print("Warning: failed to XInitThreads()")
from gnuradio import analog
from gnuradio import audio
from gnuradio import gr
from gnuradio.filter import firdes
import sys
import signal
from PyQt5 import Qt
from argparse import ArgumentParser
from gnuradio.eng_arg import eng_float, intx
from gnuradio import eng_notation
from gnuradio import qtgui
class tutorial_three_1(gr.top_block, Qt.QWidget):
def __init__(self):
gr.top_block.__init__(self, "tutorial_three_1")
Qt.QWidget.__init__(self)
self.setWindowTitle("tutorial_three_1")
qtgui.util.check_set_qss()
try:
self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
except:
pass
self.top_scroll_layout = Qt.QVBoxLayout()
self.setLayout(self.top_scroll_layout)
self.top_scroll = Qt.QScrollArea()
self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
self.top_scroll_layout.addWidget(self.top_scroll)
self.top_scroll.setWidgetResizable(True)
self.top_widget = Qt.QWidget()
self.top_scroll.setWidget(self.top_widget)
self.top_layout = Qt.QVBoxLayout(self.top_widget)
self.top_grid_layout = Qt.QGridLayout()
self.top_layout.addLayout(self.top_grid_layout)
self.settings = Qt.QSettings("GNU Radio", "tutorial_three_1")
try:
if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
self.restoreGeometry(self.settings.value("geometry").toByteArray())
else:
self.restoreGeometry(self.settings.value("geometry"))
except:
pass
##################################################
# Variables
##################################################
self.samp_rate = samp_rate = 32000
##################################################
# Blocks
##################################################
self.audio_sink_0 = audio.sink(samp_rate, '', True)
self.analog_sig_source_x_1 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 350, 0.1, 0, 0)
self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 440, 0.1, 0, 0)
##################################################
# Connections
##################################################
self.connect((self.analog_sig_source_x_0, 0), (self.audio_sink_0, 0))
self.connect((self.analog_sig_source_x_1, 0), (self.audio_sink_0, 1))
def closeEvent(self, event):
self.settings = Qt.QSettings("GNU Radio", "tutorial_three_1")
self.settings.setValue("geometry", self.saveGeometry())
event.accept()
def get_samp_rate(self):
return self.samp_rate
def set_samp_rate(self, samp_rate):
self.samp_rate = samp_rate
self.analog_sig_source_x_0.set_sampling_freq(self.samp_rate)
self.analog_sig_source_x_1.set_sampling_freq(self.samp_rate)
def main(top_block_cls=tutorial_three_1, options=None):
if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
style = gr.prefs().get_string('qtgui', 'style', 'raster')
Qt.QApplication.setGraphicsSystem(style)
qapp = Qt.QApplication(sys.argv)
tb = top_block_cls()
tb.start()
tb.show()
def sig_handler(sig=None, frame=None):
Qt.QApplication.quit()
signal.signal(signal.SIGINT, sig_handler)
signal.signal(signal.SIGTERM, sig_handler)
timer = Qt.QTimer()
timer.start(500)
timer.timeout.connect(lambda: None)
def quitting():
tb.stop()
tb.wait()
qapp.aboutToQuit.connect(quitting)
qapp.exec_()
if __name__ == '__main__':
main()
由GRC生成Python脚本文件之后,用户可以根据自己的需要来修改Python脚本中的参数和函数。例如修改采样率,模块之间的连接关系等内容。
如果你的电脑中安装的是GNU Radio 3.8,Python是执行Python3的话,执行Python脚本的方式是在终端中输入以下命令:
python3 tutorial_three_1.py
其中tutorial_three_1.py是你要执行的Python脚本名称。
如果你的电脑中安装的是GNU Radio 3.7,Python是执行Python2的话,执行Python脚本的方式是在终端中输入以下命令:
python tutorial_three_1.py
注意,当你在Python脚本中修改内容后,你如果重新点击GRC中的生成按钮,那么新生成的Python脚本会覆盖你所修改的内容。
二、双音调脚本分析
#!/usr/bin/env python3
该行表示我们要用Python3来执行该脚本程序。
from gnuradio import analog
from gnuradio import audio
from gnuradio import gr
这三行代码表示gnuradio模块中的analog、audio和gr模块需要import。基于GNU Radio的所有Python程序,我们都需要import gr。
class tutorial_three_1(gr.top_block, Qt.QWidget):
该行定义了一个名称为与该Python脚本名称相同的类,这个类是继承于gr.top_block类。tutorial_three_1类是本流图程序的主体。
def __init__(self):
在tutorial_three_1类中只有一个构造函数“init()”,调用了父类中的构造函数。
gr.top_block.__init__(self, "tutorial_three_1")
self.samp_rate = samp_rate = 32000
该行设置了采样率参数。
self.connect((self.analog_sig_source_x_0, 0), (self.audio_sink_0, 0))
self.connect((self.analog_sig_source_x_1, 0), (self.audio_sink_0, 1))
这两行代码中,Audio Sink模块有两个输入端口。第一行表示将第一个信号源analog_sig_source_x_0的信号 (350 Hz 波形信号)连接至audio_sink_0的第一个输入端口,第二行表示将第二个信号源analog_sig_source_x_1的信号(440 Hz 波形信号)连接至audio_sink_0的第二个输入端口。
三、有用链接和联系方式
https://wiki.gnuradio.org/index.php/Flowgraph_Python_Code
淘宝店铺、QQ技术交流群、CSDN联系方式如下:
微信公众号二维码: