def set_baudrate(self, baudrate): self.baudrate = baudrate self.set_decimation(satnogs.find_decimation(self.baudrate, 2, self.audio_samp_rate,self.sps)) self.analog_pll_freqdet_cf_0.set_max_freq(2*math.pi*self.max_cfo/(self.baudrate*self.decimation)) self.analog_pll_freqdet_cf_0.set_min_freq(-2*math.pi*self.max_cfo/(self.baudrate*self.decimation)) self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.baudrate*self.decimation, self.baudrate/2 + self.excess_bw *self.baudrate/2 + 200, self.baudrate / 4.0, firdes.WIN_HAMMING, 6.76)) self.low_pass_filter_0_0.set_taps(firdes.low_pass(1, self.audio_samp_rate, ((1.0 + self.excess_bw) * self.baudrate/2.0) + min(self.baudrate, abs(self.max_cfo)), self.baudrate / 10.0, firdes.WIN_HAMMING, 6.76)) self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/(self.baudrate*self.decimation))
def set_baudrate(self, baudrate): self.baudrate = baudrate self.set_decimation( satnogs.find_decimation(self.baudrate, 2, self.audio_samp_rate, self.sps)) self.blocks_throttle_1.set_sample_rate(self.baudrate * self.decimation) self.pfb_arb_resampler_xxx_0.set_rate( self.audio_samp_rate / (self.baudrate * self.decimation))
def set_sps(self, sps): self.sps = sps self.set_decimation( satnogs.find_decimation(self.baudrate, 2, self.audio_samp_rate, self.sps)) self.set_rrc_taps( firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0 / float(self.sps), self.excess_bw, 11 * self.sps * self.nfilts))
def set_audio_samp_rate(self, audio_samp_rate): self.audio_samp_rate = audio_samp_rate self.set_decimation( max( 4, satnogs.find_decimation(self.baudrate, 2, self.audio_samp_rate))) self.pfb_arb_resampler_xxx_1.set_rate( (self.audio_samp_rate) / (self.baudrate * 2))
def set_baudrate(self, baudrate): self.baudrate = baudrate self.set_decimation( satnogs.find_decimation(self.baudrate, 2, self.audio_samp_rate, self.sps)) self.low_pass_filter_0.set_taps( firdes.low_pass( 1, self.baudrate * self.decimation, self.baudrate / 2 + self.excess_bw * self.baudrate / 2 + abs(self.max_cfo), self.baudrate / 10.0, firdes.WIN_HAMMING, 6.76)) self.pfb_arb_resampler_xxx_0.set_rate( self.audio_samp_rate / (self.baudrate * self.decimation))
def set_audio_samp_rate(self, audio_samp_rate): self.audio_samp_rate = audio_samp_rate self.set_decimation( max( 4, satnogs.find_decimation(self.audio_samp_rate, 2, self.audio_samp_rate))) self.analog_quadrature_demod_cf_0.set_gain( (2 * math.pi * self.deviation) / self.audio_samp_rate) self.low_pass_filter_0.set_taps( firdes.low_pass(1, self.audio_samp_rate, self.deviation + self.max_modulation_freq, 1000, firdes.WIN_HAMMING, 6.76))
def set_audio_samp_rate(self, audio_samp_rate): self.audio_samp_rate = audio_samp_rate self.set_decimation( satnogs.find_decimation(self.baudrate, 2, self.audio_samp_rate, self.sps)) self.blocks_rotator_cc_0_0.set_phase_inc( 2.0 * math.pi * (self.if_freq / self.audio_samp_rate)) self.low_pass_filter_0_0.set_taps( firdes.low_pass(1, self.audio_samp_rate, 0.42 * self.audio_samp_rate / 2.0, 0.05 * self.audio_samp_rate, firdes.WIN_HAMMING, 6.76)) self.pfb_arb_resampler_xxx_0.set_rate( self.audio_samp_rate / (self.baudrate * self.decimation))
def set_baudrate(self, baudrate): self.baudrate = baudrate self.set_decimation( max( 4, satnogs.find_decimation(self.baudrate, 2, self.audio_samp_rate))) self.low_pass_filter_0.set_taps( firdes.low_pass(1, self.baudrate * self.decimation, 0.625 * self.baudrate, self.baudrate / 8.0, firdes.WIN_HAMMING, 6.76)) self.low_pass_filter_0_0.set_taps( firdes.low_pass(1, self.baudrate * self.decimation, self.baudrate * 1.25, self.baudrate / 2.0, firdes.WIN_HAMMING, 6.76)) self.pfb_arb_resampler_xxx_1.set_rate( (self.audio_samp_rate) / (self.baudrate * 2))
def __init__(self, antenna="", bb_freq=0.0, bw=0.0, dc_removal="False", decoded_data_file_path="/tmp/.satnogs/data/data", dev_args="", deviation=5e3, doppler_correction_per_sec=20, enable_iq_dump=0, file_path="test.wav", gain=0.0, gain_mode="Overall", iq_file_path="/tmp/iq.dat", lo_offset=100e3, max_modulation_freq=3e3, other_settings="", ppm=0, rigctl_port=4532, rx_freq=100e6, samp_rate_rx=0.0, soapy_rx_device="driver=invalid", stream_args="", tune_args="", udp_IP="127.0.0.1", udp_dump_dest='127.0.0.1', udp_dump_port=7355, udp_port=16887, waterfall_file_path="/tmp/waterfall.dat"): gr.top_block.__init__(self, "satnogs_fm") ################################################## # Parameters ################################################## self.antenna = antenna self.bb_freq = bb_freq self.bw = bw self.dc_removal = dc_removal self.decoded_data_file_path = decoded_data_file_path self.dev_args = dev_args self.deviation = deviation self.doppler_correction_per_sec = doppler_correction_per_sec self.enable_iq_dump = enable_iq_dump self.file_path = file_path self.gain = gain self.gain_mode = gain_mode self.iq_file_path = iq_file_path self.lo_offset = lo_offset self.max_modulation_freq = max_modulation_freq self.other_settings = other_settings self.ppm = ppm self.rigctl_port = rigctl_port self.rx_freq = rx_freq self.samp_rate_rx = samp_rate_rx self.soapy_rx_device = soapy_rx_device self.stream_args = stream_args self.tune_args = tune_args self.udp_IP = udp_IP self.udp_dump_dest = udp_dump_dest self.udp_dump_port = udp_dump_port self.udp_port = udp_port self.waterfall_file_path = waterfall_file_path ################################################## # Variables ################################################## self.audio_samp_rate = audio_samp_rate = 48000 self.decimation = decimation = max( 4, satnogs.find_decimation(audio_samp_rate, 2, audio_samp_rate)) ################################################## # Blocks ################################################## self.soapy_source_0_0 = None # Make sure that the gain mode is valid if (gain_mode not in ['Overall', 'Specific', 'Settings Field']): raise ValueError( "Wrong gain mode on channel 0. Allowed gain modes: " "['Overall', 'Specific', 'Settings Field']") dev = soapy_rx_device # Stream arguments for every activated stream tune_args = [tune_args] settings = [other_settings] # Setup the device arguments dev_args = dev_args self.soapy_source_0_0 = soapy.source(1, dev, dev_args, stream_args, tune_args, settings, samp_rate_rx, "fc32") self.soapy_source_0_0.set_dc_removal( 0, bool(distutils.util.strtobool(dc_removal))) # Set up DC offset. If set to (0, 0) internally the source block # will handle the case if no DC offset correction is supported self.soapy_source_0_0.set_dc_offset(0, 0) # Setup IQ Balance. If set to (0, 0) internally the source block # will handle the case if no IQ balance correction is supported self.soapy_source_0_0.set_iq_balance(0, 0) self.soapy_source_0_0.set_agc(0, False) # generic frequency setting should be specified first self.soapy_source_0_0.set_frequency(0, rx_freq - lo_offset) self.soapy_source_0_0.set_frequency(0, "BB", bb_freq) # Setup Frequency correction. If set to 0 internally the source block # will handle the case if no frequency correction is supported self.soapy_source_0_0.set_frequency_correction(0, ppm) self.soapy_source_0_0.set_antenna(0, antenna) self.soapy_source_0_0.set_bandwidth(0, bw) if (gain_mode != 'Settings Field'): # pass is needed, in case the template does not evaluare anything pass self.soapy_source_0_0.set_gain(0, gain) self.satnogs_waterfall_sink_0 = satnogs.waterfall_sink( audio_samp_rate, rx_freq, 10, 1024, waterfall_file_path, 1) self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source( "127.0.0.1", rigctl_port, False, int(1000.0 / doppler_correction_per_sec) + 1, 1500) self.satnogs_ogg_encoder_0 = satnogs.ogg_encoder( file_path, audio_samp_rate, 1.0) self.satnogs_iq_sink_0 = satnogs.iq_sink(16768, iq_file_path, False, enable_iq_dump) self.satnogs_doppler_compensation_0 = satnogs.doppler_compensation( samp_rate_rx, rx_freq, lo_offset, audio_samp_rate, 1, 0) self.low_pass_filter_0 = filter.fir_filter_ccf( 1, firdes.low_pass(1, audio_samp_rate, deviation + max_modulation_freq, 1000, firdes.WIN_HAMMING, 6.76)) self.dc_blocker_xx_0_0 = filter.dc_blocker_ff(1024, True) self.blocks_udp_sink_0_0 = blocks.udp_sink(gr.sizeof_gr_complex * 1, udp_dump_dest, udp_dump_port + 1, 1472, True) self.blocks_udp_sink_0 = blocks.udp_sink(gr.sizeof_short * 1, udp_dump_dest, udp_dump_port, 1472, True) self.blocks_float_to_short_0 = blocks.float_to_short(1, 16383.0) self.analog_quadrature_demod_cf_0 = analog.quadrature_demod_cf( (2 * math.pi * deviation) / audio_samp_rate) ################################################## # Connections ################################################## self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_doppler_compensation_0, 'doppler')) self.connect((self.analog_quadrature_demod_cf_0, 0), (self.dc_blocker_xx_0_0, 0)) self.connect((self.blocks_float_to_short_0, 0), (self.blocks_udp_sink_0, 0)) self.connect((self.dc_blocker_xx_0_0, 0), (self.blocks_float_to_short_0, 0)) self.connect((self.dc_blocker_xx_0_0, 0), (self.satnogs_ogg_encoder_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.analog_quadrature_demod_cf_0, 0)) self.connect((self.satnogs_doppler_compensation_0, 0), (self.blocks_udp_sink_0_0, 0)) self.connect((self.satnogs_doppler_compensation_0, 0), (self.low_pass_filter_0, 0)) self.connect((self.satnogs_doppler_compensation_0, 0), (self.satnogs_iq_sink_0, 0)) self.connect((self.satnogs_doppler_compensation_0, 0), (self.satnogs_waterfall_sink_0, 0)) self.connect((self.soapy_source_0_0, 0), (self.satnogs_doppler_compensation_0, 0))
def __init__(self, antenna="", baudrate=9600.0, bb_freq=0.0, bw=0.0, dc_removal="False", decoded_data_file_path="/tmp/.satnogs/data/data", dev_args="", doppler_correction_per_sec=20, enable_iq_dump=0, excess_bw=0.5, file_path="test.wav", framing="ax25", gain=0.0, gain_mode="Overall", iq_file_path="/tmp/iq.dat", lo_offset=100e3, max_cfo=2000.0, other_settings="", ppm=0, rigctl_port=4532, rx_freq=100e6, samp_rate_rx=0.0, soapy_rx_device="driver=invalid", stream_args="", tune_args="", udp_IP="127.0.0.1", udp_port=16887, waterfall_file_path="/tmp/waterfall.dat"): gr.top_block.__init__(self, "satnogs_bpsk UDP") ################################################## # Parameters ################################################## self.antenna = antenna self.baudrate = baudrate self.bb_freq = bb_freq self.bw = bw self.dc_removal = dc_removal self.decoded_data_file_path = decoded_data_file_path self.dev_args = dev_args self.doppler_correction_per_sec = doppler_correction_per_sec self.enable_iq_dump = enable_iq_dump self.excess_bw = excess_bw self.file_path = file_path self.framing = framing self.gain = gain self.gain_mode = gain_mode self.iq_file_path = iq_file_path self.lo_offset = lo_offset self.max_cfo = max_cfo self.other_settings = other_settings self.ppm = ppm self.rigctl_port = rigctl_port self.rx_freq = rx_freq self.samp_rate_rx = samp_rate_rx self.soapy_rx_device = soapy_rx_device self.stream_args = stream_args self.tune_args = tune_args self.udp_IP = udp_IP self.udp_port = udp_port self.waterfall_file_path = waterfall_file_path ################################################## # Variables ################################################## self.variable_ax25_decoder_0 = variable_ax25_decoder_0 = satnogs.ax25_decoder_make( 'GND', 0, True, True, True, 1024) self.sps = sps = 4 self.nfilts = nfilts = 32 self.audio_samp_rate = audio_samp_rate = 48000 self.rrc_taps = rrc_taps = firdes.root_raised_cosine( nfilts, nfilts, 1.0 / float(sps), excess_bw, 11 * sps * nfilts) self.if_freq = if_freq = 12000 self.decimation = decimation = satnogs.find_decimation( baudrate, 2, audio_samp_rate, sps) self.bpsk_constellation = bpsk_constellation = digital.constellation_bpsk( ).base() self.available_framings = available_framings = { 'ax25': variable_ax25_decoder_0 } ################################################## # Blocks ################################################## self.soapy_source_0 = None # Make sure that the gain mode is valid if (gain_mode not in ['Overall', 'Specific', 'Settings Field']): raise ValueError( "Wrong gain mode on channel 0. Allowed gain modes: " "['Overall', 'Specific', 'Settings Field']") dev = soapy_rx_device # Stream arguments for every activated stream tune_args = [tune_args] settings = [other_settings] # Setup the device arguments dev_args = dev_args self.soapy_source_0 = soapy.source(1, dev, dev_args, stream_args, tune_args, settings, samp_rate_rx, "fc32") self.soapy_source_0.set_dc_removal( 0, bool(distutils.util.strtobool(dc_removal))) # Set up DC offset. If set to (0, 0) internally the source block # will handle the case if no DC offset correction is supported self.soapy_source_0.set_dc_offset(0, 0) # Setup IQ Balance. If set to (0, 0) internally the source block # will handle the case if no IQ balance correction is supported self.soapy_source_0.set_iq_balance(0, 0) self.soapy_source_0.set_agc(0, False) # generic frequency setting should be specified first self.soapy_source_0.set_frequency(0, rx_freq - lo_offset) self.soapy_source_0.set_frequency(0, "BB", bb_freq) # Setup Frequency correction. If set to 0 internally the source block # will handle the case if no frequency correction is supported self.soapy_source_0.set_frequency_correction(0, ppm) self.soapy_source_0.set_antenna(0, antenna) self.soapy_source_0.set_bandwidth(0, bw) if (gain_mode != 'Settings Field'): # pass is needed, in case the template does not evaluare anything pass self.soapy_source_0.set_gain(0, gain) self.satnogs_waterfall_sink_0_0 = satnogs.waterfall_sink( baudrate * decimation, rx_freq, 10, 1024, waterfall_file_path, 1) self.satnogs_udp_msg_sink_0_0 = satnogs.udp_msg_sink( udp_IP, udp_port, 1500) self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source( "127.0.0.1", rigctl_port, False, int(1000.0 / doppler_correction_per_sec) + 1, 1500) self.satnogs_ogg_encoder_0 = satnogs.ogg_encoder( file_path, audio_samp_rate, 1.0) self.satnogs_json_converter_0 = satnogs.json_converter() self.satnogs_iq_sink_0_0 = satnogs.iq_sink(16768, iq_file_path, False, enable_iq_dump) self.satnogs_frame_file_sink_0_1_0 = satnogs.frame_file_sink( decoded_data_file_path, 0) self.satnogs_frame_decoder_0_0 = satnogs.frame_decoder( available_framings[framing], 1 * 1) self.satnogs_doppler_compensation_0 = satnogs.doppler_compensation( samp_rate_rx, rx_freq, lo_offset, baudrate * decimation, 1, 0) self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf( audio_samp_rate / (baudrate * decimation), taps=None, flt_size=32) self.pfb_arb_resampler_xxx_0.declare_sample_delay(0) self.low_pass_filter_0_0 = filter.fir_filter_ccf( 1, firdes.low_pass(1, audio_samp_rate, 0.42 * audio_samp_rate / 2.0, 0.05 * audio_samp_rate, firdes.WIN_HAMMING, 6.76)) self.low_pass_filter_0 = filter.fir_filter_ccf( decimation // sps, firdes.low_pass( 1, baudrate * decimation, baudrate / 2 + excess_bw * baudrate / 2 + abs(max_cfo), baudrate / 10.0, firdes.WIN_HAMMING, 6.76)) self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf( sps, 2.0 * math.pi / 100.0, rrc_taps, nfilts, nfilts / 2, 1.5, 1) self.digital_constellation_receiver_cb_0 = digital.constellation_receiver_cb( bpsk_constellation, 2.0 * math.pi / 100.0, -0.25, 0.25) self.blocks_udp_sink_0 = blocks.udp_sink(gr.sizeof_short * 1, udp_IP, 7355, 1472, True) self.blocks_rotator_cc_0_0 = blocks.rotator_cc( 2.0 * math.pi * (if_freq / audio_samp_rate)) self.blocks_float_to_short_0 = blocks.float_to_short(1, 32767) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.analog_agc2_xx_0_0 = analog.agc2_cc(0.01, 0.001, 0.015, 1.0) self.analog_agc2_xx_0_0.set_max_gain(65536) self.analog_agc2_xx_0 = analog.agc2_cc(1e-3, 1e-3, 0.5, 1.0) self.analog_agc2_xx_0.set_max_gain(65536) ################################################## # Connections ################################################## self.msg_connect((self.satnogs_frame_decoder_0_0, 'out'), (self.satnogs_json_converter_0, 'in')) self.msg_connect((self.satnogs_json_converter_0, 'out'), (self.satnogs_frame_file_sink_0_1_0, 'frame')) self.msg_connect((self.satnogs_json_converter_0, 'out'), (self.satnogs_udp_msg_sink_0_0, 'in')) self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_doppler_compensation_0, 'doppler')) self.connect((self.analog_agc2_xx_0, 0), (self.low_pass_filter_0, 0)) self.connect((self.analog_agc2_xx_0, 0), (self.pfb_arb_resampler_xxx_0, 0)) self.connect((self.analog_agc2_xx_0_0, 0), (self.low_pass_filter_0_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.blocks_float_to_short_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.satnogs_ogg_encoder_0, 0)) self.connect((self.blocks_float_to_short_0, 0), (self.blocks_udp_sink_0, 0)) self.connect((self.blocks_rotator_cc_0_0, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.digital_constellation_receiver_cb_0, 0), (self.satnogs_frame_decoder_0_0, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.digital_constellation_receiver_cb_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0)) self.connect((self.low_pass_filter_0_0, 0), (self.blocks_rotator_cc_0_0, 0)) self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.analog_agc2_xx_0_0, 0)) self.connect((self.satnogs_doppler_compensation_0, 0), (self.analog_agc2_xx_0, 0)) self.connect((self.satnogs_doppler_compensation_0, 0), (self.satnogs_iq_sink_0_0, 0)) self.connect((self.satnogs_doppler_compensation_0, 0), (self.satnogs_waterfall_sink_0_0, 0)) self.connect((self.soapy_source_0, 0), (self.satnogs_doppler_compensation_0, 0))
def __init__(self, antenna="", baudrate=9600.0, bb_freq=0.0, bw=0.0, dc_removal="False", decoded_data_file_path="/tmp/.satnogs/data/data", dev_args="", doppler_correction_per_sec=20, enable_iq_dump=0, file_path="test.wav", framing="ax25", gain=0.0, gain_mode="Overall", iq_file_path="/tmp/iq.dat", lo_offset=100e3, other_settings="", ppm=0, rigctl_port=4532, rx_freq=100e6, samp_rate_rx=0.0, soapy_rx_device="driver=invalid", stream_args="", tune_args="", udp_IP="127.0.0.1", udp_dump_dest='127.0.0.1', udp_dump_port=7355, udp_port=16887, waterfall_file_path="/tmp/waterfall.dat"): gr.top_block.__init__(self, "satnogs_fsk") ################################################## # Parameters ################################################## self.antenna = antenna self.baudrate = baudrate self.bb_freq = bb_freq self.bw = bw self.dc_removal = dc_removal self.decoded_data_file_path = decoded_data_file_path self.dev_args = dev_args self.doppler_correction_per_sec = doppler_correction_per_sec self.enable_iq_dump = enable_iq_dump self.file_path = file_path self.framing = framing self.gain = gain self.gain_mode = gain_mode self.iq_file_path = iq_file_path self.lo_offset = lo_offset self.other_settings = other_settings self.ppm = ppm self.rigctl_port = rigctl_port self.rx_freq = rx_freq self.samp_rate_rx = samp_rate_rx self.soapy_rx_device = soapy_rx_device self.stream_args = stream_args self.tune_args = tune_args self.udp_IP = udp_IP self.udp_dump_dest = udp_dump_dest self.udp_dump_port = udp_dump_port self.udp_port = udp_port self.waterfall_file_path = waterfall_file_path ################################################## # Variables ################################################## self.variable_ax25_decoder_0 = variable_ax25_decoder_0 = satnogs.ax25_decoder_make( 'GND', 0, True, True, True, 1024) self.variable_ax100_mode6_decoder_0 = variable_ax100_mode6_decoder_0 = satnogs.ax100_decoder_mode6_make( satnogs.crc.CRC32_C, satnogs.whitening_make_ccsds(True), True) self.variable_ax100_mode5_decoder_0 = variable_ax100_mode5_decoder_0 = satnogs.ax100_decoder_mode5_make( [], 0, [0x93, 0x0B, 0x51, 0xDE], 3, satnogs.crc.CRC32_C, satnogs.whitening.make_ccsds(True), True) self.audio_samp_rate = audio_samp_rate = 48000 self.decimation = decimation = max( 4, satnogs.find_decimation(baudrate, 2, audio_samp_rate)) self.available_framings = available_framings = { 'ax25': variable_ax25_decoder_0, 'ax100_mode5': variable_ax100_mode5_decoder_0, 'ax100_mode6': variable_ax100_mode6_decoder_0 } ################################################## # Blocks ################################################## self.soapy_source_0_0 = None # Make sure that the gain mode is valid if (gain_mode not in ['Overall', 'Specific', 'Settings Field']): raise ValueError( "Wrong gain mode on channel 0. Allowed gain modes: " "['Overall', 'Specific', 'Settings Field']") dev = soapy_rx_device # Stream arguments for every activated stream tune_args = [tune_args] settings = [other_settings] # Setup the device arguments dev_args = dev_args self.soapy_source_0_0 = soapy.source(1, dev, dev_args, stream_args, tune_args, settings, samp_rate_rx, "fc32") self.soapy_source_0_0.set_dc_removal( 0, bool(distutils.util.strtobool(dc_removal))) # Set up DC offset. If set to (0, 0) internally the source block # will handle the case if no DC offset correction is supported self.soapy_source_0_0.set_dc_offset(0, 0) # Setup IQ Balance. If set to (0, 0) internally the source block # will handle the case if no IQ balance correction is supported self.soapy_source_0_0.set_iq_balance(0, 0) self.soapy_source_0_0.set_agc(0, False) # generic frequency setting should be specified first self.soapy_source_0_0.set_frequency(0, rx_freq - lo_offset) self.soapy_source_0_0.set_frequency(0, "BB", bb_freq) # Setup Frequency correction. If set to 0 internally the source block # will handle the case if no frequency correction is supported self.soapy_source_0_0.set_frequency_correction(0, ppm) self.soapy_source_0_0.set_antenna(0, antenna) self.soapy_source_0_0.set_bandwidth(0, bw) if (gain_mode != 'Settings Field'): # pass is needed, in case the template does not evaluare anything pass self.soapy_source_0_0.set_gain(0, gain) self.satnogs_waterfall_sink_0 = satnogs.waterfall_sink( baudrate * decimation, rx_freq, 10, 1024, waterfall_file_path, 1) self.satnogs_udp_msg_sink_0_0 = satnogs.udp_msg_sink( udp_IP, udp_port, 1500) self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source( "127.0.0.1", rigctl_port, False, int(1000.0 / doppler_correction_per_sec) + 1, 1500) self.satnogs_ogg_encoder_0 = satnogs.ogg_encoder( file_path, audio_samp_rate, 1.0) self.satnogs_json_converter_0 = satnogs.json_converter() self.satnogs_iq_sink_0 = satnogs.iq_sink(16768, iq_file_path, False, enable_iq_dump) self.satnogs_frame_file_sink_0_1_0 = satnogs.frame_file_sink( decoded_data_file_path, 0) self.satnogs_frame_decoder_0_0 = satnogs.frame_decoder( available_framings[framing], 1 * 1) self.satnogs_doppler_compensation_0 = satnogs.doppler_compensation( samp_rate_rx, rx_freq, lo_offset, baudrate * decimation, 1, 0) self.pfb_arb_resampler_xxx_1 = pfb.arb_resampler_fff( (audio_samp_rate) / (baudrate * 2), taps=None, flt_size=32) self.pfb_arb_resampler_xxx_1.declare_sample_delay(0) self.low_pass_filter_0_0 = filter.fir_filter_ccf( 1, firdes.low_pass(1, baudrate * decimation, baudrate * 1.25, baudrate / 2.0, firdes.WIN_HAMMING, 6.76)) self.low_pass_filter_0 = filter.fir_filter_ccf( decimation // 2, firdes.low_pass(1, baudrate * decimation, 0.625 * baudrate, baudrate / 8.0, firdes.WIN_HAMMING, 6.76)) self.digital_clock_recovery_mm_xx_0 = digital.clock_recovery_mm_ff( 2, 2 * math.pi / 100, 0.5, 0.5 / 8.0, 0.01) self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb() self.dc_blocker_xx_0_0 = filter.dc_blocker_ff(1024, True) self.dc_blocker_xx_0 = filter.dc_blocker_ff(1024, True) self.blocks_vco_c_0 = blocks.vco_c(baudrate * decimation, -baudrate * decimation, 1.0) self.blocks_udp_sink_0_0 = blocks.udp_sink(gr.sizeof_gr_complex * 1, udp_dump_dest, udp_dump_port + 1, 1472, True) self.blocks_udp_sink_0 = blocks.udp_sink(gr.sizeof_short * 1, udp_dump_dest, udp_dump_port, 1472, True) self.blocks_multiply_xx_0 = blocks.multiply_vcc(1) self.blocks_moving_average_xx_0 = blocks.moving_average_ff( 1024, 1.0 / 1024.0, 4096, 1) self.blocks_float_to_short_0 = blocks.float_to_short(1, 16383.0) self.blocks_delay_0 = blocks.delay(gr.sizeof_gr_complex * 1, 1024 // 2) self.analog_quadrature_demod_cf_0_0_0_0 = analog.quadrature_demod_cf( 1.0) self.analog_quadrature_demod_cf_0_0_0 = analog.quadrature_demod_cf(0.9) self.analog_quadrature_demod_cf_0_0 = analog.quadrature_demod_cf(1.2) ################################################## # Connections ################################################## self.msg_connect((self.satnogs_frame_decoder_0_0, 'out'), (self.satnogs_json_converter_0, 'in')) self.msg_connect((self.satnogs_json_converter_0, 'out'), (self.satnogs_frame_file_sink_0_1_0, 'frame')) self.msg_connect((self.satnogs_json_converter_0, 'out'), (self.satnogs_udp_msg_sink_0_0, 'in')) self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_doppler_compensation_0, 'doppler')) self.connect((self.analog_quadrature_demod_cf_0_0, 0), (self.dc_blocker_xx_0, 0)) self.connect((self.analog_quadrature_demod_cf_0_0_0, 0), (self.pfb_arb_resampler_xxx_1, 0)) self.connect((self.analog_quadrature_demod_cf_0_0_0_0, 0), (self.blocks_moving_average_xx_0, 0)) self.connect((self.blocks_delay_0, 0), (self.blocks_multiply_xx_0, 0)) self.connect((self.blocks_float_to_short_0, 0), (self.blocks_udp_sink_0, 0)) self.connect((self.blocks_moving_average_xx_0, 0), (self.blocks_vco_c_0, 0)) self.connect((self.blocks_multiply_xx_0, 0), (self.low_pass_filter_0, 0)) self.connect((self.blocks_vco_c_0, 0), (self.blocks_multiply_xx_0, 1)) self.connect((self.dc_blocker_xx_0, 0), (self.digital_clock_recovery_mm_xx_0, 0)) self.connect((self.dc_blocker_xx_0_0, 0), (self.blocks_float_to_short_0, 0)) self.connect((self.dc_blocker_xx_0_0, 0), (self.satnogs_ogg_encoder_0, 0)) self.connect((self.digital_binary_slicer_fb_0, 0), (self.satnogs_frame_decoder_0_0, 0)) self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.digital_binary_slicer_fb_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.analog_quadrature_demod_cf_0_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.analog_quadrature_demod_cf_0_0_0, 0)) self.connect((self.low_pass_filter_0_0, 0), (self.analog_quadrature_demod_cf_0_0_0_0, 0)) self.connect((self.pfb_arb_resampler_xxx_1, 0), (self.dc_blocker_xx_0_0, 0)) self.connect((self.satnogs_doppler_compensation_0, 0), (self.blocks_delay_0, 0)) self.connect((self.satnogs_doppler_compensation_0, 0), (self.blocks_udp_sink_0_0, 0)) self.connect((self.satnogs_doppler_compensation_0, 0), (self.low_pass_filter_0_0, 0)) self.connect((self.satnogs_doppler_compensation_0, 0), (self.satnogs_iq_sink_0, 0)) self.connect((self.satnogs_doppler_compensation_0, 0), (self.satnogs_waterfall_sink_0, 0)) self.connect((self.soapy_source_0_0, 0), (self.satnogs_doppler_compensation_0, 0))
def __init__(self, baudrate=1200.0, raw_file='', udp_dest_audio='127.0.0.1', udp_dest_iq='127.0.0.1', udp_port_audio=7355, udp_port_iq=7356): gr.top_block.__init__(self, "satnogs raw to udp") ################################################## # Parameters ################################################## self.baudrate = baudrate self.raw_file = raw_file self.udp_dest_audio = udp_dest_audio self.udp_dest_iq = udp_dest_iq self.udp_port_audio = udp_port_audio self.udp_port_iq = udp_port_iq ################################################## # Variables ################################################## self.sps = sps = 4 self.audio_samp_rate = audio_samp_rate = 48000 self.if_freq = if_freq = 12000 self.decimation = decimation = satnogs.find_decimation( baudrate, 2, audio_samp_rate, sps) ################################################## # Blocks ################################################## self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf( audio_samp_rate / (baudrate * decimation), taps=None, flt_size=32) self.pfb_arb_resampler_xxx_0.declare_sample_delay(0) self.low_pass_filter_0_0 = filter.fir_filter_ccf( 1, firdes.low_pass(1, audio_samp_rate, 0.42 * audio_samp_rate / 2.0, 0.05 * audio_samp_rate, firdes.WIN_HAMMING, 6.76)) self.blocks_udp_sink_0_0 = blocks.udp_sink(gr.sizeof_short * 1, udp_dest_iq, udp_port_iq, 1472, True) self.blocks_udp_sink_0 = blocks.udp_sink(gr.sizeof_short * 1, udp_dest_audio, udp_port_audio, 1472, True) self.blocks_throttle_1 = blocks.throttle(gr.sizeof_gr_complex * 1, baudrate * decimation, True) self.blocks_rotator_cc_0_0 = blocks.rotator_cc( 2.0 * math.pi * (if_freq / audio_samp_rate)) self.blocks_multiply_const_vxx_1 = blocks.multiply_const_cc(16383) self.blocks_multiply_const_vxx_0 = blocks.multiply_const_cc(1 / 16768) self.blocks_interleaved_short_to_complex_0 = blocks.interleaved_short_to_complex( False, False) self.blocks_float_to_short_0 = blocks.float_to_short(1, 16383.0) self.blocks_file_source_0 = blocks.file_source(gr.sizeof_short * 1, raw_file, False, 0, 0) self.blocks_file_source_0.set_begin_tag(pmt.PMT_NIL) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.blocks_complex_to_interleaved_short_0 = blocks.complex_to_interleaved_short( False) self.analog_agc2_xx_0_1 = analog.agc2_cc(1e-3, 1e-3, 0.5, 1.0) self.analog_agc2_xx_0_1.set_max_gain(65536) self.analog_agc2_xx_0_0 = analog.agc2_cc(0.01, 0.001, 0.015, 1.0) self.analog_agc2_xx_0_0.set_max_gain(65536) self.analog_agc2_xx_0 = analog.agc2_cc(1e-2, 1e-3, 1.5e-2, 1.0) self.analog_agc2_xx_0.set_max_gain(65536) ################################################## # Connections ################################################## self.connect((self.analog_agc2_xx_0, 0), (self.blocks_multiply_const_vxx_1, 0)) self.connect((self.analog_agc2_xx_0_0, 0), (self.low_pass_filter_0_0, 0)) self.connect((self.analog_agc2_xx_0_1, 0), (self.pfb_arb_resampler_xxx_0, 0)) self.connect((self.blocks_complex_to_interleaved_short_0, 0), (self.blocks_udp_sink_0_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.blocks_float_to_short_0, 0)) self.connect((self.blocks_file_source_0, 0), (self.blocks_interleaved_short_to_complex_0, 0)) self.connect((self.blocks_float_to_short_0, 0), (self.blocks_udp_sink_0, 0)) self.connect((self.blocks_interleaved_short_to_complex_0, 0), (self.blocks_multiply_const_vxx_0, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.blocks_throttle_1, 0)) self.connect((self.blocks_multiply_const_vxx_1, 0), (self.blocks_complex_to_interleaved_short_0, 0)) self.connect((self.blocks_rotator_cc_0_0, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.blocks_throttle_1, 0), (self.analog_agc2_xx_0, 0)) self.connect((self.blocks_throttle_1, 0), (self.analog_agc2_xx_0_1, 0)) self.connect((self.low_pass_filter_0_0, 0), (self.blocks_rotator_cc_0_0, 0)) self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.analog_agc2_xx_0_0, 0))
def set_sps(self, sps): self.sps = sps self.set_decimation( satnogs.find_decimation(self.baudrate, 2, self.audio_samp_rate, self.sps))
# SA2KNG import satnogs import sys sps=4 audio_samp_rate=48000 baudrate=9600 script='satnogs_fm.py' if len(sys.argv) == 2 or len(sys.argv) == 3: try: baudrate = int(float(sys.argv[1])) # example: 1200 or 1200.0 except ValueError: baudrate = 9600 if len(sys.argv) == 3: script = sys.argv[2] if baudrate < 1 or baudrate > 1e6: # unknown (?) baudrate = 9600 if '_bpsk' in script: print(satnogs.find_decimation(baudrate, 2, audio_samp_rate,sps)*baudrate) elif '_fsk' in script: print(max(4,satnogs.find_decimation(baudrate, 2, audio_samp_rate))*baudrate) elif '_sstv' in script: print(4*4160*4) else: # cw, fm, afsk, etc... print(audio_samp_rate)