fm_radio.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #!/usr/bin/env python3
  2. #
  3. # SPDX-License-Identifier: GPL-3.0
  4. #
  5. # GNU Radio Python Flow Graph
  6. # Title: FM Radio Receiver
  7. import gnuradio.analog
  8. import gnuradio.audio
  9. import gnuradio.filter
  10. import gnuradio.gr
  11. import osmosdr
  12. class fm_radio(gnuradio.gr.top_block):
  13. def __init__(self):
  14. gnuradio.gr.top_block.__init__(self, "FM Radio Receiver", catch_exceptions=True)
  15. audio_sample_rate_hertz = 48000
  16. channel_width_hertz = (
  17. 250000 // audio_sample_rate_hertz
  18. ) * audio_sample_rate_hertz
  19. rtlsdr_source = osmosdr.source()
  20. rtlsdr_source.set_sample_rate(2560000) # Hz
  21. rtlsdr_source.set_center_freq((98.3 * 1e6), 0)
  22. resampler = gnuradio.filter.rational_resampler_ccf(
  23. interpolation=channel_width_hertz,
  24. decimation=int(rtlsdr_source.get_sample_rate()),
  25. )
  26. self.connect((rtlsdr_source, 0), (resampler, 0))
  27. assert channel_width_hertz % audio_sample_rate_hertz == 0
  28. wbfm_demodulator = gnuradio.analog.wfm_rcv(
  29. quad_rate=channel_width_hertz,
  30. audio_decimation=channel_width_hertz // audio_sample_rate_hertz,
  31. )
  32. self.connect((resampler, 0), (wbfm_demodulator, 0))
  33. audio_sink = gnuradio.audio.sink(audio_sample_rate_hertz, "", False)
  34. self.connect((wbfm_demodulator, 0), (audio_sink, 0))
  35. def _main():
  36. top_block = fm_radio()
  37. top_block.start()
  38. input("Press Enter to quit: ")
  39. top_block.stop()
  40. top_block.wait()
  41. if __name__ == "__main__":
  42. _main()