123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- #
- # SPDX-License-Identifier: GPL-3.0
- #
- # GNU Radio Python Flow Graph
- # Title: FM Radio Receiver
- # GNU Radio version: 3.10.5.1
- from packaging.version import Version as 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 PyQt5 import Qt
- from gnuradio import qtgui
- from gnuradio.filter import firdes
- import sip
- from gnuradio import analog
- from gnuradio import audio
- from gnuradio import blocks
- from gnuradio import filter
- from gnuradio import gr
- from gnuradio.fft import window
- import sys
- import signal
- from argparse import ArgumentParser
- from gnuradio.eng_arg import eng_float, intx
- from gnuradio import eng_notation
- from gnuradio.qtgui import Range, RangeWidget
- from PyQt5 import QtCore
- import osmosdr
- import time
- from gnuradio import qtgui
- class fm_radio(gr.top_block, Qt.QWidget):
- def __init__(self):
- gr.top_block.__init__(self, "FM Radio Receiver", catch_exceptions=True)
- Qt.QWidget.__init__(self)
- self.setWindowTitle("FM Radio Receiver")
- 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", "fm_radio")
- 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.volume = volume = 0.5
- self.samp_rate = samp_rate = 2560000
- self.frequency_mhz = frequency_mhz = 98.3
- self.channel_width_hertz = channel_width_hertz = 250000
- self.audio_sample_rate_hertz = audio_sample_rate_hertz = 48000
- ##################################################
- # Blocks
- ##################################################
- self._volume_range = Range(0, 1, 0.05, 0.5, 200)
- self._volume_win = RangeWidget(self._volume_range, self.set_volume, "Volume", "counter_slider", float, QtCore.Qt.Horizontal)
- self.top_layout.addWidget(self._volume_win)
- self._frequency_mhz_range = Range(87.5, 108, 0.1, 98.3, 200)
- self._frequency_mhz_win = RangeWidget(self._frequency_mhz_range, self.set_frequency_mhz, "Frequency MHz", "counter_slider", float, QtCore.Qt.Horizontal)
- self.top_layout.addWidget(self._frequency_mhz_win)
- self.rtlsdr_source_0 = osmosdr.source(
- args="numchan=" + str(1) + " " + ""
- )
- self.rtlsdr_source_0.set_time_unknown_pps(osmosdr.time_spec_t())
- self.rtlsdr_source_0.set_sample_rate(samp_rate)
- self.rtlsdr_source_0.set_center_freq((frequency_mhz*1e6), 0)
- self.rtlsdr_source_0.set_freq_corr(0, 0)
- self.rtlsdr_source_0.set_dc_offset_mode(0, 0)
- self.rtlsdr_source_0.set_iq_balance_mode(0, 0)
- self.rtlsdr_source_0.set_gain_mode(False, 0)
- self.rtlsdr_source_0.set_gain(20, 0)
- self.rtlsdr_source_0.set_if_gain(20, 0)
- self.rtlsdr_source_0.set_bb_gain(20, 0)
- self.rtlsdr_source_0.set_antenna('', 0)
- self.rtlsdr_source_0.set_bandwidth(0, 0)
- self.rational_resampler_xxx_0 = filter.rational_resampler_fff(
- interpolation=audio_sample_rate_hertz,
- decimation=channel_width_hertz,
- taps=[],
- fractional_bw=0)
- self.qtgui_waterfall_sink_x_0 = qtgui.waterfall_sink_c(
- 1024, #size
- window.WIN_BLACKMAN_hARRIS, #wintype
- (frequency_mhz*1e6), #fc
- samp_rate, #bw
- "", #name
- 1, #number of inputs
- None # parent
- )
- self.qtgui_waterfall_sink_x_0.set_update_time(0.10)
- self.qtgui_waterfall_sink_x_0.enable_grid(False)
- self.qtgui_waterfall_sink_x_0.enable_axis_labels(True)
- labels = ['', '', '', '', '',
- '', '', '', '', '']
- colors = [0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0]
- alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
- 1.0, 1.0, 1.0, 1.0, 1.0]
- for i in range(1):
- if len(labels[i]) == 0:
- self.qtgui_waterfall_sink_x_0.set_line_label(i, "Data {0}".format(i))
- else:
- self.qtgui_waterfall_sink_x_0.set_line_label(i, labels[i])
- self.qtgui_waterfall_sink_x_0.set_color_map(i, colors[i])
- self.qtgui_waterfall_sink_x_0.set_line_alpha(i, alphas[i])
- self.qtgui_waterfall_sink_x_0.set_intensity_range(-140, 10)
- self._qtgui_waterfall_sink_x_0_win = sip.wrapinstance(self.qtgui_waterfall_sink_x_0.qwidget(), Qt.QWidget)
- self.top_layout.addWidget(self._qtgui_waterfall_sink_x_0_win)
- self.qtgui_freq_sink_x_0 = qtgui.freq_sink_f(
- 1024, #size
- window.WIN_BLACKMAN_hARRIS, #wintype
- 0, #fc
- channel_width_hertz, #bw
- "Demod Out", #name
- 1,
- None # parent
- )
- self.qtgui_freq_sink_x_0.set_update_time(0.10)
- self.qtgui_freq_sink_x_0.set_y_axis((-140), 10)
- self.qtgui_freq_sink_x_0.set_y_label('Relative Gain', 'dB')
- self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "")
- self.qtgui_freq_sink_x_0.enable_autoscale(False)
- self.qtgui_freq_sink_x_0.enable_grid(False)
- self.qtgui_freq_sink_x_0.set_fft_average(1.0)
- self.qtgui_freq_sink_x_0.enable_axis_labels(True)
- self.qtgui_freq_sink_x_0.enable_control_panel(False)
- self.qtgui_freq_sink_x_0.set_fft_window_normalized(False)
- self.qtgui_freq_sink_x_0.disable_legend()
- self.qtgui_freq_sink_x_0.set_plot_pos_half(not True)
- labels = ['', '', '', '', '',
- '', '', '', '', '']
- 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]
- for i in range(1):
- if len(labels[i]) == 0:
- self.qtgui_freq_sink_x_0.set_line_label(i, "Data {0}".format(i))
- else:
- self.qtgui_freq_sink_x_0.set_line_label(i, labels[i])
- self.qtgui_freq_sink_x_0.set_line_width(i, widths[i])
- self.qtgui_freq_sink_x_0.set_line_color(i, colors[i])
- self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i])
- self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.qwidget(), Qt.QWidget)
- self.top_layout.addWidget(self._qtgui_freq_sink_x_0_win)
- self.low_pass_filter_0 = filter.fir_filter_ccf(
- (int(samp_rate/channel_width_hertz)),
- firdes.low_pass(
- 2,
- samp_rate,
- 100000,
- 10000,
- window.WIN_KAISER,
- 6.76))
- self.blocks_multiply_const_vxx_0 = blocks.multiply_const_ff(volume)
- self.audio_sink_0 = audio.sink(audio_sample_rate_hertz, '', True)
- self.analog_wfm_rcv_0 = analog.wfm_rcv(
- quad_rate=channel_width_hertz,
- audio_decimation=1,
- )
- ##################################################
- # Connections
- ##################################################
- self.connect((self.analog_wfm_rcv_0, 0), (self.qtgui_freq_sink_x_0, 0))
- self.connect((self.analog_wfm_rcv_0, 0), (self.rational_resampler_xxx_0, 0))
- self.connect((self.blocks_multiply_const_vxx_0, 0), (self.audio_sink_0, 0))
- self.connect((self.low_pass_filter_0, 0), (self.analog_wfm_rcv_0, 0))
- self.connect((self.rational_resampler_xxx_0, 0), (self.blocks_multiply_const_vxx_0, 0))
- self.connect((self.rtlsdr_source_0, 0), (self.low_pass_filter_0, 0))
- self.connect((self.rtlsdr_source_0, 0), (self.qtgui_waterfall_sink_x_0, 0))
- def closeEvent(self, event):
- self.settings = Qt.QSettings("GNU Radio", "fm_radio")
- self.settings.setValue("geometry", self.saveGeometry())
- self.stop()
- self.wait()
- event.accept()
- def get_volume(self):
- return self.volume
- def set_volume(self, volume):
- self.volume = volume
- self.blocks_multiply_const_vxx_0.set_k(self.volume)
- def get_samp_rate(self):
- return self.samp_rate
- def set_samp_rate(self, samp_rate):
- self.samp_rate = samp_rate
- self.low_pass_filter_0.set_taps(firdes.low_pass(2, self.samp_rate, 100000, 10000, window.WIN_KAISER, 6.76))
- self.qtgui_waterfall_sink_x_0.set_frequency_range((self.frequency_mhz*1e6), self.samp_rate)
- self.rtlsdr_source_0.set_sample_rate(self.samp_rate)
- def get_frequency_mhz(self):
- return self.frequency_mhz
- def set_frequency_mhz(self, frequency_mhz):
- self.frequency_mhz = frequency_mhz
- self.qtgui_waterfall_sink_x_0.set_frequency_range((self.frequency_mhz*1e6), self.samp_rate)
- self.rtlsdr_source_0.set_center_freq((self.frequency_mhz*1e6), 0)
- def get_channel_width_hertz(self):
- return self.channel_width_hertz
- def set_channel_width_hertz(self, channel_width_hertz):
- self.channel_width_hertz = channel_width_hertz
- self.qtgui_freq_sink_x_0.set_frequency_range(0, self.channel_width_hertz)
- def get_audio_sample_rate_hertz(self):
- return self.audio_sample_rate_hertz
- def set_audio_sample_rate_hertz(self, audio_sample_rate_hertz):
- self.audio_sample_rate_hertz = audio_sample_rate_hertz
- def main(top_block_cls=fm_radio, 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):
- 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()
|