首页 > 其他分享 >gnuradio笔记[3]-播放音频并观测幅度谱

gnuradio笔记[3]-播放音频并观测幅度谱

时间:2024-02-15 17:12:53浏览次数:27  
标签:qtgui 音频 top sink time Qt 播放 self gnuradio

摘要

使用GNU Radio观测音频文件的幅度谱并播放音频,将数据保存到wav文件.

关键信息

  • GNU Radio Companion:3.10.8.0 (Python 3.10.13)

实现

音频文件

参数名称 参数值
音频组成 信标信号+音乐文件
信标波形 正弦波
信标频率 800Hz
信标幅度(Vpp) 1000mV
信标持续时间 2秒
音乐名称 让我们荡起双桨
音频采样速率 48000Sps
音频采样精度 16bit有符号采样

框图

框图

代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#
# SPDX-License-Identifier: GPL-3.0
#
# GNU Radio Python Flow Graph
# Title: play_audio_data
# GNU Radio version: 3.10.8.0

from PyQt5 import Qt
from gnuradio import qtgui
from gnuradio import audio
from gnuradio import blocks
import pmt
from gnuradio import gr
from gnuradio.filter import firdes
from gnuradio.fft import window
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
import sip



class exp4(gr.top_block, Qt.QWidget):

    def __init__(self):
        gr.top_block.__init__(self, "play_audio_data", catch_exceptions=True)
        Qt.QWidget.__init__(self)
        self.setWindowTitle("play_audio_data")
        qtgui.util.check_set_qss()
        try:
            self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
        except BaseException as exc:
            print(f"Qt GUI: Could not set Icon: {str(exc)}", file=sys.stderr)
        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", "exp4")

        try:
            geometry = self.settings.value("geometry")
            if geometry:
                self.restoreGeometry(geometry)
        except BaseException as exc:
            print(f"Qt GUI: Could not restore geometry: {str(exc)}", file=sys.stderr)

        ##################################################
        # Variables
        ##################################################
        self.samp_rate = samp_rate = 48000

        ##################################################
        # Blocks
        ##################################################

        self.qtgui_time_sink_x_0 = qtgui.time_sink_f(
            1024, #size
            samp_rate, #samp_rate
            "原始音频时域波形", #name
            1, #number of inputs
            None # parent
        )
        self.qtgui_time_sink_x_0.set_update_time(0.10)
        self.qtgui_time_sink_x_0.set_y_axis(-8000, 8000)

        self.qtgui_time_sink_x_0.set_y_label('Amplitude', "")

        self.qtgui_time_sink_x_0.enable_tags(True)
        self.qtgui_time_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "")
        self.qtgui_time_sink_x_0.enable_autoscale(False)
        self.qtgui_time_sink_x_0.enable_grid(False)
        self.qtgui_time_sink_x_0.enable_axis_labels(True)
        self.qtgui_time_sink_x_0.enable_control_panel(False)
        self.qtgui_time_sink_x_0.enable_stem_plot(False)


        labels = ['Signal 1', 'Signal 2', 'Signal 3', 'Signal 4', 'Signal 5',
            'Signal 6', 'Signal 7', 'Signal 8', 'Signal 9', 'Signal 10']
        widths = [1, 1, 1, 1, 1,
            1, 1, 1, 1, 1]
        colors = ['blue', 'red', 'green', 'black', 'cyan',
            'magenta', 'yellow', 'dark red', 'dark green', 'dark blue']
        alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
            1.0, 1.0, 1.0, 1.0, 1.0]
        styles = [1, 1, 1, 1, 1,
            1, 1, 1, 1, 1]
        markers = [-1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1]


        for i in range(1):
            if len(labels[i]) == 0:
                self.qtgui_time_sink_x_0.set_line_label(i, "Data {0}".format(i))
            else:
                self.qtgui_time_sink_x_0.set_line_label(i, labels[i])
            self.qtgui_time_sink_x_0.set_line_width(i, widths[i])
            self.qtgui_time_sink_x_0.set_line_color(i, colors[i])
            self.qtgui_time_sink_x_0.set_line_style(i, styles[i])
            self.qtgui_time_sink_x_0.set_line_marker(i, markers[i])
            self.qtgui_time_sink_x_0.set_line_alpha(i, alphas[i])

        self._qtgui_time_sink_x_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0.qwidget(), Qt.QWidget)
        self.top_layout.addWidget(self._qtgui_time_sink_x_0_win)
        self.blocks_wavfile_sink_0 = blocks.wavfile_sink(
            '/Users/workspace/Desktop/projects/凌特杯/software/exp4/music_recv.wav',
            1,
            samp_rate,
            blocks.FORMAT_WAV,
            blocks.FORMAT_PCM_16,
            False
            )
        self.blocks_short_to_float_0 = blocks.short_to_float(1, 1)
        self.blocks_file_source_0 = blocks.file_source(gr.sizeof_short*1, './Music.dat', True, 0, 0)
        self.blocks_file_source_0.set_begin_tag(pmt.PMT_NIL)
        self.audio_sink_0 = audio.sink(samp_rate, '', True)


        ##################################################
        # Connections
        ##################################################
        self.connect((self.blocks_file_source_0, 0), (self.blocks_short_to_float_0, 0))
        self.connect((self.blocks_short_to_float_0, 0), (self.audio_sink_0, 0))
        self.connect((self.blocks_short_to_float_0, 0), (self.blocks_wavfile_sink_0, 0))
        self.connect((self.blocks_short_to_float_0, 0), (self.qtgui_time_sink_x_0, 0))


    def closeEvent(self, event):
        self.settings = Qt.QSettings("GNU Radio", "exp4")
        self.settings.setValue("geometry", self.saveGeometry())
        self.stop()
        self.wait()

        event.accept()

    def get_samp_rate(self):
        return self.samp_rate

    def set_samp_rate(self, samp_rate):
        self.samp_rate = samp_rate
        self.qtgui_time_sink_x_0.set_samp_rate(self.samp_rate)


