fm_radio.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. import signal
  9. import sys
  10. import gnuradio.analog
  11. import gnuradio.audio
  12. import gnuradio.fft
  13. import gnuradio.filter
  14. import gnuradio.gr
  15. import osmosdr
  16. class fm_radio(gnuradio.gr.top_block):
  17. def __init__(self):
  18. gnuradio.gr.top_block.__init__(self, "FM Radio Receiver", catch_exceptions=True)
  19. samp_rate = 2560000
  20. channel_width_hertz = 250000
  21. audio_sample_rate_hertz = 48000
  22. rtlsdr_source = osmosdr.source()
  23. rtlsdr_source.set_sample_rate(samp_rate)
  24. rtlsdr_source.set_center_freq((98.3 * 1e6), 0)
  25. resampler = gnuradio.filter.rational_resampler_fff(
  26. interpolation=audio_sample_rate_hertz, decimation=channel_width_hertz
  27. )
  28. low_pass_filter = gnuradio.filter.fir_filter_ccf(
  29. (int(samp_rate / channel_width_hertz)),
  30. gnuradio.filter.firdes.low_pass(
  31. 2, samp_rate, 100000, 10000, gnuradio.fft.window.WIN_KAISER, 6.76
  32. ),
  33. )
  34. audio_sink = gnuradio.audio.sink(audio_sample_rate_hertz, "", True)
  35. wbfm_demodulator = gnuradio.analog.wfm_rcv(
  36. quad_rate=channel_width_hertz, audio_decimation=1
  37. )
  38. self.connect((wbfm_demodulator, 0), (resampler, 0))
  39. self.connect((low_pass_filter, 0), (wbfm_demodulator, 0))
  40. self.connect((resampler, 0), (audio_sink, 0))
  41. self.connect((rtlsdr_source, 0), (low_pass_filter, 0))
  42. def main(top_block_cls=fm_radio, options=None):
  43. tb = top_block_cls()
  44. def sig_handler(sig=None, frame=None):
  45. tb.stop()
  46. tb.wait()
  47. sys.exit(0)
  48. signal.signal(signal.SIGINT, sig_handler)
  49. signal.signal(signal.SIGTERM, sig_handler)
  50. tb.start()
  51. try:
  52. input("Press Enter to quit: ")
  53. except EOFError:
  54. pass
  55. tb.stop()
  56. tb.wait()
  57. if __name__ == "__main__":
  58. main()