From 21b4f7e2de9c080017a1b4677f41c56613796fcb Mon Sep 17 00:00:00 2001 From: Mark Jessop Date: Sun, 17 Sep 2017 14:44:22 +0930 Subject: [PATCH] FM demod with 16 kHz channel filter + local UDP (port 7355) output. --- apps/flowgraphs/fm_demod.grc | 204 +++++++++++++++++++++++++++- apps/flowgraphs/satnogs_fm_demod.py | 33 +++-- 2 files changed, 221 insertions(+), 16 deletions(-) diff --git a/apps/flowgraphs/fm_demod.grc b/apps/flowgraphs/fm_demod.grc index 6397991..3f57494 100644 --- a/apps/flowgraphs/fm_demod.grc +++ b/apps/flowgraphs/fm_demod.grc @@ -1,5 +1,5 @@ - + Thu May 5 00:22:45 2016 @@ -369,7 +369,7 @@ TX sampling rate _coordinate - (1085, 410) + (864, 412) _rotation @@ -537,6 +537,108 @@ 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 @@ -941,6 +1043,82 @@ we shift the LO a little further 100e3 + + low_pass_filter + + beta + 6.76 + + + alias + + + + comment + 16 kHz filter width, about right +for a standard 5 kHz Dev FM signal. + + + affinity + + + + cutoff_freq + 8000 + + + decim + 1 + + + _enabled + True + + + type + fir_filter_ccf + + + _coordinate + (1064, 368) + + + _rotation + 180 + + + gain + 1 + + + id + low_pass_filter_0 + + + interp + 1 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samp_rate + audio_samp_rate + + + width + 3000 + + + win + firdes.WIN_HAMMING + + osmosdr_source @@ -2681,7 +2859,7 @@ we shift the LO a little further _coordinate - (877, 394) + (432, 396) _rotation @@ -2857,6 +3035,12 @@ we shift the LO a little further /tmp/waterfall.dat + + analog_quadrature_demod_cf_0 + blocks_float_to_short_0 + 0 + 0 + analog_quadrature_demod_cf_0 satnogs_ogg_encoder_0 @@ -2865,7 +3049,7 @@ we shift the LO a little further blks2_rational_resampler_xxx_1 - analog_quadrature_demod_cf_0 + low_pass_filter_0 0 0 @@ -2881,12 +3065,24 @@ we shift the LO a little further 0 0 + + blocks_float_to_short_0 + blocks_udp_sink_0 + 0 + 0 + freq_xlating_fir_filter_xxx_0 blks2_rational_resampler_xxx_1 0 0 + + low_pass_filter_0 + analog_quadrature_demod_cf_0 + 0 + 0 + osmosdr_source_0 satnogs_coarse_doppler_correction_cc_0 diff --git a/apps/flowgraphs/satnogs_fm_demod.py b/apps/flowgraphs/satnogs_fm_demod.py index cbbe1e7..8bd3d19 100755 --- a/apps/flowgraphs/satnogs_fm_demod.py +++ b/apps/flowgraphs/satnogs_fm_demod.py @@ -5,10 +5,11 @@ # Title: FM Generic Demodulation # Author: Manolis Surligas (surligas@gmail.com) # Description: A generic FM demodulation block -# Generated: Wed Aug 9 13:41:22 2017 +# Generated: Sun Sep 17 05:13:50 2017 ################################################## from gnuradio import analog +from gnuradio import blocks from gnuradio import eng_notation from gnuradio import filter from gnuradio import gr @@ -51,9 +52,9 @@ class satnogs_fm_demod(gr.top_block): ################################################## self.samp_rate_rx = samp_rate_rx = satnogs.hw_rx_settings[rx_sdr_device]['samp_rate'] self.xlate_filter_taps = xlate_filter_taps = firdes.low_pass(1, samp_rate_rx, 125000, 25000, firdes.WIN_HAMMING, 6.76) - + self.taps = taps = firdes.low_pass(12.0, samp_rate_rx, 100e3, 60000, firdes.WIN_HAMMING, 6.76) - + self.filter_rate = filter_rate = 250000 self.deviation = deviation = 5000 self.audio_samp_rate = audio_samp_rate = 48000 @@ -79,8 +80,12 @@ class satnogs_fm_demod(gr.top_block): self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(rx_sdr_device, bb_gain), 0) self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(rx_sdr_device, antenna), 0) 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)) 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, @@ -92,14 +97,17 @@ 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.satnogs_ogg_encoder_0, 0)) - self.connect((self.blks2_rational_resampler_xxx_1, 0), (self.analog_quadrature_demod_cf_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.freq_xlating_fir_filter_xxx_0, 0), (self.blks2_rational_resampler_xxx_1, 0)) - self.connect((self.osmosdr_source_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0)) - self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) + 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)) + self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) def get_antenna(self): return self.antenna @@ -252,6 +260,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.analog_quadrature_demod_cf_0.set_gain((2*math.pi*self.deviation)/self.audio_samp_rate) def get_audio_gain(self):