fm_radio.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. from gnuradio import analog
  9. from gnuradio import audio
  10. from gnuradio import filter
  11. from gnuradio.filter import firdes
  12. from gnuradio import gr
  13. from gnuradio.fft import window
  14. import sys
  15. import signal
  16. from argparse import ArgumentParser
  17. from gnuradio.eng_arg import eng_float, intx
  18. from gnuradio import eng_notation
  19. import osmosdr
  20. import time
  21. class fm_radio(gr.top_block):
  22. def __init__(self):
  23. gr.top_block.__init__(self, "FM Radio Receiver", catch_exceptions=True)
  24. # Variables
  25. self.samp_rate = samp_rate = 2560000
  26. self.channel_width_hertz = channel_width_hertz = 250000
  27. self.audio_sample_rate_hertz = audio_sample_rate_hertz = 48000
  28. # Blocks
  29. self.rtlsdr_source_0 = osmosdr.source(args="numchan=" + str(1) + " " + "")
  30. self.rtlsdr_source_0.set_time_unknown_pps(osmosdr.time_spec_t())
  31. self.rtlsdr_source_0.set_sample_rate(samp_rate)
  32. self.rtlsdr_source_0.set_center_freq((98.3 * 1e6), 0)
  33. self.rtlsdr_source_0.set_freq_corr(0, 0)
  34. self.rtlsdr_source_0.set_dc_offset_mode(0, 0)
  35. self.rtlsdr_source_0.set_iq_balance_mode(0, 0)
  36. self.rtlsdr_source_0.set_gain_mode(False, 0)
  37. self.rtlsdr_source_0.set_gain(20, 0)
  38. self.rtlsdr_source_0.set_if_gain(20, 0)
  39. self.rtlsdr_source_0.set_bb_gain(20, 0)
  40. self.rtlsdr_source_0.set_antenna("", 0)
  41. self.rtlsdr_source_0.set_bandwidth(0, 0)
  42. self.rational_resampler_xxx_0 = filter.rational_resampler_fff(
  43. interpolation=audio_sample_rate_hertz,
  44. decimation=channel_width_hertz,
  45. taps=[],
  46. fractional_bw=0,
  47. )
  48. self.low_pass_filter_0 = filter.fir_filter_ccf(
  49. (int(samp_rate / channel_width_hertz)),
  50. firdes.low_pass(2, samp_rate, 100000, 10000, window.WIN_KAISER, 6.76),
  51. )
  52. self.audio_sink_0 = audio.sink(audio_sample_rate_hertz, "", True)
  53. self.analog_wfm_rcv_0 = analog.wfm_rcv(
  54. quad_rate=channel_width_hertz,
  55. audio_decimation=1,
  56. )
  57. # Connections
  58. self.connect((self.analog_wfm_rcv_0, 0), (self.rational_resampler_xxx_0, 0))
  59. self.connect((self.low_pass_filter_0, 0), (self.analog_wfm_rcv_0, 0))
  60. self.connect((self.rational_resampler_xxx_0, 0), (self.audio_sink_0, 0))
  61. self.connect((self.rtlsdr_source_0, 0), (self.low_pass_filter_0, 0))
  62. def main(top_block_cls=fm_radio, options=None):
  63. tb = top_block_cls()
  64. def sig_handler(sig=None, frame=None):
  65. tb.stop()
  66. tb.wait()
  67. sys.exit(0)
  68. signal.signal(signal.SIGINT, sig_handler)
  69. signal.signal(signal.SIGTERM, sig_handler)
  70. tb.start()
  71. try:
  72. input("Press Enter to quit: ")
  73. except EOFError:
  74. pass
  75. tb.stop()
  76. tb.wait()
  77. if __name__ == "__main__":
  78. main()