From 9d41d8986ced6371c19324a00c392b885ec98c96 Mon Sep 17 00:00:00 2001 From: DL4PD Date: Tue, 27 Mar 2018 17:07:03 +0200 Subject: [PATCH 01/10] Add a BPSK decoder Script Add a BPSK decoder script for frames transmitted in AX.25, using G3RUH scrambling and without. Baudrate is set via parameter "baudrate", all filters, taps, offsets, etc are calculated using this parameter. Decoder tested with 1k2 bps and 9k6 bps. --- apps/CMakeLists.txt | 1 + apps/flowgraphs/bpsk_decoder.grc | 3055 +++++++++++++++++++++++ apps/flowgraphs/satnogs_bpsk_decoder.py | 452 ++++ 3 files changed, 3508 insertions(+) create mode 100644 apps/flowgraphs/bpsk_decoder.grc create mode 100755 apps/flowgraphs/satnogs_bpsk_decoder.py diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index 047f8ba..3351063 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -28,6 +28,7 @@ GR_PYTHON_INSTALL( flowgraphs/satnogs_generic_iq_receiver.py flowgraphs/satnogs_bpsk_demod.py flowgraphs/satnogs_cw_decoder.py + flowgraphs/satnogs_bpsk_decoder.py flowgraphs/satnogs_apt_demod.py flowgraphs/satnogs_fsk9600_ax25.py flowgraphs/satnogs_fsk9600_g3ruh_ax25.py diff --git a/apps/flowgraphs/bpsk_decoder.grc b/apps/flowgraphs/bpsk_decoder.grc new file mode 100644 index 0000000..047dd3e --- /dev/null +++ b/apps/flowgraphs/bpsk_decoder.grc @@ -0,0 +1,3055 @@ + + + + Thu May 5 00:22:45 2016 + + options + + author + Patrick Dohmen, DL4PD + + + window_size + 3000, 3000 + + + category + Custom + + + comment + + + + description + A BPSK decoder block for gr-satnogs + + + _enabled + True + + + _coordinate + (8, 8) + + + _rotation + 0 + + + generate_options + no_gui + + + hier_block_src_path + .: + + + id + satnogs_bpsk_decoder + + + max_nouts + 0 + + + qt_qss_theme + + + + realtime_scheduling + + + + run_command + {python} -u {filename} + + + run_options + run + + + run + True + + + thread_safe_setters + + + + title + BPSK Decoder + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (896, 180) + + + _rotation + 0 + + + id + alpha + + + value + 0.1 + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (1704, 52) + + + _rotation + 0 + + + id + audio_samp_rate + + + value + 48000 + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (1152, 20) + + + _rotation + 0 + + + id + deviation + + + value + 5000 + + + + variable + + comment + Filtershape: + +Use the following values for different filter shapes + +Sharp: 0.1 +Normal: 0.2 +Soft: 0.5 + + + _enabled + True + + + _coordinate + (1032, 180) + + + _rotation + 0 + + + id + filt_mode + + + value + 0.1 + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (1704, 260) + + + _rotation + 0 + + + id + filter_rate + + + value + 250000 + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (200, 772) + + + _rotation + 0 + + + id + nfilts + + + value + 16 + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (48, 772) + + + _rotation + 0 + + + id + rrc_taps + + + value + firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(samp_per_sym), 0.35, 11*samp_per_sym*nfilts) + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (264, 772) + + + _rotation + 0 + + + id + samp_per_sym + + + value + 5 + + + + variable + + comment + SDR device +TX sampling rate + + + _enabled + True + + + _coordinate + (1704, 460) + + + _rotation + 0 + + + id + samp_rate_rx + + + value + satnogs.hw_rx_settings[rx_sdr_device]['samp_rate'] + + + + variable_low_pass_filter_taps + + beta + 6.76 + + + comment + + + + cutoff_freq + 100e3 + + + _enabled + 1 + + + _coordinate + (200, 12) + + + _rotation + 0 + + + gain + 12.0 + + + id + taps + + + samp_rate + samp_rate_rx + + + width + 60000 + + + win + firdes.WIN_HAMMING + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (1704, 164) + + + _rotation + 0 + + + id + xlate_filter_taps + + + value + firdes.low_pass(1, samp_rate_rx, 125000, 25000, firdes.WIN_HAMMING, 6.76) + + + + analog_agc2_xx + + attack_rate + 0.01 + + + alias + + + + comment + + + + affinity + + + + decay_rate + 0.001 + + + _enabled + True + + + _coordinate + (280, 652) + + + _rotation + 0 + + + gain + 1.0 + + + id + analog_agc2_xx_0 + + + max_gain + 65536 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + reference + 0.5 + + + type + complex + + + + analog_agc2_xx + + attack_rate + 0.01 + + + alias + + + + comment + + + + affinity + + + + decay_rate + 0.001 + + + _enabled + 1 + + + _coordinate + (1360, 452) + + + _rotation + 180 + + + gain + 0.0 + + + id + analog_agc2_xx_0_0 + + + max_gain + 65536 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + reference + 0.015 + + + type + complex + + + + analog_sig_source_x + + amp + 1 + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + freq + cw_offset/1200.0*baudrate + + + _coordinate + (1360, 568) + + + _rotation + 180 + + + id + analog_sig_source_x_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + offset + 0 + + + type + complex + + + samp_rate + audio_samp_rate + + + waveform + analog.GR_COS_WAVE + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (704, 100) + + + _rotation + 0 + + + id + antenna + + + label + + + + short_id + + + + type + string + + + value + satnogs.not_set_antenna + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (304, 500) + + + _rotation + 0 + + + id + baudrate + + + label + baudrate + + + short_id + + + + type + intx + + + value + 1200 + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (616, 100) + + + _rotation + 0 + + + id + bb_gain + + + label + + + + short_id + + + + type + eng_float + + + value + satnogs.not_set_rx_bb_gain + + + + rational_resampler_xxx + + alias + + + + comment + We get: + - 250 kHz input sampling rate (samp_rate_rx/filter_rate) from first stage + - 48 kHz output sampling rate + + + affinity + + + + decim + int(samp_rate_rx/(samp_rate_rx/filter_rate)) + + + _enabled + True + + + fbw + 0 + + + _coordinate + (864, 268) + + + _rotation + 0 + + + id + blks2_rational_resampler_xxx_1 + + + interp + audio_samp_rate + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + taps + [] + + + type + ccc + + + + rational_resampler_xxx + + alias + + + + comment + We get: + - 48 kHz input sampling rate + - 12 kHz output sampling rate + + + affinity + + + + decim + 48000 + + + _enabled + True + + + fbw + 0 + + + _coordinate + (1344, 60) + + + _rotation + 0 + + + id + blks2_rational_resampler_xxx_1_0 + + + interp + max(12000, int(3*(1+alpha)*baudrate)) + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + taps + [] + + + type + ccc + + + + blocks_complex_to_real + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (1040, 504) + + + _rotation + 180 + + + id + blocks_complex_to_real_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + vlen + 1 + + + + blocks_complex_to_real + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (1000, 656) + + + _rotation + 0 + + + id + blocks_complex_to_real_0_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + vlen + 1 + + + + blocks_multiply_xx + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (1216, 488) + + + _rotation + 180 + + + id + blocks_multiply_xx_0 + + + type + complex + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + num_inputs + 2 + + + vlen + 1 + + + + blocks_multiply_xx + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (864, 568) + + + _rotation + 180 + + + id + blocks_multiply_xx_0_0 + + + type + complex + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + num_inputs + 2 + + + vlen + 1 + + + + parameter + + alias + + + + comment + The CW offset shifts the carrier from 0 Hz to a +frequency that corresponds to the CW audio +tone. This tone is typically 500-800 Hz. + + + _enabled + True + + + _coordinate + (1360, 684) + + + _rotation + 0 + + + id + cw_offset + + + label + + + + short_id + + + + type + eng_float + + + value + 1500 + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (1000, 100) + + + _rotation + 0 + + + id + decoded_data_file_path + + + label + + + + short_id + + + + type + string + + + value + /tmp/.satnogs/data/data + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (368, 100) + + + _rotation + 0 + + + id + dev_args + + + label + + + + short_id + + + + type + string + + + value + satnogs.not_set_dev_args + + + + digital_binary_slicer_fb + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (1176, 656) + + + _rotation + 0 + + + id + digital_binary_slicer_fb_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + + digital_costas_loop_cc + + alias + + + + comment + + + + affinity + + + + _enabled + 1 + + + _coordinate + (816, 656) + + + _rotation + 0 + + + id + digital_costas_loop_cc_0_0_0_0 + + + w + 0.063 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + order + 2 + + + use_snr + False + + + + digital_pfb_clock_sync_xxx + + alias + + + + comment + + + + affinity + + + + _enabled + 1 + + + filter_size + nfilts + + + _coordinate + (456, 652) + + + _rotation + 0 + + + id + digital_pfb_clock_sync_xxx_0 + + + init_phase + nfilts/2 + + + loop_bw + 0.063 + + + maxoutbuf + 0 + + + max_dev + 1.5 + + + minoutbuf + 0 + + + osps + 1 + + + sps + samp_per_sym + + + taps + rrc_taps + + + type + ccf + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (368, 20) + + + _rotation + 0 + + + id + doppler_correction_per_sec + + + label + + + + short_id + + + + type + intx + + + value + 20 + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (776, 100) + + + _rotation + 0 + + + id + enable_iq_dump + + + label + + + + short_id + + + + type + intx + + + value + 0 + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (840, 20) + + + _rotation + 180 + + + id + file_path + + + label + + + + short_id + + + + type + string + + + value + test.ogg + + + + freq_xlating_fir_filter_xxx + + alias + + + + center_freq + lo_offset + + + comment + + + + affinity + + + + decim + int(samp_rate_rx/filter_rate) + + + _enabled + 1 + + + _coordinate + (608, 268) + + + _rotation + 0 + + + id + freq_xlating_fir_filter_xxx_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samp_rate + samp_rate_rx + + + taps + xlate_filter_taps + + + type + ccc + + + + freq_xlating_fir_filter_xxx + + alias + + + + center_freq + cw_offset/1200.0*baudrate + + + comment + + + + affinity + + + + decim + audio_samp_rate/(samp_per_sym*baudrate) + + + _enabled + True + + + _coordinate + (48, 660) + + + _rotation + 0 + + + id + freq_xlating_fir_filter_xxx_0_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samp_rate + audio_samp_rate + + + taps + firdes.low_pass(1, audio_samp_rate, (1+alpha)*baudrate, (1+alpha)*baudrate*filt_mode) + + + type + ccf + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (536, 100) + + + _rotation + 0 + + + id + if_gain + + + label + + + + short_id + + + + type + eng_float + + + value + satnogs.not_set_rx_if_gain + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (896, 100) + + + _rotation + 0 + + + id + iq_file_path + + + label + + + + short_id + + + + type + string + + + value + /tmp/iq.dat + + + + parameter + + alias + + + + comment + To avoid the SDR carrier at the DC +we shift the LO a little further + + + _enabled + True + + + _coordinate + (1704, 324) + + + _rotation + 0 + + + id + lo_offset + + + label + + + + short_id + + + + type + eng_float + + + value + 100e3 + + + + low_pass_filter + + beta + 6.76 + + + alias + + + + comment + + + + affinity + + + + cutoff_freq + (1+alpha)*baudrate + + + decim + 1 + + + _enabled + True + + + type + fir_filter_ccf + + + _coordinate + (1344, 308) + + + _rotation + 0 + + + gain + 1 + + + id + low_pass_filter_0 + + + interp + 1 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samp_rate + audio_samp_rate + + + width + ((1+alpha)*baudrate)*filt_mode + + + win + firdes.WIN_HAMMING + + + + osmosdr_source + + alias + + + + ant0 + satnogs.handle_rx_antenna(rx_sdr_device, antenna) + + + bb_gain0 + satnogs.handle_rx_bb_gain(rx_sdr_device, bb_gain) + + + bw0 + samp_rate_rx + + + dc_offset_mode0 + 2 + + + corr0 + ppm + + + freq0 + rx_freq - lo_offset + + + gain_mode0 + False + + + if_gain0 + satnogs.handle_rx_if_gain(rx_sdr_device, if_gain) + + + iq_balance_mode0 + 0 + + + gain0 + satnogs.handle_rx_rf_gain(rx_sdr_device, rf_gain) + + + ant1 + + + + bb_gain1 + 20 + + + bw1 + 0 + + + dc_offset_mode1 + 0 + + + corr1 + 0 + + + freq1 + 100e6 + + + gain_mode1 + False + + + if_gain1 + 20 + + + iq_balance_mode1 + 0 + + + gain1 + 10 + + + ant2 + + + + bb_gain2 + 20 + + + bw2 + 0 + + + dc_offset_mode2 + 0 + + + corr2 + 0 + + + freq2 + 100e6 + + + gain_mode2 + False + + + if_gain2 + 20 + + + iq_balance_mode2 + 0 + + + gain2 + 10 + + + ant3 + + + + bb_gain3 + 20 + + + bw3 + 0 + + + dc_offset_mode3 + 0 + + + corr3 + 0 + + + freq3 + 100e6 + + + gain_mode3 + False + + + if_gain3 + 20 + + + iq_balance_mode3 + 0 + + + gain3 + 10 + + + ant4 + + + + bb_gain4 + 20 + + + bw4 + 0 + + + dc_offset_mode4 + 0 + + + corr4 + 0 + + + freq4 + 100e6 + + + gain_mode4 + False + + + if_gain4 + 20 + + + iq_balance_mode4 + 0 + + + gain4 + 10 + + + comment + + + + affinity + + + + args + satnogs.handle_rx_dev_args(rx_sdr_device, dev_args) + + + _enabled + 1 + + + _coordinate + (15, 359) + + + _rotation + 0 + + + id + osmosdr_source_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + nchan + 1 + + + type + fc32 + + + sample_rate + samp_rate_rx + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (1080, 20) + + + _rotation + 0 + + + id + ppm + + + label + + + + short_id + + + + type + intx + + + value + 0 + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (464, 100) + + + _rotation + 0 + + + id + rf_gain + + + label + + + + short_id + + + + type + eng_float + + + value + satnogs.not_set_rx_rf_gain + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (656, 20) + + + _rotation + 0 + + + id + rigctl_port + + + label + + + + short_id + + + + type + intx + + + value + 4532 + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (752, 20) + + + _rotation + 0 + + + id + rx_freq + + + label + + + + short_id + + + + type + eng_float + + + value + 100e6 + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (536, 20) + + + _rotation + 0 + + + id + rx_sdr_device + + + label + + + + short_id + + + + type + string + + + value + rtlsdr + + + + satnogs_ax25_decoder_bm + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + descrambling + True + + + _coordinate + (1016, 756) + + + _rotation + 180 + + + id + satnogs_ax25_decoder_bm_0 + + + maxoutbuf + 0 + + + max_frame_len + 1024 + + + minoutbuf + 0 + + + promisc + True + + + addr + 'GND' + + + ssid + 0 + + + + satnogs_ax25_decoder_bm + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + descrambling + False + + + _coordinate + (1016, 868) + + + _rotation + 180 + + + id + satnogs_ax25_decoder_bm_0_0 + + + maxoutbuf + 0 + + + max_frame_len + 1024 + + + minoutbuf + 0 + + + promisc + True + + + addr + 'GND' + + + ssid + 0 + + + + satnogs_coarse_doppler_correction_cc + + alias + + + + comment + + + + affinity + + + + _enabled + 1 + + + _coordinate + (368, 404) + + + _rotation + 0 + + + id + satnogs_coarse_doppler_correction_cc_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + sampling_rate + samp_rate_rx + + + target_freq + rx_freq + + + + satnogs_doppler_correction_cc + + alias + + + + comment + + + + affinity + + + + corrections_per_sec + 1000 + + + _enabled + 0 + + + _coordinate + (360, 248) + + + _rotation + 0 + + + id + satnogs_doppler_correction_cc_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + sampling_rate + samp_rate_rx + + + target_freq + rx_freq + + + + satnogs_frame_file_sink + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (712, 796) + + + _rotation + 180 + + + id + satnogs_frame_file_sink_0_1_0 + + + output_type + 0 + + + prefix_name + decoded_data_file_path + + + + satnogs_iq_sink + + append + False + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + filename + iq_file_path + + + _coordinate + (1344, 228) + + + _rotation + 0 + + + id + satnogs_iq_sink_0 + + + scale + 32767 + + + status + enable_iq_dump + + + + satnogs_ogg_encoder + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + filename + file_path + + + _coordinate + (864, 484) + + + _rotation + 180 + + + id + satnogs_ogg_encoder_0 + + + quality + 1.0 + + + samp_rate + audio_samp_rate + + + + satnogs_tcp_rigctl_msg_source + + alias + + + + comment + + + + affinity + + + + _enabled + 1 + + + _coordinate + (16, 204) + + + _rotation + 0 + + + id + satnogs_tcp_rigctl_msg_source_0 + + + addr + "127.0.0.1" + + + mtu + 1500 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + mode + False + + + port + rigctl_port + + + interval + 1000/doppler_correction_per_sec + + + + satnogs_udp_msg_sink + + alias + + + + comment + + + + affinity + + + + _enabled + 1 + + + _coordinate + (744, 860) + + + _rotation + 180 + + + id + satnogs_udp_msg_sink_0_0 + + + addr + udp_IP + + + mtu + 1500 + + + port + udp_port + + + + satnogs_waterfall_sink + + alias + + + + center_freq + 0.0 + + + comment + + + + affinity + + + + _enabled + True + + + fft_size + 1024 + + + filename + waterfall_file_path + + + _coordinate + (1536, 44) + + + _rotation + 0 + + + id + satnogs_waterfall_sink_0 + + + mode + 1 + + + pps + 10 + + + samp_rate + max(12000, int(3*(1+alpha)*baudrate)) + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (560, 860) + + + _rotation + 0 + + + id + udp_IP + + + label + + + + short_id + + + + type + string + + + value + 127.0.0.1 + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (656, 860) + + + _rotation + 0 + + + id + udp_port + + + label + + + + short_id + + + + type + intx + + + value + 16887 + + + + parameter + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (944, 20) + + + _rotation + 0 + + + id + waterfall_file_path + + + label + + + + short_id + + + + type + string + + + value + /tmp/waterfall.dat + + + + analog_agc2_xx_0 + digital_pfb_clock_sync_xxx_0 + 0 + 0 + + + analog_agc2_xx_0_0 + blocks_multiply_xx_0 + 0 + 1 + + + analog_sig_source_x_0 + blocks_multiply_xx_0 + 0 + 0 + + + analog_sig_source_x_0 + blocks_multiply_xx_0_0 + 0 + 0 + + + blks2_rational_resampler_xxx_1 + blks2_rational_resampler_xxx_1_0 + 0 + 0 + + + blks2_rational_resampler_xxx_1 + blocks_multiply_xx_0_0 + 0 + 1 + + + blks2_rational_resampler_xxx_1 + low_pass_filter_0 + 0 + 0 + + + blks2_rational_resampler_xxx_1 + satnogs_iq_sink_0 + 0 + 0 + + + blks2_rational_resampler_xxx_1_0 + satnogs_waterfall_sink_0 + 0 + 0 + + + blocks_complex_to_real_0 + satnogs_ogg_encoder_0 + 0 + 0 + + + blocks_complex_to_real_0_0 + digital_binary_slicer_fb_0 + 0 + 0 + + + blocks_multiply_xx_0 + blocks_complex_to_real_0 + 0 + 0 + + + blocks_multiply_xx_0_0 + freq_xlating_fir_filter_xxx_0_0 + 0 + 0 + + + digital_binary_slicer_fb_0 + satnogs_ax25_decoder_bm_0 + 0 + 0 + + + digital_binary_slicer_fb_0 + satnogs_ax25_decoder_bm_0_0 + 0 + 0 + + + digital_costas_loop_cc_0_0_0_0 + blocks_complex_to_real_0_0 + 0 + 0 + + + digital_pfb_clock_sync_xxx_0 + digital_costas_loop_cc_0_0_0_0 + 0 + 0 + + + freq_xlating_fir_filter_xxx_0 + blks2_rational_resampler_xxx_1 + 0 + 0 + + + freq_xlating_fir_filter_xxx_0_0 + analog_agc2_xx_0 + 0 + 0 + + + low_pass_filter_0 + analog_agc2_xx_0_0 + 0 + 0 + + + osmosdr_source_0 + satnogs_coarse_doppler_correction_cc_0 + 0 + 0 + + + satnogs_ax25_decoder_bm_0 + satnogs_frame_file_sink_0_1_0 + pdu + frame + + + satnogs_ax25_decoder_bm_0 + satnogs_udp_msg_sink_0_0 + pdu + in + + + satnogs_ax25_decoder_bm_0_0 + satnogs_frame_file_sink_0_1_0 + pdu + frame + + + satnogs_ax25_decoder_bm_0_0 + satnogs_udp_msg_sink_0_0 + pdu + in + + + satnogs_coarse_doppler_correction_cc_0 + freq_xlating_fir_filter_xxx_0 + 0 + 0 + + + satnogs_doppler_correction_cc_0 + freq_xlating_fir_filter_xxx_0 + 0 + 0 + + + satnogs_tcp_rigctl_msg_source_0 + satnogs_coarse_doppler_correction_cc_0 + freq + freq + + + satnogs_tcp_rigctl_msg_source_0 + satnogs_doppler_correction_cc_0 + freq + freq + + diff --git a/apps/flowgraphs/satnogs_bpsk_decoder.py b/apps/flowgraphs/satnogs_bpsk_decoder.py new file mode 100755 index 0000000..7f99269 --- /dev/null +++ b/apps/flowgraphs/satnogs_bpsk_decoder.py @@ -0,0 +1,452 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- +################################################## +# GNU Radio Python Flow Graph +# Title: BPSK Decoder +# Author: Patrick Dohmen, DL4PD +# Description: A BPSK decoder block for gr-satnogs +# Generated: Tue Mar 27 17:05:17 2018 +################################################## + +from gnuradio import analog +from gnuradio import blocks +from gnuradio import digital +from gnuradio import eng_notation +from gnuradio import filter +from gnuradio import gr +from gnuradio.eng_option import eng_option +from gnuradio.filter import firdes +from optparse import OptionParser +import osmosdr +import satnogs + + +class satnogs_bpsk_decoder(gr.top_block): + + def __init__(self, antenna=satnogs.not_set_antenna, baudrate=1200, bb_gain=satnogs.not_set_rx_bb_gain, cw_offset=1500, decoded_data_file_path='/tmp/.satnogs/data/data', dev_args=satnogs.not_set_dev_args, doppler_correction_per_sec=20, enable_iq_dump=0, file_path='test.ogg', if_gain=satnogs.not_set_rx_if_gain, iq_file_path='/tmp/iq.dat', lo_offset=100e3, ppm=0, rf_gain=satnogs.not_set_rx_rf_gain, rigctl_port=4532, rx_freq=100e6, rx_sdr_device='rtlsdr', udp_IP='127.0.0.1', udp_port=16887, waterfall_file_path='/tmp/waterfall.dat'): + gr.top_block.__init__(self, "BPSK Decoder") + + ################################################## + # Parameters + ################################################## + self.antenna = antenna + self.baudrate = baudrate + self.bb_gain = bb_gain + self.cw_offset = cw_offset + 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.if_gain = if_gain + self.iq_file_path = iq_file_path + self.lo_offset = lo_offset + self.ppm = ppm + self.rf_gain = rf_gain + self.rigctl_port = rigctl_port + self.rx_freq = rx_freq + self.rx_sdr_device = rx_sdr_device + self.udp_IP = udp_IP + self.udp_port = udp_port + self.waterfall_file_path = waterfall_file_path + + ################################################## + # Variables + ################################################## + self.samp_rate_rx = samp_rate_rx = satnogs.hw_rx_settings[rx_sdr_device]['samp_rate'] + self.samp_per_sym = samp_per_sym = 5 + self.nfilts = nfilts = 16 + 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.rrc_taps = rrc_taps = firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(samp_per_sym), 0.35, 11*samp_per_sym*nfilts) + self.filter_rate = filter_rate = 250000 + self.filt_mode = filt_mode = 0.1 + self.deviation = deviation = 5000 + self.audio_samp_rate = audio_samp_rate = 48000 + self.alpha = alpha = 0.1 + + ################################################## + # Blocks + ################################################## + self.satnogs_waterfall_sink_0 = satnogs.waterfall_sink(max(12000, int(3*(1+alpha)*baudrate)), 0.0, 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, 1000/doppler_correction_per_sec, 1500) + self.satnogs_ogg_encoder_0 = satnogs.ogg_encoder(file_path, audio_samp_rate, 1.0) + self.satnogs_iq_sink_0 = satnogs.iq_sink(32767, 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_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, samp_rate_rx) + self.satnogs_ax25_decoder_bm_0_0 = satnogs.ax25_decoder_bm('GND', 0, True, False, 1024) + self.satnogs_ax25_decoder_bm_0 = satnogs.ax25_decoder_bm('GND', 0, True, True, 1024) + self.osmosdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + satnogs.handle_rx_dev_args(rx_sdr_device, dev_args) ) + self.osmosdr_source_0.set_sample_rate(samp_rate_rx) + self.osmosdr_source_0.set_center_freq(rx_freq - lo_offset, 0) + self.osmosdr_source_0.set_freq_corr(ppm, 0) + self.osmosdr_source_0.set_dc_offset_mode(2, 0) + self.osmosdr_source_0.set_iq_balance_mode(0, 0) + self.osmosdr_source_0.set_gain_mode(False, 0) + self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(rx_sdr_device, rf_gain), 0) + self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(rx_sdr_device, if_gain), 0) + 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, (1+alpha)*baudrate, ((1+alpha)*baudrate)*filt_mode, firdes.WIN_HAMMING, 6.76)) + self.freq_xlating_fir_filter_xxx_0_0 = filter.freq_xlating_fir_filter_ccf(audio_samp_rate/(samp_per_sym*baudrate), (firdes.low_pass(1, audio_samp_rate, (1+alpha)*baudrate, (1+alpha)*baudrate*filt_mode)), cw_offset/1200.0*baudrate, audio_samp_rate) + 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.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(samp_per_sym, 0.063, (rrc_taps), nfilts, nfilts/2, 1.5, 1) + self.digital_costas_loop_cc_0_0_0_0 = digital.costas_loop_cc(0.063, 2, False) + self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb() + self.blocks_multiply_xx_0_0 = blocks.multiply_vcc(1) + self.blocks_multiply_xx_0 = blocks.multiply_vcc(1) + self.blocks_complex_to_real_0_0 = blocks.complex_to_real(1) + self.blocks_complex_to_real_0 = blocks.complex_to_real(1) + self.blks2_rational_resampler_xxx_1_0 = filter.rational_resampler_ccc( + interpolation=max(12000, int(3*(1+alpha)*baudrate)), + decimation=48000, + taps=None, + fractional_bw=None, + ) + self.blks2_rational_resampler_xxx_1 = filter.rational_resampler_ccc( + interpolation=audio_samp_rate, + decimation=int(samp_rate_rx/(samp_rate_rx/filter_rate)), + taps=None, + fractional_bw=None, + ) + self.analog_sig_source_x_0 = analog.sig_source_c(audio_samp_rate, analog.GR_COS_WAVE, cw_offset/1200.0*baudrate, 1, 0) + self.analog_agc2_xx_0_0 = analog.agc2_cc(0.01, 0.001, 0.015, 0.0) + self.analog_agc2_xx_0_0.set_max_gain(65536) + self.analog_agc2_xx_0 = analog.agc2_cc(0.01, 0.001, 0.5, 1.0) + self.analog_agc2_xx_0.set_max_gain(65536) + + ################################################## + # Connections + ################################################## + self.msg_connect((self.satnogs_ax25_decoder_bm_0, 'pdu'), (self.satnogs_frame_file_sink_0_1_0, 'frame')) + self.msg_connect((self.satnogs_ax25_decoder_bm_0, 'pdu'), (self.satnogs_udp_msg_sink_0_0, 'in')) + self.msg_connect((self.satnogs_ax25_decoder_bm_0_0, 'pdu'), (self.satnogs_frame_file_sink_0_1_0, 'frame')) + self.msg_connect((self.satnogs_ax25_decoder_bm_0_0, 'pdu'), (self.satnogs_udp_msg_sink_0_0, 'in')) + self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_coarse_doppler_correction_cc_0, 'freq')) + self.connect((self.analog_agc2_xx_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0)) + self.connect((self.analog_agc2_xx_0_0, 0), (self.blocks_multiply_xx_0, 1)) + self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0, 0)) + self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0_0, 0)) + self.connect((self.blks2_rational_resampler_xxx_1, 0), (self.blks2_rational_resampler_xxx_1_0, 0)) + self.connect((self.blks2_rational_resampler_xxx_1, 0), (self.blocks_multiply_xx_0_0, 1)) + 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, 0), (self.satnogs_waterfall_sink_0, 0)) + self.connect((self.blocks_complex_to_real_0, 0), (self.satnogs_ogg_encoder_0, 0)) + self.connect((self.blocks_complex_to_real_0_0, 0), (self.digital_binary_slicer_fb_0, 0)) + self.connect((self.blocks_multiply_xx_0, 0), (self.blocks_complex_to_real_0, 0)) + self.connect((self.blocks_multiply_xx_0_0, 0), (self.freq_xlating_fir_filter_xxx_0_0, 0)) + self.connect((self.digital_binary_slicer_fb_0, 0), (self.satnogs_ax25_decoder_bm_0, 0)) + self.connect((self.digital_binary_slicer_fb_0, 0), (self.satnogs_ax25_decoder_bm_0_0, 0)) + self.connect((self.digital_costas_loop_cc_0_0_0_0, 0), (self.blocks_complex_to_real_0_0, 0)) + self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.digital_costas_loop_cc_0_0_0_0, 0)) + self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.blks2_rational_resampler_xxx_1, 0)) + self.connect((self.freq_xlating_fir_filter_xxx_0_0, 0), (self.analog_agc2_xx_0, 0)) + self.connect((self.low_pass_filter_0, 0), (self.analog_agc2_xx_0_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 + + def set_antenna(self, antenna): + self.antenna = antenna + self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(self.rx_sdr_device, self.antenna), 0) + + def get_baudrate(self): + return self.baudrate + + def set_baudrate(self, baudrate): + self.baudrate = baudrate + self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.audio_samp_rate, (1+self.alpha)*self.baudrate, ((1+self.alpha)*self.baudrate)*self.filt_mode, firdes.WIN_HAMMING, 6.76)) + self.freq_xlating_fir_filter_xxx_0_0.set_taps((firdes.low_pass(1, self.audio_samp_rate, (1+self.alpha)*self.baudrate, (1+self.alpha)*self.baudrate*self.filt_mode))) + self.freq_xlating_fir_filter_xxx_0_0.set_center_freq(self.cw_offset/1200.0*self.baudrate) + self.analog_sig_source_x_0.set_frequency(self.cw_offset/1200.0*self.baudrate) + + def get_bb_gain(self): + return self.bb_gain + + def set_bb_gain(self, bb_gain): + self.bb_gain = bb_gain + self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(self.rx_sdr_device, self.bb_gain), 0) + + def get_cw_offset(self): + return self.cw_offset + + def set_cw_offset(self, cw_offset): + self.cw_offset = cw_offset + self.freq_xlating_fir_filter_xxx_0_0.set_center_freq(self.cw_offset/1200.0*self.baudrate) + self.analog_sig_source_x_0.set_frequency(self.cw_offset/1200.0*self.baudrate) + + def get_decoded_data_file_path(self): + return self.decoded_data_file_path + + def set_decoded_data_file_path(self, decoded_data_file_path): + self.decoded_data_file_path = decoded_data_file_path + + def get_dev_args(self): + return self.dev_args + + def set_dev_args(self, dev_args): + self.dev_args = dev_args + + def get_doppler_correction_per_sec(self): + return self.doppler_correction_per_sec + + def set_doppler_correction_per_sec(self, doppler_correction_per_sec): + self.doppler_correction_per_sec = doppler_correction_per_sec + + def get_enable_iq_dump(self): + return self.enable_iq_dump + + def set_enable_iq_dump(self, enable_iq_dump): + self.enable_iq_dump = enable_iq_dump + + def get_file_path(self): + return self.file_path + + def set_file_path(self, file_path): + self.file_path = file_path + + def get_if_gain(self): + return self.if_gain + + def set_if_gain(self, if_gain): + self.if_gain = if_gain + self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(self.rx_sdr_device, self.if_gain), 0) + + def get_iq_file_path(self): + return self.iq_file_path + + def set_iq_file_path(self, iq_file_path): + self.iq_file_path = iq_file_path + + def get_lo_offset(self): + return self.lo_offset + + def set_lo_offset(self, lo_offset): + self.lo_offset = lo_offset + self.osmosdr_source_0.set_center_freq(self.rx_freq - self.lo_offset, 0) + self.freq_xlating_fir_filter_xxx_0.set_center_freq(self.lo_offset) + + def get_ppm(self): + return self.ppm + + def set_ppm(self, ppm): + self.ppm = ppm + self.osmosdr_source_0.set_freq_corr(self.ppm, 0) + + def get_rf_gain(self): + return self.rf_gain + + def set_rf_gain(self, rf_gain): + self.rf_gain = rf_gain + self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(self.rx_sdr_device, self.rf_gain), 0) + + def get_rigctl_port(self): + return self.rigctl_port + + def set_rigctl_port(self, rigctl_port): + self.rigctl_port = rigctl_port + + def get_rx_freq(self): + return self.rx_freq + + def set_rx_freq(self, rx_freq): + self.rx_freq = rx_freq + self.satnogs_coarse_doppler_correction_cc_0.set_new_freq_locked(self.rx_freq) + self.osmosdr_source_0.set_center_freq(self.rx_freq - self.lo_offset, 0) + + def get_rx_sdr_device(self): + return self.rx_sdr_device + + def set_rx_sdr_device(self, rx_sdr_device): + self.rx_sdr_device = rx_sdr_device + self.set_samp_rate_rx(satnogs.hw_rx_settings[self.rx_sdr_device]['samp_rate']) + self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(self.rx_sdr_device, self.rf_gain), 0) + self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(self.rx_sdr_device, self.if_gain), 0) + self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(self.rx_sdr_device, self.bb_gain), 0) + self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(self.rx_sdr_device, self.antenna), 0) + + def get_udp_IP(self): + return self.udp_IP + + def set_udp_IP(self, udp_IP): + self.udp_IP = udp_IP + + def get_udp_port(self): + return self.udp_port + + def set_udp_port(self, udp_port): + self.udp_port = udp_port + + def get_waterfall_file_path(self): + return self.waterfall_file_path + + def set_waterfall_file_path(self, waterfall_file_path): + self.waterfall_file_path = waterfall_file_path + + def get_samp_rate_rx(self): + return self.samp_rate_rx + + def set_samp_rate_rx(self, samp_rate_rx): + self.samp_rate_rx = samp_rate_rx + self.set_xlate_filter_taps(firdes.low_pass(1, self.samp_rate_rx, 125000, 25000, firdes.WIN_HAMMING, 6.76)) + self.osmosdr_source_0.set_sample_rate(self.samp_rate_rx) + self.osmosdr_source_0.set_bandwidth(self.samp_rate_rx, 0) + + def get_samp_per_sym(self): + return self.samp_per_sym + + def set_samp_per_sym(self, samp_per_sym): + self.samp_per_sym = samp_per_sym + self.set_rrc_taps(firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0/float(self.samp_per_sym), 0.35, 11*self.samp_per_sym*self.nfilts)) + + def get_nfilts(self): + return self.nfilts + + def set_nfilts(self, nfilts): + self.nfilts = nfilts + self.set_rrc_taps(firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0/float(self.samp_per_sym), 0.35, 11*self.samp_per_sym*self.nfilts)) + + def get_xlate_filter_taps(self): + return self.xlate_filter_taps + + def set_xlate_filter_taps(self, xlate_filter_taps): + self.xlate_filter_taps = xlate_filter_taps + self.freq_xlating_fir_filter_xxx_0.set_taps((self.xlate_filter_taps)) + + def get_taps(self): + return self.taps + + def set_taps(self, taps): + self.taps = taps + + def get_rrc_taps(self): + return self.rrc_taps + + def set_rrc_taps(self, rrc_taps): + self.rrc_taps = rrc_taps + self.digital_pfb_clock_sync_xxx_0.update_taps((self.rrc_taps)) + + def get_filter_rate(self): + return self.filter_rate + + def set_filter_rate(self, filter_rate): + self.filter_rate = filter_rate + + def get_filt_mode(self): + return self.filt_mode + + def set_filt_mode(self, filt_mode): + self.filt_mode = filt_mode + self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.audio_samp_rate, (1+self.alpha)*self.baudrate, ((1+self.alpha)*self.baudrate)*self.filt_mode, firdes.WIN_HAMMING, 6.76)) + self.freq_xlating_fir_filter_xxx_0_0.set_taps((firdes.low_pass(1, self.audio_samp_rate, (1+self.alpha)*self.baudrate, (1+self.alpha)*self.baudrate*self.filt_mode))) + + def get_deviation(self): + return self.deviation + + def set_deviation(self, deviation): + self.deviation = deviation + + def get_audio_samp_rate(self): + return self.audio_samp_rate + + 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, (1+self.alpha)*self.baudrate, ((1+self.alpha)*self.baudrate)*self.filt_mode, firdes.WIN_HAMMING, 6.76)) + self.freq_xlating_fir_filter_xxx_0_0.set_taps((firdes.low_pass(1, self.audio_samp_rate, (1+self.alpha)*self.baudrate, (1+self.alpha)*self.baudrate*self.filt_mode))) + self.analog_sig_source_x_0.set_sampling_freq(self.audio_samp_rate) + + def get_alpha(self): + return self.alpha + + def set_alpha(self, alpha): + self.alpha = alpha + self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.audio_samp_rate, (1+self.alpha)*self.baudrate, ((1+self.alpha)*self.baudrate)*self.filt_mode, firdes.WIN_HAMMING, 6.76)) + self.freq_xlating_fir_filter_xxx_0_0.set_taps((firdes.low_pass(1, self.audio_samp_rate, (1+self.alpha)*self.baudrate, (1+self.alpha)*self.baudrate*self.filt_mode))) + + +def argument_parser(): + description = 'A BPSK decoder block for gr-satnogs' + parser = OptionParser(usage="%prog: [options]", option_class=eng_option, description=description) + parser.add_option( + "", "--antenna", dest="antenna", type="string", default=satnogs.not_set_antenna, + help="Set antenna [default=%default]") + parser.add_option( + "", "--baudrate", dest="baudrate", type="intx", default=1200, + help="Set baudrate [default=%default]") + parser.add_option( + "", "--bb-gain", dest="bb_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_bb_gain), + help="Set bb_gain [default=%default]") + parser.add_option( + "", "--cw-offset", dest="cw_offset", type="eng_float", default=eng_notation.num_to_str(1500), + help="Set cw_offset [default=%default]") + parser.add_option( + "", "--decoded-data-file-path", dest="decoded_data_file_path", type="string", default='/tmp/.satnogs/data/data', + help="Set decoded_data_file_path [default=%default]") + parser.add_option( + "", "--dev-args", dest="dev_args", type="string", default=satnogs.not_set_dev_args, + help="Set dev_args [default=%default]") + parser.add_option( + "", "--doppler-correction-per-sec", dest="doppler_correction_per_sec", type="intx", default=20, + help="Set doppler_correction_per_sec [default=%default]") + parser.add_option( + "", "--enable-iq-dump", dest="enable_iq_dump", type="intx", default=0, + help="Set enable_iq_dump [default=%default]") + parser.add_option( + "", "--file-path", dest="file_path", type="string", default='test.ogg', + help="Set file_path [default=%default]") + parser.add_option( + "", "--if-gain", dest="if_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_if_gain), + help="Set if_gain [default=%default]") + parser.add_option( + "", "--iq-file-path", dest="iq_file_path", type="string", default='/tmp/iq.dat', + help="Set iq_file_path [default=%default]") + parser.add_option( + "", "--lo-offset", dest="lo_offset", type="eng_float", default=eng_notation.num_to_str(100e3), + help="Set lo_offset [default=%default]") + parser.add_option( + "", "--ppm", dest="ppm", type="intx", default=0, + help="Set ppm [default=%default]") + parser.add_option( + "", "--rf-gain", dest="rf_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_rf_gain), + help="Set rf_gain [default=%default]") + parser.add_option( + "", "--rigctl-port", dest="rigctl_port", type="intx", default=4532, + help="Set rigctl_port [default=%default]") + parser.add_option( + "", "--rx-freq", dest="rx_freq", type="eng_float", default=eng_notation.num_to_str(100e6), + help="Set rx_freq [default=%default]") + parser.add_option( + "", "--rx-sdr-device", dest="rx_sdr_device", type="string", default='rtlsdr', + help="Set rx_sdr_device [default=%default]") + parser.add_option( + "", "--udp-IP", dest="udp_IP", type="string", default='127.0.0.1', + help="Set udp_IP [default=%default]") + parser.add_option( + "", "--udp-port", dest="udp_port", type="intx", default=16887, + help="Set udp_port [default=%default]") + parser.add_option( + "", "--waterfall-file-path", dest="waterfall_file_path", type="string", default='/tmp/waterfall.dat', + help="Set waterfall_file_path [default=%default]") + return parser + + +def main(top_block_cls=satnogs_bpsk_decoder, options=None): + if options is None: + options, _ = argument_parser().parse_args() + + tb = top_block_cls(antenna=options.antenna, baudrate=options.baudrate, bb_gain=options.bb_gain, cw_offset=options.cw_offset, decoded_data_file_path=options.decoded_data_file_path, dev_args=options.dev_args, doppler_correction_per_sec=options.doppler_correction_per_sec, enable_iq_dump=options.enable_iq_dump, file_path=options.file_path, if_gain=options.if_gain, iq_file_path=options.iq_file_path, lo_offset=options.lo_offset, ppm=options.ppm, rf_gain=options.rf_gain, rigctl_port=options.rigctl_port, rx_freq=options.rx_freq, rx_sdr_device=options.rx_sdr_device, udp_IP=options.udp_IP, udp_port=options.udp_port, waterfall_file_path=options.waterfall_file_path) + tb.start() + tb.wait() + + +if __name__ == '__main__': + main() From dbfb6e6562dabd954f8a94286d0e1db7c86f727e Mon Sep 17 00:00:00 2001 From: Patrick Dohmen Date: Fri, 18 May 2018 08:53:12 +0200 Subject: [PATCH 02/10] Improve sensitivity --- apps/flowgraphs/cw_decoder.grc | 511 +++++++++++++++++++++++--- apps/flowgraphs/satnogs_cw_decoder.py | 60 ++- 2 files changed, 515 insertions(+), 56 deletions(-) diff --git a/apps/flowgraphs/cw_decoder.grc b/apps/flowgraphs/cw_decoder.grc index c1cb1b4..2d7abc1 100644 --- a/apps/flowgraphs/cw_decoder.grc +++ b/apps/flowgraphs/cw_decoder.grc @@ -214,7 +214,70 @@ TX sampling rate value - 5 + int(samp_rate_rx/100e3) + + + + analog_agc2_xx + + attack_rate + 0.01 + + + alias + + + + comment + + + + affinity + + + + decay_rate + 0.001 + + + _enabled + 1 + + + _coordinate + (1408, 556) + + + _rotation + 180 + + + gain + 0.0 + + + id + analog_agc2_xx_0_0 + + + max_gain + 65536 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + reference + 0.015 + + + type + complex @@ -237,7 +300,7 @@ TX sampling rate _coordinate - (983, 275) + (960, 348) _rotation @@ -268,6 +331,69 @@ TX sampling rate 0 + + analog_sig_source_x + + amp + 1 + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + freq + bfo_freq + + + _coordinate + (1408, 668) + + + _rotation + 180 + + + id + analog_sig_source_x_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + offset + 0 + + + type + complex + + + samp_rate + audio_samp_rate + + + waveform + analog.GR_COS_WAVE + + parameter @@ -354,6 +480,51 @@ TX sampling rate satnogs.not_set_rx_bb_gain + + parameter + + alias + + + + comment + The bfo_freq shifts the carrier from 0 Hz to a +frequency that corresponds to the CW audio +tone. This tone is typically 1 kHz. + + + _enabled + True + + + _coordinate + (1408, 788) + + + _rotation + 0 + + + id + bfo_freq + + + label + + + + short_id + + + + type + eng_float + + + value + 1e3 + + blocks_complex_to_mag_squared @@ -374,7 +545,7 @@ TX sampling rate _coordinate - (1374, 295) + (1168, 368) _rotation @@ -417,11 +588,11 @@ TX sampling rate _coordinate - (1070, 159) + (920, 608) _rotation - 0 + 180 id @@ -440,6 +611,112 @@ TX sampling rate 1 + + blocks_moving_average_xx + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (1400, 348) + + + _rotation + 0 + + + id + blocks_moving_average_xx_0 + + + length + 300 + + + max_iter + 4000 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + scale + 1 + + + type + float + + + + blocks_multiply_xx + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (1264, 592) + + + _rotation + 180 + + + id + blocks_multiply_xx_0 + + + type + complex + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + num_inputs + 2 + + + vlen + 1 + + parameter @@ -667,7 +944,7 @@ TX sampling rate comment - + Output samplerate: 500k / 5 = 100k affinity @@ -683,7 +960,7 @@ TX sampling rate _coordinate - (518, 271) + (520, 188) _rotation @@ -918,7 +1195,7 @@ we shift the LO a little further comment - + Output samplerate: 100k / 5 = 20k affinity @@ -942,7 +1219,7 @@ we shift the LO a little further _coordinate - (765, 247) + (768, 284) _rotation @@ -993,7 +1270,7 @@ we shift the LO a little further comment - + Output samplerate: 20k / 4 = 5k affinity @@ -1013,15 +1290,15 @@ we shift the LO a little further type - fir_filter_ccf + fir_filter_fff _coordinate - (1182, 247) + (1584, 420) _rotation - 0 + 180 gain @@ -2514,8 +2791,67 @@ we shift the LO a little further comment + Output samplerate: 48k + + + affinity + + decim + int((samp_rate_rx/xlating_decimation)) + + + _enabled + 1 + + + fbw + 0 + + + _coordinate + (864, 76) + + + _rotation + 0 + + + id + rational_resampler_xxx_0 + + + interp + audio_samp_rate + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + taps + + + + type + ccc + + + + rational_resampler_xxx + + alias + + + + comment + Output samplerate: 48k + affinity @@ -2534,15 +2870,15 @@ we shift the LO a little further _coordinate - (845, 103) + (1088, 580) _rotation - 0 + 180 id - rational_resampler_xxx_0 + rational_resampler_xxx_0_0 interp @@ -2745,7 +3081,7 @@ we shift the LO a little further comment - + Output samplerate: 500k affinity @@ -2757,7 +3093,7 @@ we shift the LO a little further _coordinate - (303, 263) + (280, 304) _rotation @@ -2788,7 +3124,7 @@ we shift the LO a little further satnogs_cw_to_symbol threshold - 0.25 + 0.75 alias @@ -2812,7 +3148,7 @@ we shift the LO a little further _coordinate - (1366, 391) + (1336, 460) _rotation @@ -2839,6 +3175,57 @@ we shift the LO a little further wpm + + satnogs_doppler_correction_cc + + alias + + + + comment + + + + affinity + + + + corrections_per_sec + 1000 + + + _enabled + 0 + + + _coordinate + (288, 192) + + + _rotation + 0 + + + id + satnogs_doppler_correction_cc_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + sampling_rate + samp_rate_rx + + + target_freq + rx_freq + + satnogs_frame_file_sink @@ -2859,7 +3246,7 @@ we shift the LO a little further _coordinate - (903, 403) + (720, 444) _rotation @@ -2906,7 +3293,7 @@ we shift the LO a little further _coordinate - (1070, 83) + (1144, 140) _rotation @@ -2945,7 +3332,7 @@ we shift the LO a little further _coordinate - (1142, 411) + (952, 444) _rotation @@ -2996,11 +3383,11 @@ we shift the LO a little further _coordinate - (1246, 139) + (760, 588) _rotation - 0 + 180 id @@ -3071,7 +3458,7 @@ we shift the LO a little further interval - 1000 + 50 @@ -3094,7 +3481,7 @@ we shift the LO a little further _coordinate - (933, 490) + (752, 508) _rotation @@ -3149,7 +3536,7 @@ we shift the LO a little further _coordinate - (647, 23) + (1144, 12) _rotation @@ -3169,7 +3556,7 @@ we shift the LO a little further samp_rate - (samp_rate_rx/xlating_decimation) + audio_samp_rate @@ -3344,15 +3731,27 @@ we shift the LO a little further 20 + + analog_agc2_xx_0_0 + blocks_multiply_xx_0 + 0 + 1 + analog_pll_carriertracking_cc_0 - low_pass_filter_0_0 + blocks_complex_to_mag_squared_0 + 0 + 0 + + + analog_sig_source_x_0 + blocks_multiply_xx_0 0 0 blocks_complex_to_mag_squared_0 - satnogs_cw_to_symbol_0 + blocks_moving_average_xx_0 0 0 @@ -3362,6 +3761,18 @@ we shift the LO a little further 0 0 + + blocks_moving_average_xx_0 + low_pass_filter_0_0 + 0 + 0 + + + blocks_multiply_xx_0 + rational_resampler_xxx_0_0 + 0 + 0 + freq_xlating_fir_filter_xxx_0 low_pass_filter_0 @@ -3370,7 +3781,13 @@ we shift the LO a little further freq_xlating_fir_filter_xxx_0 - satnogs_waterfall_sink_0 + rational_resampler_xxx_0 + 0 + 0 + + + low_pass_filter_0 + analog_agc2_xx_0_0 0 0 @@ -3380,15 +3797,9 @@ we shift the LO a little further 0 0 - - low_pass_filter_0 - rational_resampler_xxx_0 - 0 - 0 - low_pass_filter_0_0 - blocks_complex_to_mag_squared_0 + satnogs_cw_to_symbol_0 0 0 @@ -3400,13 +3811,19 @@ we shift the LO a little further rational_resampler_xxx_0 - blocks_complex_to_real_0 + satnogs_iq_sink_0 0 0 rational_resampler_xxx_0 - satnogs_iq_sink_0 + satnogs_waterfall_sink_0 + 0 + 0 + + + rational_resampler_xxx_0_0 + blocks_complex_to_real_0 0 0 @@ -3422,6 +3839,12 @@ we shift the LO a little further out in + + satnogs_doppler_correction_cc_0 + freq_xlating_fir_filter_xxx_0 + 0 + 0 + satnogs_morse_decoder_0 satnogs_frame_file_sink_0_0 @@ -3440,4 +3863,10 @@ we shift the LO a little further freq freq + + satnogs_tcp_rigctl_msg_source_0 + satnogs_doppler_correction_cc_0 + freq + freq + diff --git a/apps/flowgraphs/satnogs_cw_decoder.py b/apps/flowgraphs/satnogs_cw_decoder.py index eaf3346..fc411d4 100755 --- a/apps/flowgraphs/satnogs_cw_decoder.py +++ b/apps/flowgraphs/satnogs_cw_decoder.py @@ -5,9 +5,10 @@ # Title: CW Decoder # Author: Manolis Surligas (surligas@gmail.com) # Description: A CW (Morse) Decoder -# Generated: Sun Mar 25 17:48:02 2018 +# Generated: Tue May 15 22:58:51 2018 ################################################## + from gnuradio import analog from gnuradio import blocks from gnuradio import eng_notation @@ -24,7 +25,7 @@ import time class satnogs_cw_decoder(gr.top_block): - def __init__(self, antenna=satnogs.not_set_antenna, bb_gain=satnogs.not_set_rx_bb_gain, decoded_data_file_path='/tmp/.satnogs/data/data', dev_args=satnogs.not_set_dev_args, doppler_correction_per_sec=1000, enable_iq_dump=0, file_path='test.txt', if_gain=satnogs.not_set_rx_if_gain, iq_file_path='/tmp/iq.dat', lo_offset=100e3, ppm=0, rf_gain=satnogs.not_set_rx_rf_gain, rigctl_port=4532, rx_freq=100e6, rx_sdr_device='usrpb200', udp_IP='127.0.0.1', udp_port=16887, waterfall_file_path='/tmp/waterfall.dat', wpm=20): + def __init__(self, antenna=satnogs.not_set_antenna, bb_gain=satnogs.not_set_rx_bb_gain, bfo_freq=1e3, decoded_data_file_path='/tmp/.satnogs/data/data', dev_args=satnogs.not_set_dev_args, doppler_correction_per_sec=1000, enable_iq_dump=0, file_path='test.txt', if_gain=satnogs.not_set_rx_if_gain, iq_file_path='/tmp/iq.dat', lo_offset=100e3, ppm=0, rf_gain=satnogs.not_set_rx_rf_gain, rigctl_port=4532, rx_freq=100e6, rx_sdr_device='usrpb200', udp_IP='127.0.0.1', udp_port=16887, waterfall_file_path='/tmp/waterfall.dat', wpm=20): gr.top_block.__init__(self, "CW Decoder") ################################################## @@ -32,6 +33,7 @@ class satnogs_cw_decoder(gr.top_block): ################################################## self.antenna = antenna self.bb_gain = bb_gain + self.bfo_freq = bfo_freq self.decoded_data_file_path = decoded_data_file_path self.dev_args = dev_args self.doppler_correction_per_sec = doppler_correction_per_sec @@ -54,7 +56,7 @@ class satnogs_cw_decoder(gr.top_block): # Variables ################################################## self.samp_rate_rx = samp_rate_rx = satnogs.hw_rx_settings[rx_sdr_device]['samp_rate'] - self.xlating_decimation = xlating_decimation = 5 + self.xlating_decimation = xlating_decimation = int(samp_rate_rx/100e3) self.xlate_filter_taps = xlate_filter_taps = firdes.low_pass(1, samp_rate_rx, 125000, 25000, firdes.WIN_HAMMING, 6.76) self.lpf_decimation = lpf_decimation = 5 self.audio_samp_rate = audio_samp_rate = 48000 @@ -62,21 +64,27 @@ class satnogs_cw_decoder(gr.top_block): ################################################## # Blocks ################################################## - self.satnogs_waterfall_sink_0 = satnogs.waterfall_sink((samp_rate_rx/xlating_decimation), 0.0, 10, 1024, waterfall_file_path, 1) + self.satnogs_waterfall_sink_0 = satnogs.waterfall_sink(audio_samp_rate, 0.0, 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, 1000, 1500) + self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source("127.0.0.1", rigctl_port, False, 50, 1500) self.satnogs_ogg_encoder_0 = satnogs.ogg_encoder(file_path, audio_samp_rate, 1.0) self.satnogs_morse_decoder_0 = satnogs.morse_decoder(ord('#'), 3) self.satnogs_iq_sink_0 = satnogs.iq_sink(16768, iq_file_path, False, enable_iq_dump) self.satnogs_frame_file_sink_0_0 = satnogs.frame_file_sink(decoded_data_file_path, 0) - self.satnogs_cw_to_symbol_0 = satnogs.cw_to_symbol(samp_rate_rx/xlating_decimation/lpf_decimation/4, 0.25, 0.75, wpm) + self.satnogs_cw_to_symbol_0 = satnogs.cw_to_symbol(samp_rate_rx/xlating_decimation/lpf_decimation/4, 0.75, 0.75, wpm) self.satnogs_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, samp_rate_rx) - self.rational_resampler_xxx_0 = filter.rational_resampler_ccc( + self.rational_resampler_xxx_0_0 = filter.rational_resampler_ccc( interpolation=audio_samp_rate, decimation=int((samp_rate_rx/xlating_decimation)/lpf_decimation), taps=None, fractional_bw=None, ) + self.rational_resampler_xxx_0 = filter.rational_resampler_ccc( + interpolation=audio_samp_rate, + decimation=int((samp_rate_rx/xlating_decimation)), + taps=None, + fractional_bw=None, + ) self.osmosdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + satnogs.handle_rx_dev_args(rx_sdr_device, dev_args) ) self.osmosdr_source_0.set_sample_rate(samp_rate_rx) self.osmosdr_source_0.set_center_freq(rx_freq - lo_offset, 0) @@ -90,14 +98,19 @@ class satnogs_cw_decoder(gr.top_block): 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_0 = filter.fir_filter_ccf(4, firdes.low_pass( + self.low_pass_filter_0_0 = filter.fir_filter_fff(4, firdes.low_pass( 4, samp_rate_rx/xlating_decimation/lpf_decimation, 100, 100, firdes.WIN_HAMMING, 6.76)) self.low_pass_filter_0 = filter.fir_filter_ccf(lpf_decimation, firdes.low_pass( lpf_decimation, samp_rate_rx/xlating_decimation, 2e3, 1e3, firdes.WIN_HAMMING, 6.76)) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(xlating_decimation, (xlate_filter_taps), lo_offset, samp_rate_rx) + self.blocks_multiply_xx_0 = blocks.multiply_vcc(1) + self.blocks_moving_average_xx_0 = blocks.moving_average_ff(300, 1, 4000) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.blocks_complex_to_mag_squared_0 = blocks.complex_to_mag_squared(1) + self.analog_sig_source_x_0 = analog.sig_source_c(audio_samp_rate, analog.GR_COS_WAVE, bfo_freq, 1, 0) self.analog_pll_carriertracking_cc_0 = analog.pll_carriertracking_cc(2*math.pi/100, 2*math.pi*2e3/(samp_rate_rx/xlating_decimation/lpf_decimation), -2*math.pi*2e3/(samp_rate_rx/xlating_decimation/lpf_decimation)) + self.analog_agc2_xx_0_0 = analog.agc2_cc(0.01, 0.001, 0.015, 0.0) + self.analog_agc2_xx_0_0.set_max_gain(65536) ################################################## # Connections @@ -106,17 +119,22 @@ class satnogs_cw_decoder(gr.top_block): self.msg_connect((self.satnogs_morse_decoder_0, 'out'), (self.satnogs_frame_file_sink_0_0, 'frame')) self.msg_connect((self.satnogs_morse_decoder_0, 'out'), (self.satnogs_udp_msg_sink_0_0, 'in')) self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_coarse_doppler_correction_cc_0, 'freq')) - self.connect((self.analog_pll_carriertracking_cc_0, 0), (self.low_pass_filter_0_0, 0)) - self.connect((self.blocks_complex_to_mag_squared_0, 0), (self.satnogs_cw_to_symbol_0, 0)) + self.connect((self.analog_agc2_xx_0_0, 0), (self.blocks_multiply_xx_0, 1)) + self.connect((self.analog_pll_carriertracking_cc_0, 0), (self.blocks_complex_to_mag_squared_0, 0)) + self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0, 0)) + self.connect((self.blocks_complex_to_mag_squared_0, 0), (self.blocks_moving_average_xx_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.satnogs_ogg_encoder_0, 0)) + self.connect((self.blocks_moving_average_xx_0, 0), (self.low_pass_filter_0_0, 0)) + self.connect((self.blocks_multiply_xx_0, 0), (self.rational_resampler_xxx_0_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.low_pass_filter_0, 0)) - self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.satnogs_waterfall_sink_0, 0)) + self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.rational_resampler_xxx_0, 0)) + self.connect((self.low_pass_filter_0, 0), (self.analog_agc2_xx_0_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.analog_pll_carriertracking_cc_0, 0)) - self.connect((self.low_pass_filter_0, 0), (self.rational_resampler_xxx_0, 0)) - self.connect((self.low_pass_filter_0_0, 0), (self.blocks_complex_to_mag_squared_0, 0)) + self.connect((self.low_pass_filter_0_0, 0), (self.satnogs_cw_to_symbol_0, 0)) self.connect((self.osmosdr_source_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0)) - self.connect((self.rational_resampler_xxx_0, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.rational_resampler_xxx_0, 0), (self.satnogs_iq_sink_0, 0)) + self.connect((self.rational_resampler_xxx_0, 0), (self.satnogs_waterfall_sink_0, 0)) + self.connect((self.rational_resampler_xxx_0_0, 0), (self.blocks_complex_to_real_0, 0)) self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) def get_antenna(self): @@ -133,6 +151,13 @@ class satnogs_cw_decoder(gr.top_block): self.bb_gain = bb_gain self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(self.rx_sdr_device, self.bb_gain), 0) + def get_bfo_freq(self): + return self.bfo_freq + + def set_bfo_freq(self, bfo_freq): + self.bfo_freq = bfo_freq + self.analog_sig_source_x_0.set_frequency(self.bfo_freq) + def get_decoded_data_file_path(self): return self.decoded_data_file_path @@ -252,6 +277,7 @@ class satnogs_cw_decoder(gr.top_block): def set_samp_rate_rx(self, samp_rate_rx): self.samp_rate_rx = samp_rate_rx + self.set_xlating_decimation(int(self.samp_rate_rx/100e3)) self.set_xlate_filter_taps(firdes.low_pass(1, self.samp_rate_rx, 125000, 25000, firdes.WIN_HAMMING, 6.76)) self.osmosdr_source_0.set_sample_rate(self.samp_rate_rx) self.osmosdr_source_0.set_bandwidth(self.samp_rate_rx, 0) @@ -292,6 +318,7 @@ class satnogs_cw_decoder(gr.top_block): def set_audio_samp_rate(self, audio_samp_rate): self.audio_samp_rate = audio_samp_rate + self.analog_sig_source_x_0.set_sampling_freq(self.audio_samp_rate) def argument_parser(): @@ -303,6 +330,9 @@ def argument_parser(): parser.add_option( "", "--bb-gain", dest="bb_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_bb_gain), help="Set bb_gain [default=%default]") + parser.add_option( + "", "--bfo-freq", dest="bfo_freq", type="eng_float", default=eng_notation.num_to_str(1e3), + help="Set bfo_freq [default=%default]") parser.add_option( "", "--decoded-data-file-path", dest="decoded_data_file_path", type="string", default='/tmp/.satnogs/data/data', help="Set decoded_data_file_path [default=%default]") @@ -361,7 +391,7 @@ def main(top_block_cls=satnogs_cw_decoder, options=None): if options is None: options, _ = argument_parser().parse_args() - tb = top_block_cls(antenna=options.antenna, bb_gain=options.bb_gain, decoded_data_file_path=options.decoded_data_file_path, dev_args=options.dev_args, doppler_correction_per_sec=options.doppler_correction_per_sec, enable_iq_dump=options.enable_iq_dump, file_path=options.file_path, if_gain=options.if_gain, iq_file_path=options.iq_file_path, lo_offset=options.lo_offset, ppm=options.ppm, rf_gain=options.rf_gain, rigctl_port=options.rigctl_port, rx_freq=options.rx_freq, rx_sdr_device=options.rx_sdr_device, udp_IP=options.udp_IP, udp_port=options.udp_port, waterfall_file_path=options.waterfall_file_path, wpm=options.wpm) + tb = top_block_cls(antenna=options.antenna, bb_gain=options.bb_gain, bfo_freq=options.bfo_freq, decoded_data_file_path=options.decoded_data_file_path, dev_args=options.dev_args, doppler_correction_per_sec=options.doppler_correction_per_sec, enable_iq_dump=options.enable_iq_dump, file_path=options.file_path, if_gain=options.if_gain, iq_file_path=options.iq_file_path, lo_offset=options.lo_offset, ppm=options.ppm, rf_gain=options.rf_gain, rigctl_port=options.rigctl_port, rx_freq=options.rx_freq, rx_sdr_device=options.rx_sdr_device, udp_IP=options.udp_IP, udp_port=options.udp_port, waterfall_file_path=options.waterfall_file_path, wpm=options.wpm) tb.start() tb.wait() From 85219e5d6b256e7046303c510e91f70e0047bd9c Mon Sep 17 00:00:00 2001 From: Manolis Surligas Date: Mon, 21 May 2018 19:49:52 +0300 Subject: [PATCH 03/10] Fix CW decoder * Fix CW decoder * Link with boost chrono to avoid a linking error in boost 1.67 --- CMakeLists.txt | 2 +- apps/flowgraphs/cw_decoder.grc | 545 ++++++++++++-------------- apps/flowgraphs/satnogs_cw_decoder.py | 84 ++-- 3 files changed, 278 insertions(+), 353 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 566d626..cbdf2d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,7 +74,7 @@ set(Boost_ADDITIONAL_VERSIONS "1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" "1.64.0" "1.64" "1.65.0" "1.65" "1.66.0" "1.66" "1.67.0" "1.67" "1.68.0" "1.68" "1.69.0" "1.69" ) -find_package(Boost "1.35" COMPONENTS filesystem system) +find_package(Boost "1.35" COMPONENTS filesystem system chrono thread) if(NOT Boost_FOUND) message(FATAL_ERROR "Boost required to compile satnogs") diff --git a/apps/flowgraphs/cw_decoder.grc b/apps/flowgraphs/cw_decoder.grc index 2d7abc1..bbbaf24 100644 --- a/apps/flowgraphs/cw_decoder.grc +++ b/apps/flowgraphs/cw_decoder.grc @@ -1,5 +1,5 @@ - + Thu May 5 00:22:45 2016 @@ -72,6 +72,10 @@ run True + + sizing_mode + fixed + thread_safe_setters @@ -80,6 +84,10 @@ title CW Decoder + + placement + (0,0) + variable @@ -108,33 +116,6 @@ 48000 - - variable - - comment - - - - _enabled - True - - - _coordinate - (574, 546) - - - _rotation - 0 - - - id - lpf_decimation - - - value - 5 - - variable @@ -280,6 +261,65 @@ TX sampling rate complex + + analog_agc_xx + + alias + + + + comment + + + + affinity + + + + _enabled + 1 + + + _coordinate + (1372, 339) + + + _rotation + 0 + + + gain + 1.0 + + + id + analog_agc_xx_0 + + + max_gain + 65536 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + rate + 1e-4 + + + reference + 1.0 + + + type + float + + analog_pll_carriertracking_cc @@ -316,7 +356,7 @@ TX sampling rate max_freq - 2*math.pi*2e3/(samp_rate_rx/xlating_decimation/lpf_decimation) + 2*math.pi*2e3/audio_samp_rate maxoutbuf @@ -324,7 +364,7 @@ TX sampling rate min_freq - -2*math.pi*2e3/(samp_rate_rx/xlating_decimation/lpf_decimation) + -2*math.pi*2e3/audio_samp_rate minoutbuf @@ -428,6 +468,10 @@ TX sampling rate short_id + + hide + none + type string @@ -471,6 +515,10 @@ TX sampling rate short_id + + hide + none + type eng_float @@ -516,6 +564,10 @@ tone. This tone is typically 1 kHz. short_id + + hide + none + type eng_float @@ -611,61 +663,6 @@ tone. This tone is typically 1 kHz. 1 - - blocks_moving_average_xx - - alias - - - - comment - - - - affinity - - - - _enabled - True - - - _coordinate - (1400, 348) - - - _rotation - 0 - - - id - blocks_moving_average_xx_0 - - - length - 300 - - - max_iter - 4000 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - scale - 1 - - - type - float - - blocks_multiply_xx @@ -751,6 +748,10 @@ tone. This tone is typically 1 kHz. short_id + + hide + none + type string @@ -794,6 +795,10 @@ tone. This tone is typically 1 kHz. short_id + + hide + none + type string @@ -837,6 +842,10 @@ tone. This tone is typically 1 kHz. short_id + + hide + none + type intx @@ -880,6 +889,10 @@ tone. This tone is typically 1 kHz. short_id + + hide + none + type intx @@ -923,6 +936,10 @@ tone. This tone is typically 1 kHz. short_id + + hide + none + type string @@ -960,7 +977,7 @@ tone. This tone is typically 1 kHz. _coordinate - (520, 188) + (287, 379) _rotation @@ -1025,6 +1042,10 @@ tone. This tone is typically 1 kHz. short_id + + hide + none + type eng_float @@ -1130,6 +1151,10 @@ tone. This tone is typically 1 kHz. short_id + + hide + none + type string @@ -1174,6 +1199,10 @@ we shift the LO a little further short_id + + hide + none + type eng_float @@ -1195,7 +1224,7 @@ we shift the LO a little further comment - Output samplerate: 100k / 5 = 20k + affinity @@ -1207,7 +1236,7 @@ we shift the LO a little further decim - lpf_decimation + 1 _enabled @@ -1219,7 +1248,7 @@ we shift the LO a little further _coordinate - (768, 284) + (1268, 179) _rotation @@ -1227,7 +1256,7 @@ we shift the LO a little further gain - lpf_decimation + 1 id @@ -1247,7 +1276,7 @@ we shift the LO a little further samp_rate - samp_rate_rx/xlating_decimation + audio_samp_rate width @@ -1322,7 +1351,7 @@ we shift the LO a little further samp_rate - samp_rate_rx/xlating_decimation/lpf_decimation + audio_samp_rate width @@ -2740,6 +2769,69 @@ we shift the LO a little further + + pfb_arb_resampler_xxx + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (662, 227) + + + _rotation + 0 + + + id + pfb_arb_resampler_xxx_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + nfilts + 32 + + + rrate + (audio_samp_rate) / (samp_rate_rx / xlating_decimation) + + + samp_delay + 0 + + + atten + 80 + + + taps + + + + type + ccf + + parameter @@ -2774,6 +2866,10 @@ we shift the LO a little further short_id + + hide + none + type intx @@ -2783,124 +2879,6 @@ we shift the LO a little further 0 - - rational_resampler_xxx - - alias - - - - comment - Output samplerate: 48k - - - affinity - - - - decim - int((samp_rate_rx/xlating_decimation)) - - - _enabled - 1 - - - fbw - 0 - - - _coordinate - (864, 76) - - - _rotation - 0 - - - id - rational_resampler_xxx_0 - - - interp - audio_samp_rate - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - taps - - - - type - ccc - - - - rational_resampler_xxx - - alias - - - - comment - Output samplerate: 48k - - - affinity - - - - decim - int((samp_rate_rx/xlating_decimation)/lpf_decimation) - - - _enabled - 1 - - - fbw - 0 - - - _coordinate - (1088, 580) - - - _rotation - 180 - - - id - rational_resampler_xxx_0_0 - - - interp - audio_samp_rate - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - taps - - - - type - ccc - - parameter @@ -2935,6 +2913,10 @@ we shift the LO a little further short_id + + hide + none + type eng_float @@ -2978,6 +2960,10 @@ we shift the LO a little further short_id + + hide + none + type intx @@ -3021,6 +3007,10 @@ we shift the LO a little further short_id + + hide + none + type eng_float @@ -3064,6 +3054,10 @@ we shift the LO a little further short_id + + hide + none + type string @@ -3093,7 +3087,7 @@ we shift the LO a little further _coordinate - (280, 304) + (446, 239) _rotation @@ -3113,7 +3107,7 @@ we shift the LO a little further sampling_rate - samp_rate_rx + samp_rate_rx / xlating_decimation target_freq @@ -3124,7 +3118,7 @@ we shift the LO a little further satnogs_cw_to_symbol threshold - 0.75 + 0.8 alias @@ -3168,64 +3162,13 @@ we shift the LO a little further sampling_rate - samp_rate_rx/xlating_decimation/lpf_decimation/4 + audio_samp_rate/4 wpm wpm - - satnogs_doppler_correction_cc - - alias - - - - comment - - - - affinity - - - - corrections_per_sec - 1000 - - - _enabled - 0 - - - _coordinate - (288, 192) - - - _rotation - 0 - - - id - satnogs_doppler_correction_cc_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - sampling_rate - samp_rate_rx - - - target_freq - rx_freq - - satnogs_frame_file_sink @@ -3593,6 +3536,10 @@ we shift the LO a little further short_id + + hide + none + type string @@ -3636,6 +3583,10 @@ we shift the LO a little further short_id + + hide + none + type intx @@ -3679,6 +3630,10 @@ we shift the LO a little further short_id + + hide + none + type string @@ -3722,6 +3677,10 @@ we shift the LO a little further short_id + + hide + none + type intx @@ -3737,6 +3696,12 @@ we shift the LO a little further 0 1 + + analog_agc_xx_0 + low_pass_filter_0_0 + 0 + 0 + analog_pll_carriertracking_cc_0 blocks_complex_to_mag_squared_0 @@ -3751,7 +3716,7 @@ we shift the LO a little further blocks_complex_to_mag_squared_0 - blocks_moving_average_xx_0 + analog_agc_xx_0 0 0 @@ -3761,27 +3726,15 @@ we shift the LO a little further 0 0 - - blocks_moving_average_xx_0 - low_pass_filter_0_0 - 0 - 0 - blocks_multiply_xx_0 - rational_resampler_xxx_0_0 + blocks_complex_to_real_0 0 0 freq_xlating_fir_filter_xxx_0 - low_pass_filter_0 - 0 - 0 - - - freq_xlating_fir_filter_xxx_0 - rational_resampler_xxx_0 + satnogs_coarse_doppler_correction_cc_0 0 0 @@ -3805,31 +3758,31 @@ we shift the LO a little further osmosdr_source_0 - satnogs_coarse_doppler_correction_cc_0 + freq_xlating_fir_filter_xxx_0 0 0 - rational_resampler_xxx_0 + pfb_arb_resampler_xxx_0 + low_pass_filter_0 + 0 + 0 + + + pfb_arb_resampler_xxx_0 satnogs_iq_sink_0 0 0 - rational_resampler_xxx_0 + pfb_arb_resampler_xxx_0 satnogs_waterfall_sink_0 0 0 - - rational_resampler_xxx_0_0 - blocks_complex_to_real_0 - 0 - 0 - satnogs_coarse_doppler_correction_cc_0 - freq_xlating_fir_filter_xxx_0 + pfb_arb_resampler_xxx_0 0 0 @@ -3839,12 +3792,6 @@ we shift the LO a little further out in - - satnogs_doppler_correction_cc_0 - freq_xlating_fir_filter_xxx_0 - 0 - 0 - satnogs_morse_decoder_0 satnogs_frame_file_sink_0_0 @@ -3863,10 +3810,4 @@ we shift the LO a little further freq freq - - satnogs_tcp_rigctl_msg_source_0 - satnogs_doppler_correction_cc_0 - freq - freq - diff --git a/apps/flowgraphs/satnogs_cw_decoder.py b/apps/flowgraphs/satnogs_cw_decoder.py index fc411d4..9961814 100755 --- a/apps/flowgraphs/satnogs_cw_decoder.py +++ b/apps/flowgraphs/satnogs_cw_decoder.py @@ -5,10 +5,9 @@ # Title: CW Decoder # Author: Manolis Surligas (surligas@gmail.com) # Description: A CW (Morse) Decoder -# Generated: Tue May 15 22:58:51 2018 +# Generated: Mon May 21 18:50:09 2018 ################################################## - from gnuradio import analog from gnuradio import blocks from gnuradio import eng_notation @@ -16,6 +15,7 @@ from gnuradio import filter from gnuradio import gr from gnuradio.eng_option import eng_option from gnuradio.filter import firdes +from gnuradio.filter import pfb from optparse import OptionParser import math import osmosdr @@ -58,7 +58,6 @@ class satnogs_cw_decoder(gr.top_block): self.samp_rate_rx = samp_rate_rx = satnogs.hw_rx_settings[rx_sdr_device]['samp_rate'] self.xlating_decimation = xlating_decimation = int(samp_rate_rx/100e3) self.xlate_filter_taps = xlate_filter_taps = firdes.low_pass(1, samp_rate_rx, 125000, 25000, firdes.WIN_HAMMING, 6.76) - self.lpf_decimation = lpf_decimation = 5 self.audio_samp_rate = audio_samp_rate = 48000 ################################################## @@ -71,20 +70,14 @@ class satnogs_cw_decoder(gr.top_block): self.satnogs_morse_decoder_0 = satnogs.morse_decoder(ord('#'), 3) self.satnogs_iq_sink_0 = satnogs.iq_sink(16768, iq_file_path, False, enable_iq_dump) self.satnogs_frame_file_sink_0_0 = satnogs.frame_file_sink(decoded_data_file_path, 0) - self.satnogs_cw_to_symbol_0 = satnogs.cw_to_symbol(samp_rate_rx/xlating_decimation/lpf_decimation/4, 0.75, 0.75, wpm) - self.satnogs_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, samp_rate_rx) - self.rational_resampler_xxx_0_0 = filter.rational_resampler_ccc( - interpolation=audio_samp_rate, - decimation=int((samp_rate_rx/xlating_decimation)/lpf_decimation), - taps=None, - fractional_bw=None, - ) - self.rational_resampler_xxx_0 = filter.rational_resampler_ccc( - interpolation=audio_samp_rate, - decimation=int((samp_rate_rx/xlating_decimation)), - taps=None, - fractional_bw=None, - ) + self.satnogs_cw_to_symbol_0 = satnogs.cw_to_symbol(audio_samp_rate/4, 0.8, 0.75, wpm) + self.satnogs_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, samp_rate_rx / xlating_decimation) + self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf( + (audio_samp_rate) / (samp_rate_rx / xlating_decimation), + taps=None, + flt_size=32) + self.pfb_arb_resampler_xxx_0.declare_sample_delay(0) + self.osmosdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + satnogs.handle_rx_dev_args(rx_sdr_device, dev_args) ) self.osmosdr_source_0.set_sample_rate(samp_rate_rx) self.osmosdr_source_0.set_center_freq(rx_freq - lo_offset, 0) @@ -99,19 +92,22 @@ class satnogs_cw_decoder(gr.top_block): self.osmosdr_source_0.set_bandwidth(samp_rate_rx, 0) self.low_pass_filter_0_0 = filter.fir_filter_fff(4, firdes.low_pass( - 4, samp_rate_rx/xlating_decimation/lpf_decimation, 100, 100, firdes.WIN_HAMMING, 6.76)) - self.low_pass_filter_0 = filter.fir_filter_ccf(lpf_decimation, firdes.low_pass( - lpf_decimation, samp_rate_rx/xlating_decimation, 2e3, 1e3, firdes.WIN_HAMMING, 6.76)) + 4, audio_samp_rate, 100, 100, firdes.WIN_HAMMING, 6.76)) + self.low_pass_filter_0 = filter.fir_filter_ccf(1, firdes.low_pass( + 1, audio_samp_rate, 2e3, 1e3, firdes.WIN_HAMMING, 6.76)) self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(xlating_decimation, (xlate_filter_taps), lo_offset, samp_rate_rx) self.blocks_multiply_xx_0 = blocks.multiply_vcc(1) - self.blocks_moving_average_xx_0 = blocks.moving_average_ff(300, 1, 4000) self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.blocks_complex_to_mag_squared_0 = blocks.complex_to_mag_squared(1) self.analog_sig_source_x_0 = analog.sig_source_c(audio_samp_rate, analog.GR_COS_WAVE, bfo_freq, 1, 0) - self.analog_pll_carriertracking_cc_0 = analog.pll_carriertracking_cc(2*math.pi/100, 2*math.pi*2e3/(samp_rate_rx/xlating_decimation/lpf_decimation), -2*math.pi*2e3/(samp_rate_rx/xlating_decimation/lpf_decimation)) + self.analog_pll_carriertracking_cc_0 = analog.pll_carriertracking_cc(2*math.pi/100, 2*math.pi*2e3/audio_samp_rate, -2*math.pi*2e3/audio_samp_rate) + self.analog_agc_xx_0 = analog.agc_ff(1e-4, 1.0, 1.0) + self.analog_agc_xx_0.set_max_gain(65536) self.analog_agc2_xx_0_0 = analog.agc2_cc(0.01, 0.001, 0.015, 0.0) self.analog_agc2_xx_0_0.set_max_gain(65536) + + ################################################## # Connections ################################################## @@ -120,22 +116,21 @@ class satnogs_cw_decoder(gr.top_block): self.msg_connect((self.satnogs_morse_decoder_0, 'out'), (self.satnogs_udp_msg_sink_0_0, 'in')) self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_coarse_doppler_correction_cc_0, 'freq')) self.connect((self.analog_agc2_xx_0_0, 0), (self.blocks_multiply_xx_0, 1)) + self.connect((self.analog_agc_xx_0, 0), (self.low_pass_filter_0_0, 0)) self.connect((self.analog_pll_carriertracking_cc_0, 0), (self.blocks_complex_to_mag_squared_0, 0)) self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0, 0)) - self.connect((self.blocks_complex_to_mag_squared_0, 0), (self.blocks_moving_average_xx_0, 0)) + self.connect((self.blocks_complex_to_mag_squared_0, 0), (self.analog_agc_xx_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.satnogs_ogg_encoder_0, 0)) - self.connect((self.blocks_moving_average_xx_0, 0), (self.low_pass_filter_0_0, 0)) - self.connect((self.blocks_multiply_xx_0, 0), (self.rational_resampler_xxx_0_0, 0)) - self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.low_pass_filter_0, 0)) - self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.rational_resampler_xxx_0, 0)) + self.connect((self.blocks_multiply_xx_0, 0), (self.blocks_complex_to_real_0, 0)) + self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.analog_agc2_xx_0_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.analog_pll_carriertracking_cc_0, 0)) self.connect((self.low_pass_filter_0_0, 0), (self.satnogs_cw_to_symbol_0, 0)) - self.connect((self.osmosdr_source_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0)) - self.connect((self.rational_resampler_xxx_0, 0), (self.satnogs_iq_sink_0, 0)) - self.connect((self.rational_resampler_xxx_0, 0), (self.satnogs_waterfall_sink_0, 0)) - self.connect((self.rational_resampler_xxx_0_0, 0), (self.blocks_complex_to_real_0, 0)) - self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) + self.connect((self.osmosdr_source_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) + self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.low_pass_filter_0, 0)) + self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.satnogs_iq_sink_0, 0)) + self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.satnogs_waterfall_sink_0, 0)) + self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.pfb_arb_resampler_xxx_0, 0)) def get_antenna(self): return self.antenna @@ -279,22 +274,16 @@ class satnogs_cw_decoder(gr.top_block): self.samp_rate_rx = samp_rate_rx self.set_xlating_decimation(int(self.samp_rate_rx/100e3)) self.set_xlate_filter_taps(firdes.low_pass(1, self.samp_rate_rx, 125000, 25000, firdes.WIN_HAMMING, 6.76)) + self.pfb_arb_resampler_xxx_0.set_rate((self.audio_samp_rate) / (self.samp_rate_rx / self.xlating_decimation)) self.osmosdr_source_0.set_sample_rate(self.samp_rate_rx) self.osmosdr_source_0.set_bandwidth(self.samp_rate_rx, 0) - self.low_pass_filter_0_0.set_taps(firdes.low_pass(4, self.samp_rate_rx/self.xlating_decimation/self.lpf_decimation, 100, 100, firdes.WIN_HAMMING, 6.76)) - self.low_pass_filter_0.set_taps(firdes.low_pass(self.lpf_decimation, self.samp_rate_rx/self.xlating_decimation, 2e3, 1e3, firdes.WIN_HAMMING, 6.76)) - self.analog_pll_carriertracking_cc_0.set_max_freq(2*math.pi*2e3/(self.samp_rate_rx/self.xlating_decimation/self.lpf_decimation)) - self.analog_pll_carriertracking_cc_0.set_min_freq(-2*math.pi*2e3/(self.samp_rate_rx/self.xlating_decimation/self.lpf_decimation)) def get_xlating_decimation(self): return self.xlating_decimation def set_xlating_decimation(self, xlating_decimation): self.xlating_decimation = xlating_decimation - self.low_pass_filter_0_0.set_taps(firdes.low_pass(4, self.samp_rate_rx/self.xlating_decimation/self.lpf_decimation, 100, 100, firdes.WIN_HAMMING, 6.76)) - self.low_pass_filter_0.set_taps(firdes.low_pass(self.lpf_decimation, self.samp_rate_rx/self.xlating_decimation, 2e3, 1e3, firdes.WIN_HAMMING, 6.76)) - self.analog_pll_carriertracking_cc_0.set_max_freq(2*math.pi*2e3/(self.samp_rate_rx/self.xlating_decimation/self.lpf_decimation)) - self.analog_pll_carriertracking_cc_0.set_min_freq(-2*math.pi*2e3/(self.samp_rate_rx/self.xlating_decimation/self.lpf_decimation)) + self.pfb_arb_resampler_xxx_0.set_rate((self.audio_samp_rate) / (self.samp_rate_rx / self.xlating_decimation)) def get_xlate_filter_taps(self): return self.xlate_filter_taps @@ -303,22 +292,17 @@ class satnogs_cw_decoder(gr.top_block): self.xlate_filter_taps = xlate_filter_taps self.freq_xlating_fir_filter_xxx_0.set_taps((self.xlate_filter_taps)) - def get_lpf_decimation(self): - return self.lpf_decimation - - def set_lpf_decimation(self, lpf_decimation): - self.lpf_decimation = lpf_decimation - self.low_pass_filter_0_0.set_taps(firdes.low_pass(4, self.samp_rate_rx/self.xlating_decimation/self.lpf_decimation, 100, 100, firdes.WIN_HAMMING, 6.76)) - self.low_pass_filter_0.set_taps(firdes.low_pass(self.lpf_decimation, self.samp_rate_rx/self.xlating_decimation, 2e3, 1e3, firdes.WIN_HAMMING, 6.76)) - self.analog_pll_carriertracking_cc_0.set_max_freq(2*math.pi*2e3/(self.samp_rate_rx/self.xlating_decimation/self.lpf_decimation)) - self.analog_pll_carriertracking_cc_0.set_min_freq(-2*math.pi*2e3/(self.samp_rate_rx/self.xlating_decimation/self.lpf_decimation)) - def get_audio_samp_rate(self): return self.audio_samp_rate def set_audio_samp_rate(self, audio_samp_rate): self.audio_samp_rate = audio_samp_rate + self.pfb_arb_resampler_xxx_0.set_rate((self.audio_samp_rate) / (self.samp_rate_rx / self.xlating_decimation)) + self.low_pass_filter_0_0.set_taps(firdes.low_pass(4, self.audio_samp_rate, 100, 100, firdes.WIN_HAMMING, 6.76)) + self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.audio_samp_rate, 2e3, 1e3, firdes.WIN_HAMMING, 6.76)) self.analog_sig_source_x_0.set_sampling_freq(self.audio_samp_rate) + self.analog_pll_carriertracking_cc_0.set_max_freq(2*math.pi*2e3/self.audio_samp_rate) + self.analog_pll_carriertracking_cc_0.set_min_freq(-2*math.pi*2e3/self.audio_samp_rate) def argument_parser(): From 5d326014e4f909821510f5bd25df2bf7ea9d2fd4 Mon Sep 17 00:00:00 2001 From: Manolis Surligas Date: Mon, 21 May 2018 21:30:59 +0300 Subject: [PATCH 04/10] Bump up version --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cbdf2d4..814019b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,7 @@ list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules) # Set the version information here set(VERSION_INFO_MAJOR_VERSION 1) set(VERSION_INFO_API_COMPAT 3) -set(VERSION_INFO_MINOR_VERSION 0) +set(VERSION_INFO_MINOR_VERSION 1) set(VERSION_INFO_MAINT_VERSION git) ######################################################################## From 6b1e3d38e2e08ddb23f5255155dcbc3fe0dd9303 Mon Sep 17 00:00:00 2001 From: Manolis Surligas Date: Mon, 4 Jun 2018 11:46:52 +0300 Subject: [PATCH 05/10] Tune CW parameters * Set the loop bandwith of the PLL to a lower value, to get rid off the DC leakage and improve SNR * Set the AGC update rate to a higher value * Decrease the CW decoding threshold --- apps/flowgraphs/cw_decoder.grc | 6 +++--- apps/flowgraphs/satnogs_cw_decoder.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/flowgraphs/cw_decoder.grc b/apps/flowgraphs/cw_decoder.grc index bbbaf24..7f72635 100644 --- a/apps/flowgraphs/cw_decoder.grc +++ b/apps/flowgraphs/cw_decoder.grc @@ -309,7 +309,7 @@ TX sampling rate rate - 1e-4 + 1e-3 reference @@ -352,7 +352,7 @@ TX sampling rate w - 2*math.pi/100 + 2*math.pi/400.0 max_freq @@ -3118,7 +3118,7 @@ we shift the LO a little further satnogs_cw_to_symbol threshold - 0.8 + 0.4 alias diff --git a/apps/flowgraphs/satnogs_cw_decoder.py b/apps/flowgraphs/satnogs_cw_decoder.py index 9961814..2fba76c 100755 --- a/apps/flowgraphs/satnogs_cw_decoder.py +++ b/apps/flowgraphs/satnogs_cw_decoder.py @@ -5,7 +5,7 @@ # Title: CW Decoder # Author: Manolis Surligas (surligas@gmail.com) # Description: A CW (Morse) Decoder -# Generated: Mon May 21 18:50:09 2018 +# Generated: Mon Jun 4 11:44:20 2018 ################################################## from gnuradio import analog @@ -70,7 +70,7 @@ class satnogs_cw_decoder(gr.top_block): self.satnogs_morse_decoder_0 = satnogs.morse_decoder(ord('#'), 3) self.satnogs_iq_sink_0 = satnogs.iq_sink(16768, iq_file_path, False, enable_iq_dump) self.satnogs_frame_file_sink_0_0 = satnogs.frame_file_sink(decoded_data_file_path, 0) - self.satnogs_cw_to_symbol_0 = satnogs.cw_to_symbol(audio_samp_rate/4, 0.8, 0.75, wpm) + self.satnogs_cw_to_symbol_0 = satnogs.cw_to_symbol(audio_samp_rate/4, 0.4, 0.75, wpm) self.satnogs_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, samp_rate_rx / xlating_decimation) self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf( (audio_samp_rate) / (samp_rate_rx / xlating_decimation), @@ -100,8 +100,8 @@ class satnogs_cw_decoder(gr.top_block): self.blocks_complex_to_real_0 = blocks.complex_to_real(1) self.blocks_complex_to_mag_squared_0 = blocks.complex_to_mag_squared(1) self.analog_sig_source_x_0 = analog.sig_source_c(audio_samp_rate, analog.GR_COS_WAVE, bfo_freq, 1, 0) - self.analog_pll_carriertracking_cc_0 = analog.pll_carriertracking_cc(2*math.pi/100, 2*math.pi*2e3/audio_samp_rate, -2*math.pi*2e3/audio_samp_rate) - self.analog_agc_xx_0 = analog.agc_ff(1e-4, 1.0, 1.0) + self.analog_pll_carriertracking_cc_0 = analog.pll_carriertracking_cc(2*math.pi/400.0, 2*math.pi*2e3/audio_samp_rate, -2*math.pi*2e3/audio_samp_rate) + self.analog_agc_xx_0 = analog.agc_ff(1e-3, 1.0, 1.0) self.analog_agc_xx_0.set_max_gain(65536) self.analog_agc2_xx_0_0 = analog.agc2_cc(0.01, 0.001, 0.015, 0.0) self.analog_agc2_xx_0_0.set_max_gain(65536) From 07eb575437d1aaceded17bd05389cc8ed6379e98 Mon Sep 17 00:00:00 2001 From: Alexander Jenke Date: Mon, 2 Jul 2018 10:51:35 +0000 Subject: [PATCH 06/10] Fix 1/0 correlation between sync_a pattern and sample history in noaa_apt_sink_impl.cc --- lib/noaa_apt_sink_impl.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/noaa_apt_sink_impl.cc b/lib/noaa_apt_sink_impl.cc index 86cdb98..830a6f2 100644 --- a/lib/noaa_apt_sink_impl.cc +++ b/lib/noaa_apt_sink_impl.cc @@ -175,7 +175,7 @@ namespace gr sample = sample - f_average; // Very basic 1/0 correlation between pattern constan and history - if((sample > 0 && synca_seq[i]) || (sample < 0 && !syncb_seq[i])) { + if((sample > 0 && synca_seq[i]) || (sample < 0 && !synca_seq[i])) { count_a += 1; } if((sample > 0 && syncb_seq[i]) || (sample < 0 && !syncb_seq[i])) { From e831d8150292e6e24062d9d88089d92aa447ba2b Mon Sep 17 00:00:00 2001 From: Patrick Dohmen Date: Wed, 4 Jul 2018 10:18:43 +0200 Subject: [PATCH 07/10] Fix NOAA APT waterfall bandwidth The flowgraph for decoding NOAA APT images generates a waterfall with a bandwidth depending on the default samplerate of the SDR hardware. USRPB200 defaults to 500 ksps, which produces an output of 125 ksps after the "first_stage_decimation" which is fixed to a value of 4. Changing the hardware to an "rtlsdr" also changes the default samplerate to 1 Msps which results in a waterfall bandwidth of 250 kHz (+- 125 kHz). Connecting the waterfall sink behind the FFT Filter, which has a decimation set to match an output samplerate of 125 kHz, seems to be correct! This produces waterfalls with a bandwidth of 125 kHz (+- 62,5 kHz). Fixes issue #128 --- .../satellites/noaa_apt_decoder.grc | 102 +++++++++--------- .../satellites/satnogs_noaa_apt_decoder.py | 7 +- 2 files changed, 53 insertions(+), 56 deletions(-) diff --git a/apps/flowgraphs/satellites/noaa_apt_decoder.grc b/apps/flowgraphs/satellites/noaa_apt_decoder.grc index 0dded8c..f89f833 100644 --- a/apps/flowgraphs/satellites/noaa_apt_decoder.grc +++ b/apps/flowgraphs/satellites/noaa_apt_decoder.grc @@ -94,7 +94,7 @@ the quadrature demodulation _coordinate - (927, 459) + (904, 492) _rotation @@ -124,7 +124,7 @@ in acceptable levels especially for embedded devices. _coordinate - (1306, 460) + (1272, 492) _rotation @@ -159,7 +159,7 @@ in acceptable levels especially for embedded devices. _coordinate - (16, 689) + (168, 564) _rotation @@ -199,7 +199,7 @@ the quadrature demodulation _coordinate - (1118, 459) + (1088, 492) _rotation @@ -234,7 +234,7 @@ the quadrature demodulation _coordinate - (15, 551) + (8, 564) _rotation @@ -274,7 +274,7 @@ TX sampling rate _coordinate - (791, 459) + (784, 492) _rotation @@ -313,7 +313,7 @@ TX sampling rate _coordinate - (935, 123) + (696, 164) _rotation @@ -352,7 +352,7 @@ TX sampling rate _coordinate - (494, 634) + (1200, 628) _rotation @@ -411,7 +411,7 @@ TX sampling rate _coordinate - (1174, 83) + (912, 116) _rotation @@ -474,7 +474,7 @@ TX sampling rate _coordinate - (414, 634) + (1120, 628) _rotation @@ -521,7 +521,7 @@ TX sampling rate _coordinate - (1040, 360) + (880, 392) _rotation @@ -560,7 +560,7 @@ TX sampling rate _coordinate - (183, 547) + (576, 628) _rotation @@ -603,7 +603,7 @@ TX sampling rate _coordinate - (183, 634) + (880, 628) _rotation @@ -646,7 +646,7 @@ TX sampling rate _coordinate - (15, 459) + (8, 476) _rotation @@ -689,7 +689,7 @@ TX sampling rate _coordinate - (184, 796) + (464, 628) _rotation @@ -740,7 +740,7 @@ TX sampling rate _coordinate - (710, 171) + (496, 164) _rotation @@ -791,7 +791,7 @@ TX sampling rate _coordinate - (183, 714) + (344, 628) _rotation @@ -842,7 +842,7 @@ TX sampling rate _coordinate - (1422, 123) + (1096, 164) _rotation @@ -889,7 +889,7 @@ TX sampling rate _coordinate - (312, 716) + (1360, 628) _rotation @@ -944,7 +944,7 @@ TX sampling rate _coordinate - (295, 295) + (248, 324) _rotation @@ -999,7 +999,7 @@ TX sampling rate _coordinate - (1264, 356) + (1040, 388) _rotation @@ -1042,7 +1042,7 @@ TX sampling rate _coordinate - (343, 634) + (1040, 628) _rotation @@ -1085,7 +1085,7 @@ TX sampling rate _coordinate - (296, 796) + (1448, 628) _rotation @@ -1129,7 +1129,7 @@ we shift the LO a little further _coordinate - (575, 459) + (568, 476) _rotation @@ -2460,7 +2460,7 @@ we shift the LO a little further _coordinate - (31, 223) + (8, 244) _rotation @@ -2579,7 +2579,7 @@ we shift the LO a little further _coordinate - (487, 459) + (480, 476) _rotation @@ -2634,7 +2634,7 @@ we shift the LO a little further _coordinate - (1438, 239) + (1184, 364) _rotation @@ -2693,7 +2693,7 @@ we shift the LO a little further _coordinate - (824, 336) + (696, 364) _rotation @@ -2752,7 +2752,7 @@ we shift the LO a little further _coordinate - (1172, 0) + (912, 20) _rotation @@ -2811,7 +2811,7 @@ we shift the LO a little further _coordinate - (936, 232) + (696, 268) _rotation @@ -2858,7 +2858,7 @@ we shift the LO a little further _coordinate - (271, 634) + (960, 628) _rotation @@ -2901,7 +2901,7 @@ we shift the LO a little further _coordinate - (295, 459) + (288, 476) _rotation @@ -2944,7 +2944,7 @@ we shift the LO a little further _coordinate - (391, 459) + (384, 476) _rotation @@ -2987,7 +2987,7 @@ we shift the LO a little further _coordinate - (175, 459) + (168, 476) _rotation @@ -3034,7 +3034,7 @@ we shift the LO a little further _coordinate - (464, 176) + (272, 168) _rotation @@ -3089,7 +3089,7 @@ we shift the LO a little further _coordinate - (1176, 236) + (880, 276) _rotation @@ -3132,7 +3132,7 @@ we shift the LO a little further _coordinate - (520, 320) + (472, 356) _rotation @@ -3154,10 +3154,6 @@ we shift the LO a little further width 2080 - - split - False - sync bool(sync) @@ -3187,7 +3183,7 @@ we shift the LO a little further _coordinate - (1420, 3) + (1096, 28) _rotation @@ -3226,7 +3222,7 @@ we shift the LO a little further _coordinate - (223, 47) + (8, 132) _rotation @@ -3297,7 +3293,7 @@ we shift the LO a little further _coordinate - (712, 0) + (696, 20) _rotation @@ -3317,7 +3313,7 @@ we shift the LO a little further samp_rate - samp_rate_rx /first_stage_decimation + samp_rate_rx/ ( first_stage_decimation * int(samp_rate_rx/ first_stage_decimation / initial_bandwidth)) @@ -3336,7 +3332,7 @@ we shift the LO a little further _coordinate - (400, 716) + (1280, 628) _rotation @@ -3379,7 +3375,7 @@ we shift the LO a little further _coordinate - (335, 546) + (736, 628) _rotation @@ -3442,6 +3438,12 @@ we shift the LO a little further 0 0 + + fft_filter_xxx_0 + satnogs_waterfall_sink_0 + 0 + 0 + fir_filter_xxx_1 rational_resampler_xxx_0 @@ -3496,12 +3498,6 @@ we shift the LO a little further 0 0 - - satnogs_coarse_doppler_correction_cc_0 - satnogs_waterfall_sink_0 - 0 - 0 - satnogs_tcp_rigctl_msg_source_0 satnogs_coarse_doppler_correction_cc_0 diff --git a/apps/flowgraphs/satellites/satnogs_noaa_apt_decoder.py b/apps/flowgraphs/satellites/satnogs_noaa_apt_decoder.py index 5b8a81b..71dd2c4 100755 --- a/apps/flowgraphs/satellites/satnogs_noaa_apt_decoder.py +++ b/apps/flowgraphs/satellites/satnogs_noaa_apt_decoder.py @@ -5,9 +5,10 @@ # Title: NOAA APT Decoder # Author: Manolis Surligas, George Vardakis # Description: A NOAA APT Decoder with automatic image synchronization -# Generated: Sat Feb 24 00:15:33 2018 +# Generated: Wed Jul 4 10:18:17 2018 ################################################## + from gnuradio import analog from gnuradio import blocks from gnuradio import eng_notation @@ -65,7 +66,7 @@ class satnogs_noaa_apt_decoder(gr.top_block): ################################################## # Blocks ################################################## - self.satnogs_waterfall_sink_0 = satnogs.waterfall_sink(samp_rate_rx /first_stage_decimation, 0.0, 8, 1024, waterfall_file_path, 0) + self.satnogs_waterfall_sink_0 = satnogs.waterfall_sink(samp_rate_rx/ ( first_stage_decimation * int(samp_rate_rx/ first_stage_decimation / initial_bandwidth)), 0.0, 8, 1024, waterfall_file_path, 0) self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source("127.0.0.1", rigctl_port, False, 1000/doppler_correction_per_sec, 1500) self.satnogs_ogg_encoder_0 = satnogs.ogg_encoder(file_path, 48000, 0.8) self.satnogs_noaa_apt_sink_0 = satnogs.noaa_apt_sink(decoded_data_file_path, 2080, 1800, bool(sync), bool(flip_images)) @@ -132,6 +133,7 @@ class satnogs_noaa_apt_decoder(gr.top_block): self.connect((self.blocks_complex_to_mag_0, 0), (self.rational_resampler_xxx_0_0, 0)) self.connect((self.fft_filter_xxx_0, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.fft_filter_xxx_0, 0), (self.rational_resampler_xxx_2, 0)) + self.connect((self.fft_filter_xxx_0, 0), (self.satnogs_waterfall_sink_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.rational_resampler_xxx_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0)) self.connect((self.hilbert_fc_0, 0), (self.blocks_complex_to_mag_0, 0)) @@ -141,7 +143,6 @@ class satnogs_noaa_apt_decoder(gr.top_block): self.connect((self.rational_resampler_xxx_1, 0), (self.satnogs_ogg_encoder_0, 0)) self.connect((self.rational_resampler_xxx_2, 0), (self.satnogs_iq_sink_0, 0)) self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.fft_filter_xxx_0, 0)) - self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.satnogs_waterfall_sink_0, 0)) def get_antenna(self): return self.antenna From 0064bc835d80e2bb017e502be7033e093e699152 Mon Sep 17 00:00:00 2001 From: Patrick Dohmen Date: Wed, 4 Jul 2018 12:08:26 +0200 Subject: [PATCH 08/10] Connect waterfall sink in front of filter Connecting the waterfall sink behind the FFT Filter causes the waterfall to show only the filtered APT signal. Fixing this needs an additional resampler. --- .../satellites/noaa_apt_decoder.grc | 79 +++++++++++++++++-- .../satellites/satnogs_noaa_apt_decoder.py | 11 ++- 2 files changed, 81 insertions(+), 9 deletions(-) diff --git a/apps/flowgraphs/satellites/noaa_apt_decoder.grc b/apps/flowgraphs/satellites/noaa_apt_decoder.grc index f89f833..8546f6e 100644 --- a/apps/flowgraphs/satellites/noaa_apt_decoder.grc +++ b/apps/flowgraphs/satellites/noaa_apt_decoder.grc @@ -2842,6 +2842,65 @@ we shift the LO a little further ccc + + rational_resampler_xxx + + alias + + + + comment + + + + affinity + + + + decim + int(samp_rate_rx /first_stage_decimation) + + + _enabled + True + + + fbw + 0 + + + _coordinate + (504, 44) + + + _rotation + 0 + + + id + rational_resampler_xxx_2_0 + + + interp + int(samp_rate_rx/ ( first_stage_decimation * int(samp_rate_rx/ first_stage_decimation / initial_bandwidth))) + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + taps + + + + type + ccc + + parameter @@ -3293,7 +3352,7 @@ we shift the LO a little further _coordinate - (696, 20) + (696, 28) _rotation @@ -3438,12 +3497,6 @@ we shift the LO a little further 0 0 - - fft_filter_xxx_0 - satnogs_waterfall_sink_0 - 0 - 0 - fir_filter_xxx_1 rational_resampler_xxx_0 @@ -3492,12 +3545,24 @@ we shift the LO a little further 0 0 + + rational_resampler_xxx_2_0 + satnogs_waterfall_sink_0 + 0 + 0 + satnogs_coarse_doppler_correction_cc_0 fft_filter_xxx_0 0 0 + + satnogs_coarse_doppler_correction_cc_0 + rational_resampler_xxx_2_0 + 0 + 0 + satnogs_tcp_rigctl_msg_source_0 satnogs_coarse_doppler_correction_cc_0 diff --git a/apps/flowgraphs/satellites/satnogs_noaa_apt_decoder.py b/apps/flowgraphs/satellites/satnogs_noaa_apt_decoder.py index 71dd2c4..9e43123 100755 --- a/apps/flowgraphs/satellites/satnogs_noaa_apt_decoder.py +++ b/apps/flowgraphs/satellites/satnogs_noaa_apt_decoder.py @@ -5,7 +5,7 @@ # Title: NOAA APT Decoder # Author: Manolis Surligas, George Vardakis # Description: A NOAA APT Decoder with automatic image synchronization -# Generated: Wed Jul 4 10:18:17 2018 +# Generated: Wed Jul 4 12:13:02 2018 ################################################## @@ -72,6 +72,12 @@ class satnogs_noaa_apt_decoder(gr.top_block): self.satnogs_noaa_apt_sink_0 = satnogs.noaa_apt_sink(decoded_data_file_path, 2080, 1800, bool(sync), bool(flip_images)) self.satnogs_iq_sink_0 = satnogs.iq_sink(32767, iq_file_path, False, enable_iq_dump) self.satnogs_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, samp_rate_rx /first_stage_decimation) + self.rational_resampler_xxx_2_0 = filter.rational_resampler_ccc( + interpolation=int(samp_rate_rx/ ( first_stage_decimation * int(samp_rate_rx/ first_stage_decimation / initial_bandwidth))), + decimation=int(samp_rate_rx /first_stage_decimation), + taps=None, + fractional_bw=None, + ) self.rational_resampler_xxx_2 = filter.rational_resampler_ccc( interpolation=48000, decimation=int(samp_rate_rx/ ( first_stage_decimation * int(samp_rate_rx/ first_stage_decimation / initial_bandwidth)) / audio_decimation), @@ -133,7 +139,6 @@ class satnogs_noaa_apt_decoder(gr.top_block): self.connect((self.blocks_complex_to_mag_0, 0), (self.rational_resampler_xxx_0_0, 0)) self.connect((self.fft_filter_xxx_0, 0), (self.analog_wfm_rcv_0, 0)) self.connect((self.fft_filter_xxx_0, 0), (self.rational_resampler_xxx_2, 0)) - self.connect((self.fft_filter_xxx_0, 0), (self.satnogs_waterfall_sink_0, 0)) self.connect((self.fir_filter_xxx_1, 0), (self.rational_resampler_xxx_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0)) self.connect((self.hilbert_fc_0, 0), (self.blocks_complex_to_mag_0, 0)) @@ -142,7 +147,9 @@ class satnogs_noaa_apt_decoder(gr.top_block): self.connect((self.rational_resampler_xxx_0_0, 0), (self.satnogs_noaa_apt_sink_0, 0)) self.connect((self.rational_resampler_xxx_1, 0), (self.satnogs_ogg_encoder_0, 0)) self.connect((self.rational_resampler_xxx_2, 0), (self.satnogs_iq_sink_0, 0)) + self.connect((self.rational_resampler_xxx_2_0, 0), (self.satnogs_waterfall_sink_0, 0)) self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.fft_filter_xxx_0, 0)) + self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.rational_resampler_xxx_2_0, 0)) def get_antenna(self): return self.antenna From 5605c4ef3c2ee4cf3607e914c04b582ed64d45e4 Mon Sep 17 00:00:00 2001 From: LongHairedHacker Date: Wed, 18 Jul 2018 00:24:23 +0200 Subject: [PATCH 09/10] Fixed slating issues caused by NaN samples --- lib/noaa_apt_sink_impl.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/noaa_apt_sink_impl.cc b/lib/noaa_apt_sink_impl.cc index 830a6f2..a86a483 100644 --- a/lib/noaa_apt_sink_impl.cc +++ b/lib/noaa_apt_sink_impl.cc @@ -138,6 +138,11 @@ namespace gr } void noaa_apt_sink_impl::set_pixel (size_t x, size_t y, float sample) { + // We can encounter NaN here since skip_to read the history whithout checking + if(std::isnan(sample)) { + sample = 0.0; + } + // Adjust dynamic range, using minimum and maximum values sample = (sample - f_min_level) / (f_max_level - f_min_level) * 255; // Set the pixel in the full image @@ -216,6 +221,11 @@ namespace gr // Get the current sample float sample = in[i]; + // For some reason the first sample on a Raspberry Pi can be NaN + if(std::isnan(sample)) { + continue; + } + // Update min and max level to adjust dynamic range in set pixel f_max_level = std::fmax(f_max_level, sample); f_min_level = std::fmin(f_min_level, sample); From 5cbe3cc751f6378033d1b2759dedfbf126ebdae1 Mon Sep 17 00:00:00 2001 From: Manolis Surligas Date: Wed, 18 Jul 2018 13:39:00 +0300 Subject: [PATCH 10/10] Add contributors list and update versioning scheme --- CONTRIBUTORS.md | 18 ++++++++++++++++++ README.md | 17 +++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 CONTRIBUTORS.md diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 0000000..beb4c82 --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,18 @@ +# Maintainers +* Manolis Surligas (surligas@gmail.com) +* Pierros Papadeas (pierros@papadeas.gr) +* Goerge Vardakis (vardakis@csd.uoc.gr) + +# Package Mainteners +* Vasilis Tsiligiannis (acinonyx@openwrt.gr) + +# Contributors +* Corey Shields (cshields@gmail.com) +* LongHairedHacker(sebastian@sebastians-site.de) +* Nikos Karamolegkos (nkaramolegos@csd.uoc.g) +* Mark Jessop (vk5qi@rfhead.net) +* Fabian P. Schmidt (kerel-fs@gmx.de) +* Thanos Gkiolias (agiolias@csd.uoc.gr) +* DL4PD (dl4pd@darc.de) +* Kostis Triantayllakis (ctriant@csd.uoc.gr) +* Alexander Jenke \ No newline at end of file diff --git a/README.md b/README.md index 6eef832..8c42c03 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,23 @@ will install the libraries at the `/usr/lib64` directory. ## Website For more indormation about SatNOGS please visit our [site](https://satnogs.org/). +## Release Policy +The `gr-satnogs` OOT module uses the `major.api-compatibility.minor` +versioning scheme. +is used by the [satnogs-client](https://gitlab.com/librespacefoundation/satnogs/satnogs-client), so the release and versioning policy is based on how the +satnogs client is affected by the changes on the `gr-satnogs` software. + +* Minor changes, bug fixes or improvements that do not affect in anyway +the `satnogs-client` advance the `minor` version. +* The `api-compatibility` indicates changes that require modifications on `satnogs-client` but do not brake the backwards compatibility (e.g a new satallite decoder). In other words, +the `satnogs-client` should continue to operate normally without any modifications. +Changes on `satnogs-client` should be performed only to integrate the new features. +* `major` version advances when the changes break backwards compatibility with +the `satnogs-client`. + +For every release change a tag with the corresponding version is created. +Releases can be retrieved by the [tags](https://gitlab.com/librespacefoundation/satnogs/gr-satnogs/tags) page. + ## License © 2016,2017,2018 [Libre Space Foundation](http://librespacefoundation.org).