Browse Source

replace low pass filter with rational resampler before demodulator and replace retional resampler after demodulator with `audio_decimation` setting (in attempt to reduce cpu utilization for devices like raspberry pi 1B)

Fabian Peter Hammerle 8 months ago
parent
commit
1dc3df12ff
1 changed files with 15 additions and 19 deletions
  1. 15 19
      fm_radio.py

+ 15 - 19
fm_radio.py

@@ -7,7 +7,6 @@
 
 import gnuradio.analog
 import gnuradio.audio
-import gnuradio.fft
 import gnuradio.filter
 import gnuradio.gr
 import osmosdr
@@ -17,33 +16,30 @@ class fm_radio(gnuradio.gr.top_block):
     def __init__(self):
         gnuradio.gr.top_block.__init__(self, "FM Radio Receiver", catch_exceptions=True)
 
-        channel_width_hertz = 250000
         audio_sample_rate_hertz = 48000
+        channel_width_hertz = (
+            250000 // audio_sample_rate_hertz
+        ) * audio_sample_rate_hertz
 
         rtlsdr_source = osmosdr.source()
         rtlsdr_source.set_sample_rate(2560000)  # Hz
         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(rtlsdr_source.get_sample_rate() / channel_width_hertz),
-            gnuradio.filter.firdes.low_pass(
-                gain=2,
-                sampling_freq=rtlsdr_source.get_sample_rate(),
-                cutoff_freq=100000,
-                transition_width=10000,
-            ),
+
+        resampler = gnuradio.filter.rational_resampler_ccf(
+            interpolation=channel_width_hertz,
+            decimation=int(rtlsdr_source.get_sample_rate()),
         )
-        audio_sink = gnuradio.audio.sink(audio_sample_rate_hertz)
+        self.connect((rtlsdr_source, 0), (resampler, 0))
+
+        assert channel_width_hertz % audio_sample_rate_hertz == 0
         wbfm_demodulator = gnuradio.analog.wfm_rcv(
-            quad_rate=channel_width_hertz, audio_decimation=1
+            quad_rate=channel_width_hertz,
+            audio_decimation=channel_width_hertz // audio_sample_rate_hertz,
         )
+        self.connect((resampler, 0), (wbfm_demodulator, 0))
 
-        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))
+        audio_sink = gnuradio.audio.sink(audio_sample_rate_hertz, "", False)
+        self.connect((wbfm_demodulator, 0), (audio_sink, 0))
 
 
 def _main():