fm_radio.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. #
  4. # SPDX-License-Identifier: GPL-3.0
  5. #
  6. # GNU Radio Python Flow Graph
  7. # Title: FM Radio Receiver
  8. # GNU Radio version: 3.10.5.1
  9. from packaging.version import Version as StrictVersion
  10. if __name__ == '__main__':
  11. import ctypes
  12. import sys
  13. if sys.platform.startswith('linux'):
  14. try:
  15. x11 = ctypes.cdll.LoadLibrary('libX11.so')
  16. x11.XInitThreads()
  17. except:
  18. print("Warning: failed to XInitThreads()")
  19. from gnuradio import analog
  20. from gnuradio import audio
  21. from gnuradio import filter
  22. from gnuradio.filter import firdes
  23. from gnuradio import gr
  24. from gnuradio.fft import window
  25. import sys
  26. import signal
  27. from PyQt5 import Qt
  28. from argparse import ArgumentParser
  29. from gnuradio.eng_arg import eng_float, intx
  30. from gnuradio import eng_notation
  31. from gnuradio.qtgui import Range, RangeWidget
  32. from PyQt5 import QtCore
  33. import osmosdr
  34. import time
  35. from gnuradio import qtgui
  36. class fm_radio(gr.top_block, Qt.QWidget):
  37. def __init__(self):
  38. gr.top_block.__init__(self, "FM Radio Receiver", catch_exceptions=True)
  39. Qt.QWidget.__init__(self)
  40. self.setWindowTitle("FM Radio Receiver")
  41. qtgui.util.check_set_qss()
  42. try:
  43. self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
  44. except:
  45. pass
  46. self.top_scroll_layout = Qt.QVBoxLayout()
  47. self.setLayout(self.top_scroll_layout)
  48. self.top_scroll = Qt.QScrollArea()
  49. self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
  50. self.top_scroll_layout.addWidget(self.top_scroll)
  51. self.top_scroll.setWidgetResizable(True)
  52. self.top_widget = Qt.QWidget()
  53. self.top_scroll.setWidget(self.top_widget)
  54. self.top_layout = Qt.QVBoxLayout(self.top_widget)
  55. self.top_grid_layout = Qt.QGridLayout()
  56. self.top_layout.addLayout(self.top_grid_layout)
  57. self.settings = Qt.QSettings("GNU Radio", "fm_radio")
  58. try:
  59. if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
  60. self.restoreGeometry(self.settings.value("geometry").toByteArray())
  61. else:
  62. self.restoreGeometry(self.settings.value("geometry"))
  63. except:
  64. pass
  65. ##################################################
  66. # Variables
  67. ##################################################
  68. self.samp_rate = samp_rate = 2560000
  69. self.frequency_mhz = frequency_mhz = 98.3
  70. self.channel_width_hertz = channel_width_hertz = 250000
  71. self.audio_sample_rate_hertz = audio_sample_rate_hertz = 48000
  72. ##################################################
  73. # Blocks
  74. ##################################################
  75. self._frequency_mhz_range = Range(87.5, 108, 0.1, 98.3, 200)
  76. self._frequency_mhz_win = RangeWidget(self._frequency_mhz_range, self.set_frequency_mhz, "Frequency MHz", "counter_slider", float, QtCore.Qt.Horizontal)
  77. self.top_layout.addWidget(self._frequency_mhz_win)
  78. self.rtlsdr_source_0 = osmosdr.source(
  79. args="numchan=" + str(1) + " " + ""
  80. )
  81. self.rtlsdr_source_0.set_time_unknown_pps(osmosdr.time_spec_t())
  82. self.rtlsdr_source_0.set_sample_rate(samp_rate)
  83. self.rtlsdr_source_0.set_center_freq((frequency_mhz*1e6), 0)
  84. self.rtlsdr_source_0.set_freq_corr(0, 0)
  85. self.rtlsdr_source_0.set_dc_offset_mode(0, 0)
  86. self.rtlsdr_source_0.set_iq_balance_mode(0, 0)
  87. self.rtlsdr_source_0.set_gain_mode(False, 0)
  88. self.rtlsdr_source_0.set_gain(20, 0)
  89. self.rtlsdr_source_0.set_if_gain(20, 0)
  90. self.rtlsdr_source_0.set_bb_gain(20, 0)
  91. self.rtlsdr_source_0.set_antenna('', 0)
  92. self.rtlsdr_source_0.set_bandwidth(0, 0)
  93. self.rational_resampler_xxx_0 = filter.rational_resampler_fff(
  94. interpolation=audio_sample_rate_hertz,
  95. decimation=channel_width_hertz,
  96. taps=[],
  97. fractional_bw=0)
  98. self.low_pass_filter_0 = filter.fir_filter_ccf(
  99. (int(samp_rate/channel_width_hertz)),
  100. firdes.low_pass(
  101. 2,
  102. samp_rate,
  103. 100000,
  104. 10000,
  105. window.WIN_KAISER,
  106. 6.76))
  107. self.audio_sink_0 = audio.sink(audio_sample_rate_hertz, '', True)
  108. self.analog_wfm_rcv_0 = analog.wfm_rcv(
  109. quad_rate=channel_width_hertz,
  110. audio_decimation=1,
  111. )
  112. ##################################################
  113. # Connections
  114. ##################################################
  115. self.connect((self.analog_wfm_rcv_0, 0), (self.rational_resampler_xxx_0, 0))
  116. self.connect((self.low_pass_filter_0, 0), (self.analog_wfm_rcv_0, 0))
  117. self.connect((self.rational_resampler_xxx_0, 0), (self.audio_sink_0, 0))
  118. self.connect((self.rtlsdr_source_0, 0), (self.low_pass_filter_0, 0))
  119. def closeEvent(self, event):
  120. self.settings = Qt.QSettings("GNU Radio", "fm_radio")
  121. self.settings.setValue("geometry", self.saveGeometry())
  122. self.stop()
  123. self.wait()
  124. event.accept()
  125. def get_samp_rate(self):
  126. return self.samp_rate
  127. def set_samp_rate(self, samp_rate):
  128. self.samp_rate = samp_rate
  129. self.low_pass_filter_0.set_taps(firdes.low_pass(2, self.samp_rate, 100000, 10000, window.WIN_KAISER, 6.76))
  130. self.rtlsdr_source_0.set_sample_rate(self.samp_rate)
  131. def get_frequency_mhz(self):
  132. return self.frequency_mhz
  133. def set_frequency_mhz(self, frequency_mhz):
  134. self.frequency_mhz = frequency_mhz
  135. self.rtlsdr_source_0.set_center_freq((self.frequency_mhz*1e6), 0)
  136. def get_channel_width_hertz(self):
  137. return self.channel_width_hertz
  138. def set_channel_width_hertz(self, channel_width_hertz):
  139. self.channel_width_hertz = channel_width_hertz
  140. def get_audio_sample_rate_hertz(self):
  141. return self.audio_sample_rate_hertz
  142. def set_audio_sample_rate_hertz(self, audio_sample_rate_hertz):
  143. self.audio_sample_rate_hertz = audio_sample_rate_hertz
  144. def main(top_block_cls=fm_radio, options=None):
  145. if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
  146. style = gr.prefs().get_string('qtgui', 'style', 'raster')
  147. Qt.QApplication.setGraphicsSystem(style)
  148. qapp = Qt.QApplication(sys.argv)
  149. tb = top_block_cls()
  150. tb.start()
  151. tb.show()
  152. def sig_handler(sig=None, frame=None):
  153. tb.stop()
  154. tb.wait()
  155. Qt.QApplication.quit()
  156. signal.signal(signal.SIGINT, sig_handler)
  157. signal.signal(signal.SIGTERM, sig_handler)
  158. timer = Qt.QTimer()
  159. timer.start(500)
  160. timer.timeout.connect(lambda: None)
  161. qapp.exec_()
  162. if __name__ == '__main__':
  163. main()