#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # SPDX-License-Identifier: GPL-3.0 # # GNU Radio Python Flow Graph # Title: FM Radio Receiver import signal import sys 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( (int(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, "", True) 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_cls=fm_radio, options=None): tb = top_block_cls() def sig_handler(sig=None, frame=None): tb.stop() tb.wait() sys.exit(0) signal.signal(signal.SIGINT, sig_handler) signal.signal(signal.SIGTERM, sig_handler) tb.start() try: input("Press Enter to quit: ") except EOFError: pass tb.stop() tb.wait() if __name__ == "__main__": main()