fm_radio.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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.fft
  10. import gnuradio.filter
  11. import gnuradio.gr
  12. import osmosdr
  13. class fm_radio(gnuradio.gr.top_block):
  14. def __init__(self):
  15. gnuradio.gr.top_block.__init__(self, "FM Radio Receiver", catch_exceptions=True)
  16. channel_width_hertz = 250000
  17. audio_sample_rate_hertz = 48000
  18. rtlsdr_source = osmosdr.source()
  19. rtlsdr_source.set_sample_rate(2560000) # Hz
  20. rtlsdr_source.set_center_freq((98.3 * 1e6), 0)
  21. resampler = gnuradio.filter.rational_resampler_fff(
  22. interpolation=audio_sample_rate_hertz, decimation=channel_width_hertz
  23. )
  24. low_pass_filter = gnuradio.filter.fir_filter_ccf(
  25. int(rtlsdr_source.get_sample_rate() / channel_width_hertz),
  26. gnuradio.filter.firdes.low_pass(
  27. gain=2,
  28. sampling_freq=rtlsdr_source.get_sample_rate(),
  29. cutoff_freq=100000,
  30. transition_width=10000,
  31. ),
  32. )
  33. audio_sink = gnuradio.audio.sink(audio_sample_rate_hertz)
  34. wbfm_demodulator = gnuradio.analog.wfm_rcv(
  35. quad_rate=channel_width_hertz, audio_decimation=1
  36. )
  37. self.connect((wbfm_demodulator, 0), (resampler, 0))
  38. self.connect((low_pass_filter, 0), (wbfm_demodulator, 0))
  39. self.connect((resampler, 0), (audio_sink, 0))
  40. self.connect((rtlsdr_source, 0), (low_pass_filter, 0))
  41. def _main():
  42. top_block = fm_radio()
  43. top_block.start()
  44. input("Press Enter to quit: ")
  45. top_block.stop()
  46. top_block.wait()
  47. if __name__ == "__main__":
  48. _main()