def main(top_block_cls=exp4, options=None):

    qapp = Qt.QApplication(sys.argv)

    tb = top_block_cls()

    tb.start()

    tb.show()

    def sig_handler(sig=None, frame=None):
        tb.stop()
        tb.wait()

        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)

    qapp.exec_()

if __name__ == '__main__':
    main()

标签:qtgui,音频,top,sink,time,Qt,播放,self,gnuradio
From: https://www.cnblogs.com/qsbye/p/18016362

相关文章

  • Linux Firefox 无法播放网页H5视频解决方案
    系统版本:Fedora38解决方案来自官方文档:https://docs.fedoraproject.org/en-US/quick-docs/openh264/#_firefox_config_changes安装openh264sudodnfconfig-manager--set-enabledfedora-cisco-openh264sudodnfinstall-ygstreamer1-plugin-openh264mozilla-openh264......
  • java 修改音频编码控制项
    在Java中修改音频编码控制项通常涉及到使用一些音频处理库,如JAVE(JavaAudioVideoEncoder)或者使用更底层的库如JNA(JavaNativeAccess)来调用本地编码库如FFmpeg。下面我将通过一个简单的案例来介绍如何使用JAVE库来修改音频编码的控制项。准备工作下载JAVE库:首先需要从JAVE的官方......
  • Canvas实现音频可视化波形图
    @目录1.效果演示2.基本概念说明2.1音频源节点2.2时域图2.3频谱图3.案例代码1.效果演示上图演示了音频的波形随着音乐的节奏而跌宕起伏2.基本概念说明2.1音频源节点音频数据的来源,是音频处理的其中一个环节2.2时域图声音信号是一维的时域信号,无法观察出频......
  • Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用
    一、前言之前在做倍速这个功能的时候,发现快速播放会有滴滴滴的破音出现,正常1倍速没有这个问题,尽管这个破音间隔很短,要放大音量才能听到,但是总归是不完美的,后面发现,通过修改qaudiooutput的采样率,可以规避这个问题,破音不在出现了,但是音调变了,倍速越大变得越快,人声越发不清晰,变得尖......
  • 获取动漫并播放
    importrequestsfrombs4importBeautifulSoup,NavigableString,Tagfromfake_useragentimportUserAgentBASE_URL="https://ww1.gogoanime2.org"#BASE_URL="https://search.bilibili.com"defsearch_scraper(anime_name:str)->list:......
  • 拉取RTSP流后的几个去向探讨(播放|转RTMP|轻量级RTSP服务|本地录制|GB28181)
    RTSP流的几个去处写了很多关于RTSP播放和转发的blog了,今天我们做个简单的汇总,以大牛直播SDK的Android平台为例,拉取到RTSP流,除了本地播放,还有几个流向:功能实现:1.拉流:通过RTSP直播播放SDK的数据回调接口,拿到音视频数据;2.转推:通过RTMP直播推送SDK的编码后数据输入接口,把回调上来的数......
  • Rockchip RK3399 - HDMI音频
    (转载请删除括号里的内容)----------------------------------------------------------------------------------------------------------------------------开发板:NanoPC-T4开发板eMMC:16GBLPDDR3:4GB显示屏:15.6英寸HDMI接口显示屏u-boot:2023.04linux  :6.3-......
  • [经验] 手机怎么连蓝牙音箱播放音乐
    1、手机怎么连蓝牙现在,手机已经成为我们日常生活中必不可少的一种工具,它不仅可以帮助我们完成通话、发送短信、浏览网页等基本功能,还可以通过蓝牙连接其他设备,如耳机、扬声器等,使我们的生活更加便利。那么,手机怎么连蓝牙呢?下面,我们来详细了解一下。我们需要确保手机的蓝牙功能是打......
  • ffmpeg提取音频
    要使用FFmpeg提取音频,你需要使用以下命令行语法:ffmpeg-i输入视频文件.mp4-vn-acodeccopy输出音频文件.aac这里是命令的解释:-i输入视频文件.mp4:指定输入视频文件的路径和名称。-vn:禁用视频流。这告诉FFmpeg不要复制视频流。-acodeccopy:指定音频编解码器为拷贝(copy),这......
  • 如何配置LiveNVR实现在服务器上多个不同的磁盘目录存储监控摄像头的录像,并支持电脑、
    @目录1、流媒体服务软件2、配置开启录像(云端录像)3、指定录像存储路径4、录像回看(云端录像)4.1、查看录像4.1.1、时间轴视图4.1.2、列表视图5、云端录像相关接口6、如何分享时间轴录像回看?7、iframe集成示例8、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务1、流媒体服务软件LiveNVR......