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的第二个输入端口。

三、有用链接和联系方式

Flowgraph Python Code - GNU Radio

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
GNU Radio系列教程是一系列关于GNU Radio软件的教学材料。这些教程提供了有关如何使用GNU Radio进行信号处理和通信系统开发的详细指导。 其中,是关于GNU Radio Companion (GRC)的引导教程GRCGNU Radio的图形化开发环境,它允许用户通过拖放模块来创建信号处理流程图。 是关于PSK解调的引导教程。PSK是相位偏移键控的一种调制方式,该教程详细介绍了如何使用GNU Radio进行PSK解调的过程。 是关于多相时钟同步的教程。在数字通信系统中,时钟同步对于正确解调和还原信号至关重要。该教程介绍了如何使用GNU Radio进行多相时钟同步。 通过学习这些教程,您将能够掌握GNU Radio的基本概念和功能,并且能够使用它进行信号处理和通信系统开发。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [GNU Radio系列教程(三):初级GNU Radio GRC流图](https://blog.csdn.net/OpenSourceSDR/article/details/108295236)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [GNU Radio系列教程(七):初级GNU Radio GRC PSK调制解调](https://blog.csdn.net/OpenSourceSDR/article/details/108531628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值