From 0a6325613f6e64d1be07e6fa43f606c8728ba501 Mon Sep 17 00:00:00 2001 From: Mark Jessop Date: Thu, 21 Sep 2017 20:20:32 +0930 Subject: [PATCH] Updated fm_demod to calculate filter width using Carson's rule. --- apps/flowgraphs/fm_demod.grc | 151 ++++++---------------------- apps/flowgraphs/satnogs_fm_demod.py | 20 ++-- 2 files changed, 45 insertions(+), 126 deletions(-) diff --git a/apps/flowgraphs/fm_demod.grc b/apps/flowgraphs/fm_demod.grc index 3f57494..e215a9e 100644 --- a/apps/flowgraphs/fm_demod.grc +++ b/apps/flowgraphs/fm_demod.grc @@ -178,7 +178,7 @@ SDR received samples _coordinate - (781, 865) + (928, 1028) _rotation @@ -220,6 +220,33 @@ SDR received samples 250000 + + variable + + comment + + + + _enabled + True + + + _coordinate + (1040, 1028) + + + _rotation + 0 + + + id + max_modulation_freq + + + value + 3000 + + variable @@ -537,108 +564,6 @@ TX sampling rate ccc - - blocks_float_to_short - - alias - - - - comment - - - - affinity - - - - _enabled - True - - - _coordinate - (696, 532) - - - _rotation - 180 - - - id - blocks_float_to_short_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - scale - 32767 - - - vlen - 1 - - - - blocks_udp_sink - - alias - - - - comment - - - - affinity - - - - ipaddr - 127.0.0.1 - - - port - 7355 - - - _enabled - True - - - _coordinate - (384, 512) - - - _rotation - 180 - - - id - blocks_udp_sink_0 - - - type - short - - - psize - 1472 - - - eof - False - - - vlen - 1 - - parameter @@ -1055,8 +980,10 @@ we shift the LO a little further comment - 16 kHz filter width, about right -for a standard 5 kHz Dev FM signal. + Using the Carson bandwidth rule for filter width: +width = 2*(deviation + max_modulation_freq). +For the majority of FM transmissions we can expect +max_modulation_freq = 3000 affinity @@ -1064,7 +991,7 @@ for a standard 5 kHz Dev FM signal. cutoff_freq - 8000 + deviation+max_modulation_freq decim @@ -3035,12 +2962,6 @@ for a standard 5 kHz Dev FM signal. /tmp/waterfall.dat - - analog_quadrature_demod_cf_0 - blocks_float_to_short_0 - 0 - 0 - analog_quadrature_demod_cf_0 satnogs_ogg_encoder_0 @@ -3065,12 +2986,6 @@ for a standard 5 kHz Dev FM signal. 0 0 - - blocks_float_to_short_0 - blocks_udp_sink_0 - 0 - 0 - freq_xlating_fir_filter_xxx_0 blks2_rational_resampler_xxx_1 diff --git a/apps/flowgraphs/satnogs_fm_demod.py b/apps/flowgraphs/satnogs_fm_demod.py index 8bd3d19..0b6ef0b 100755 --- a/apps/flowgraphs/satnogs_fm_demod.py +++ b/apps/flowgraphs/satnogs_fm_demod.py @@ -5,11 +5,10 @@ # Title: FM Generic Demodulation # Author: Manolis Surligas (surligas@gmail.com) # Description: A generic FM demodulation block -# Generated: Sun Sep 17 05:13:50 2017 +# Generated: Thu Sep 21 10:50:12 2017 ################################################## from gnuradio import analog -from gnuradio import blocks from gnuradio import eng_notation from gnuradio import filter from gnuradio import gr @@ -55,6 +54,7 @@ class satnogs_fm_demod(gr.top_block): self.taps = taps = firdes.low_pass(12.0, samp_rate_rx, 100e3, 60000, firdes.WIN_HAMMING, 6.76) + self.max_modulation_freq = max_modulation_freq = 3000 self.filter_rate = filter_rate = 250000 self.deviation = deviation = 5000 self.audio_samp_rate = audio_samp_rate = 48000 @@ -82,10 +82,8 @@ class satnogs_fm_demod(gr.top_block): self.osmosdr_source_0.set_bandwidth(samp_rate_rx, 0) self.low_pass_filter_0 = filter.fir_filter_ccf(1, firdes.low_pass( - 1, audio_samp_rate, 8000, 3000, firdes.WIN_HAMMING, 6.76)) + 1, audio_samp_rate, deviation+max_modulation_freq, 3000, firdes.WIN_HAMMING, 6.76)) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(int(samp_rate_rx/filter_rate), (xlate_filter_taps), lo_offset, samp_rate_rx) - self.blocks_udp_sink_0 = blocks.udp_sink(gr.sizeof_short*1, '127.0.0.1', 7355, 1472, False) - self.blocks_float_to_short_0 = blocks.float_to_short(1, 32767) self.blks2_rational_resampler_xxx_1 = filter.rational_resampler_ccc( interpolation=24, decimation=125, @@ -98,12 +96,10 @@ class satnogs_fm_demod(gr.top_block): # Connections ################################################## self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_coarse_doppler_correction_cc_0, 'freq')) - self.connect((self.analog_quadrature_demod_cf_0, 0), (self.blocks_float_to_short_0, 0)) self.connect((self.analog_quadrature_demod_cf_0, 0), (self.satnogs_ogg_encoder_0, 0)) self.connect((self.blks2_rational_resampler_xxx_1, 0), (self.low_pass_filter_0, 0)) self.connect((self.blks2_rational_resampler_xxx_1, 0), (self.satnogs_iq_sink_0, 0)) self.connect((self.blks2_rational_resampler_xxx_1, 0), (self.satnogs_waterfall_sink_0, 0)) - self.connect((self.blocks_float_to_short_0, 0), (self.blocks_udp_sink_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.blks2_rational_resampler_xxx_1, 0)) self.connect((self.low_pass_filter_0, 0), (self.analog_quadrature_demod_cf_0, 0)) self.connect((self.osmosdr_source_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0)) @@ -242,6 +238,13 @@ class satnogs_fm_demod(gr.top_block): def set_taps(self, taps): self.taps = taps + def get_max_modulation_freq(self): + return self.max_modulation_freq + + def set_max_modulation_freq(self, max_modulation_freq): + self.max_modulation_freq = max_modulation_freq + self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.audio_samp_rate, self.deviation+self.max_modulation_freq, 3000, firdes.WIN_HAMMING, 6.76)) + def get_filter_rate(self): return self.filter_rate @@ -253,6 +256,7 @@ class satnogs_fm_demod(gr.top_block): def set_deviation(self, deviation): self.deviation = deviation + self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.audio_samp_rate, self.deviation+self.max_modulation_freq, 3000, firdes.WIN_HAMMING, 6.76)) self.analog_quadrature_demod_cf_0.set_gain((2*math.pi*self.deviation)/self.audio_samp_rate) def get_audio_samp_rate(self): @@ -260,7 +264,7 @@ class satnogs_fm_demod(gr.top_block): def set_audio_samp_rate(self, audio_samp_rate): self.audio_samp_rate = audio_samp_rate - self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.audio_samp_rate, 8000, 3000, firdes.WIN_HAMMING, 6.76)) + self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.audio_samp_rate, self.deviation+self.max_modulation_freq, 3000, firdes.WIN_HAMMING, 6.76)) self.analog_quadrature_demod_cf_0.set_gain((2*math.pi*self.deviation)/self.audio_samp_rate) def get_audio_gain(self):