欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

GNU Radio系列教程(九):中级篇之GNU Radio GRC流图生成的Python脚本

程序员文章站 2022-05-31 13:18:08
...

GNU Radio系列教程(九):中级篇之GNU Radio GRC流图生成的Python脚本

本文介绍GRC流图生成的python脚本的基本框架和主要函数。

目录

一、双音调流图

二、双音调脚本分析

三、有用链接和联系方式


一、双音调流图

以下GRC流图实现了双音调合成,

GNU Radio系列教程(九):中级篇之GNU Radio GRC流图生成的Python脚本

当我们点击GRC中工具栏中的“Generate”代码生成按钮时,在“工作空间”会提示你,生成了一个文件名字为“tutorial_three_1.py”的python脚本。

GNU Radio系列教程(九):中级篇之GNU Radio GRC流图生成的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联系方式如下:

GNU Radio系列教程(九):中级篇之GNU Radio GRC流图生成的Python脚本

微信公众号二维码:

GNU Radio系列教程(九):中级篇之GNU Radio GRC流图生成的Python脚本

相关标签: GNU Radio