fm_radio.py 4.0 KB

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