fm_radio.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. samp_rate = 2560000
  17. channel_width_hertz = 250000
  18. audio_sample_rate_hertz = 48000
  19. rtlsdr_source = osmosdr.source()
  20. rtlsdr_source.set_sample_rate(samp_rate)
  21. rtlsdr_source.set_center_freq((98.3 * 1e6), 0)
  22. resampler = gnuradio.filter.rational_resampler_fff(
  23. interpolation=audio_sample_rate_hertz, decimation=channel_width_hertz
  24. )
  25. low_pass_filter = gnuradio.filter.fir_filter_ccf(
  26. samp_rate // channel_width_hertz,
  27. gnuradio.filter.firdes.low_pass(
  28. 2, samp_rate, 100000, 10000, gnuradio.fft.window.WIN_KAISER, 6.76
  29. ),
  30. )
  31. audio_sink = gnuradio.audio.sink(audio_sample_rate_hertz)
  32. wbfm_demodulator = gnuradio.analog.wfm_rcv(
  33. quad_rate=channel_width_hertz, audio_decimation=1
  34. )
  35. self.connect((wbfm_demodulator, 0), (resampler, 0))
  36. self.connect((low_pass_filter, 0), (wbfm_demodulator, 0))
  37. self.connect((resampler, 0), (audio_sink, 0))
  38. self.connect((rtlsdr_source, 0), (low_pass_filter, 0))
  39. def _main():
  40. top_block = fm_radio()
  41. top_block.start()
  42. input("Press Enter to quit: ")
  43. top_block.stop()
  44. top_block.wait()
  45. if __name__ == "__main__":
  46. _main()