#!/usr/bin/env python3 # # SPDX-License-Identifier: GPL-3.0 # # GNU Radio Python Flow Graph # Title: FM Radio Receiver import gnuradio.analog import gnuradio.audio import gnuradio.fft import gnuradio.filter import gnuradio.gr import osmosdr class fm_radio(gnuradio.gr.top_block): def __init__(self): gnuradio.gr.top_block.__init__(self, "FM Radio Receiver", catch_exceptions=True) samp_rate = 2560000 channel_width_hertz = 250000 audio_sample_rate_hertz = 48000 rtlsdr_source = osmosdr.source() rtlsdr_source.set_sample_rate(samp_rate) rtlsdr_source.set_center_freq((98.3 * 1e6), 0) resampler = gnuradio.filter.rational_resampler_fff( interpolation=audio_sample_rate_hertz, decimation=channel_width_hertz ) low_pass_filter = gnuradio.filter.fir_filter_ccf( samp_rate // channel_width_hertz, gnuradio.filter.firdes.low_pass( 2, samp_rate, 100000, 10000, gnuradio.fft.window.WIN_KAISER, 6.76 ), ) audio_sink = gnuradio.audio.sink(audio_sample_rate_hertz) wbfm_demodulator = gnuradio.analog.wfm_rcv( quad_rate=channel_width_hertz, audio_decimation=1 ) self.connect((wbfm_demodulator, 0), (resampler, 0)) self.connect((low_pass_filter, 0), (wbfm_demodulator, 0)) self.connect((resampler, 0), (audio_sink, 0)) self.connect((rtlsdr_source, 0), (low_pass_filter, 0)) def _main(): top_block = fm_radio() top_block.start() input("Press Enter to quit: ") top_block.stop() top_block.wait() if __name__ == "__main__": _main()