diff --git a/CMakeLists.txt b/CMakeLists.txt index 566d626..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) ######################################################################## @@ -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/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). 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/cw_decoder.grc b/apps/flowgraphs/cw_decoder.grc index c1cb1b4..7f72635 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 @@ -214,7 +195,129 @@ 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 + + + + 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-3 + + + reference + 1.0 + + + type + float @@ -237,7 +340,7 @@ TX sampling rate _coordinate - (983, 275) + (960, 348) _rotation @@ -249,11 +352,11 @@ TX sampling rate w - 2*math.pi/100 + 2*math.pi/400.0 max_freq - 2*math.pi*2e3/(samp_rate_rx/xlating_decimation/lpf_decimation) + 2*math.pi*2e3/audio_samp_rate maxoutbuf @@ -261,13 +364,76 @@ TX sampling rate min_freq - -2*math.pi*2e3/(samp_rate_rx/xlating_decimation/lpf_decimation) + -2*math.pi*2e3/audio_samp_rate minoutbuf 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 @@ -302,6 +468,10 @@ TX sampling rate short_id + + hide + none + type string @@ -345,6 +515,10 @@ TX sampling rate short_id + + hide + none + type eng_float @@ -354,6 +528,55 @@ 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 + + + + hide + none + + + type + eng_float + + + value + 1e3 + + blocks_complex_to_mag_squared @@ -374,7 +597,7 @@ TX sampling rate _coordinate - (1374, 295) + (1168, 368) _rotation @@ -417,11 +640,11 @@ TX sampling rate _coordinate - (1070, 159) + (920, 608) _rotation - 0 + 180 id @@ -440,6 +663,57 @@ TX sampling rate 1 + + 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 @@ -474,6 +748,10 @@ TX sampling rate short_id + + hide + none + type string @@ -517,6 +795,10 @@ TX sampling rate short_id + + hide + none + type string @@ -560,6 +842,10 @@ TX sampling rate short_id + + hide + none + type intx @@ -603,6 +889,10 @@ TX sampling rate short_id + + hide + none + type intx @@ -646,6 +936,10 @@ TX sampling rate short_id + + hide + none + type string @@ -667,7 +961,7 @@ TX sampling rate comment - + Output samplerate: 500k / 5 = 100k affinity @@ -683,7 +977,7 @@ TX sampling rate _coordinate - (518, 271) + (287, 379) _rotation @@ -748,6 +1042,10 @@ TX sampling rate short_id + + hide + none + type eng_float @@ -853,6 +1151,10 @@ TX sampling rate short_id + + hide + none + type string @@ -897,6 +1199,10 @@ we shift the LO a little further short_id + + hide + none + type eng_float @@ -930,7 +1236,7 @@ we shift the LO a little further decim - lpf_decimation + 1 _enabled @@ -942,7 +1248,7 @@ we shift the LO a little further _coordinate - (765, 247) + (1268, 179) _rotation @@ -950,7 +1256,7 @@ we shift the LO a little further gain - lpf_decimation + 1 id @@ -970,7 +1276,7 @@ we shift the LO a little further samp_rate - samp_rate_rx/xlating_decimation + audio_samp_rate width @@ -993,7 +1299,7 @@ we shift the LO a little further comment - + Output samplerate: 20k / 4 = 5k affinity @@ -1013,15 +1319,15 @@ we shift the LO a little further type - fir_filter_ccf + fir_filter_fff _coordinate - (1182, 247) + (1584, 420) _rotation - 0 + 180 gain @@ -1045,7 +1351,7 @@ we shift the LO a little further samp_rate - samp_rate_rx/xlating_decimation/lpf_decimation + audio_samp_rate width @@ -2463,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 @@ -2497,6 +2866,10 @@ we shift the LO a little further short_id + + hide + none + type intx @@ -2506,65 +2879,6 @@ we shift the LO a little further 0 - - rational_resampler_xxx - - alias - - - - comment - - - - affinity - - - - decim - int((samp_rate_rx/xlating_decimation)/lpf_decimation) - - - _enabled - 1 - - - fbw - 0 - - - _coordinate - (845, 103) - - - _rotation - 0 - - - id - rational_resampler_xxx_0 - - - interp - audio_samp_rate - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - taps - - - - type - ccc - - parameter @@ -2599,6 +2913,10 @@ we shift the LO a little further short_id + + hide + none + type eng_float @@ -2642,6 +2960,10 @@ we shift the LO a little further short_id + + hide + none + type intx @@ -2685,6 +3007,10 @@ we shift the LO a little further short_id + + hide + none + type eng_float @@ -2728,6 +3054,10 @@ we shift the LO a little further short_id + + hide + none + type string @@ -2745,7 +3075,7 @@ we shift the LO a little further comment - + Output samplerate: 500k affinity @@ -2757,7 +3087,7 @@ we shift the LO a little further _coordinate - (303, 263) + (446, 239) _rotation @@ -2777,7 +3107,7 @@ we shift the LO a little further sampling_rate - samp_rate_rx + samp_rate_rx / xlating_decimation target_freq @@ -2788,7 +3118,7 @@ we shift the LO a little further satnogs_cw_to_symbol threshold - 0.25 + 0.4 alias @@ -2812,7 +3142,7 @@ we shift the LO a little further _coordinate - (1366, 391) + (1336, 460) _rotation @@ -2832,7 +3162,7 @@ we shift the LO a little further sampling_rate - samp_rate_rx/xlating_decimation/lpf_decimation/4 + audio_samp_rate/4 wpm @@ -2859,7 +3189,7 @@ we shift the LO a little further _coordinate - (903, 403) + (720, 444) _rotation @@ -2906,7 +3236,7 @@ we shift the LO a little further _coordinate - (1070, 83) + (1144, 140) _rotation @@ -2945,7 +3275,7 @@ we shift the LO a little further _coordinate - (1142, 411) + (952, 444) _rotation @@ -2996,11 +3326,11 @@ we shift the LO a little further _coordinate - (1246, 139) + (760, 588) _rotation - 0 + 180 id @@ -3071,7 +3401,7 @@ we shift the LO a little further interval - 1000 + 50 @@ -3094,7 +3424,7 @@ we shift the LO a little further _coordinate - (933, 490) + (752, 508) _rotation @@ -3149,7 +3479,7 @@ we shift the LO a little further _coordinate - (647, 23) + (1144, 12) _rotation @@ -3169,7 +3499,7 @@ we shift the LO a little further samp_rate - (samp_rate_rx/xlating_decimation) + audio_samp_rate @@ -3206,6 +3536,10 @@ we shift the LO a little further short_id + + hide + none + type string @@ -3249,6 +3583,10 @@ we shift the LO a little further short_id + + hide + none + type intx @@ -3292,6 +3630,10 @@ we shift the LO a little further short_id + + hide + none + type string @@ -3335,6 +3677,10 @@ we shift the LO a little further short_id + + hide + none + type intx @@ -3345,14 +3691,32 @@ we shift the LO a little further - analog_pll_carriertracking_cc_0 + analog_agc2_xx_0_0 + blocks_multiply_xx_0 + 0 + 1 + + + analog_agc_xx_0 low_pass_filter_0_0 0 0 + + analog_pll_carriertracking_cc_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 + analog_agc_xx_0 0 0 @@ -3363,14 +3727,20 @@ we shift the LO a little further 0 - freq_xlating_fir_filter_xxx_0 - low_pass_filter_0 + blocks_multiply_xx_0 + blocks_complex_to_real_0 0 0 freq_xlating_fir_filter_xxx_0 - satnogs_waterfall_sink_0 + satnogs_coarse_doppler_correction_cc_0 + 0 + 0 + + + low_pass_filter_0 + analog_agc2_xx_0_0 0 0 @@ -3380,39 +3750,39 @@ 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 osmosdr_source_0 - satnogs_coarse_doppler_correction_cc_0 + freq_xlating_fir_filter_xxx_0 0 0 - rational_resampler_xxx_0 - blocks_complex_to_real_0 + pfb_arb_resampler_xxx_0 + low_pass_filter_0 0 0 - rational_resampler_xxx_0 + pfb_arb_resampler_xxx_0 satnogs_iq_sink_0 0 0 + + pfb_arb_resampler_xxx_0 + satnogs_waterfall_sink_0 + 0 + 0 + satnogs_coarse_doppler_correction_cc_0 - freq_xlating_fir_filter_xxx_0 + pfb_arb_resampler_xxx_0 0 0 diff --git a/apps/flowgraphs/satellites/noaa_apt_decoder.grc b/apps/flowgraphs/satellites/noaa_apt_decoder.grc index 0dded8c..8546f6e 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 @@ -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 @@ -2858,7 +2917,7 @@ we shift the LO a little further _coordinate - (271, 634) + (960, 628) _rotation @@ -2901,7 +2960,7 @@ we shift the LO a little further _coordinate - (295, 459) + (288, 476) _rotation @@ -2944,7 +3003,7 @@ we shift the LO a little further _coordinate - (391, 459) + (384, 476) _rotation @@ -2987,7 +3046,7 @@ we shift the LO a little further _coordinate - (175, 459) + (168, 476) _rotation @@ -3034,7 +3093,7 @@ we shift the LO a little further _coordinate - (464, 176) + (272, 168) _rotation @@ -3089,7 +3148,7 @@ we shift the LO a little further _coordinate - (1176, 236) + (880, 276) _rotation @@ -3132,7 +3191,7 @@ we shift the LO a little further _coordinate - (520, 320) + (472, 356) _rotation @@ -3154,10 +3213,6 @@ we shift the LO a little further width 2080 - - split - False - sync bool(sync) @@ -3187,7 +3242,7 @@ we shift the LO a little further _coordinate - (1420, 3) + (1096, 28) _rotation @@ -3226,7 +3281,7 @@ we shift the LO a little further _coordinate - (223, 47) + (8, 132) _rotation @@ -3297,7 +3352,7 @@ we shift the LO a little further _coordinate - (712, 0) + (696, 28) _rotation @@ -3317,7 +3372,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 +3391,7 @@ we shift the LO a little further _coordinate - (400, 716) + (1280, 628) _rotation @@ -3379,7 +3434,7 @@ we shift the LO a little further _coordinate - (335, 546) + (736, 628) _rotation @@ -3490,6 +3545,12 @@ 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 @@ -3498,7 +3559,7 @@ we shift the LO a little further satnogs_coarse_doppler_correction_cc_0 - satnogs_waterfall_sink_0 + rational_resampler_xxx_2_0 0 0 diff --git a/apps/flowgraphs/satellites/satnogs_noaa_apt_decoder.py b/apps/flowgraphs/satellites/satnogs_noaa_apt_decoder.py index 5b8a81b..9e43123 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 12:13:02 2018 ################################################## + from gnuradio import analog from gnuradio import blocks from gnuradio import eng_notation @@ -65,12 +66,18 @@ 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)) 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), @@ -140,8 +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.satnogs_waterfall_sink_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 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() diff --git a/apps/flowgraphs/satnogs_cw_decoder.py b/apps/flowgraphs/satnogs_cw_decoder.py index eaf3346..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: Sun Mar 25 17:48:02 2018 +# Generated: Mon Jun 4 11:44:20 2018 ################################################## from gnuradio import analog @@ -15,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 @@ -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,29 +56,28 @@ 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 ################################################## # 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_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, samp_rate_rx) - self.rational_resampler_xxx_0 = filter.rational_resampler_ccc( - interpolation=audio_samp_rate, - decimation=int((samp_rate_rx/xlating_decimation)/lpf_decimation), - taps=None, - fractional_bw=None, - ) + 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), + 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) @@ -90,14 +91,22 @@ 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( - 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.low_pass_filter_0_0 = filter.fir_filter_fff(4, firdes.low_pass( + 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_complex_to_real_0 = blocks.complex_to_real(1) self.blocks_complex_to_mag_squared_0 = blocks.complex_to_mag_squared(1) - 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_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/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) + + ################################################## # Connections @@ -106,18 +115,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_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.analog_agc_xx_0, 0)) self.connect((self.blocks_complex_to_real_0, 0), (self.satnogs_ogg_encoder_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.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), (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.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.satnogs_coarse_doppler_correction_cc_0, 0), (self.freq_xlating_fir_filter_xxx_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.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 @@ -133,6 +146,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,23 +272,18 @@ 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.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 @@ -277,21 +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(): @@ -303,6 +314,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 +375,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() diff --git a/lib/noaa_apt_sink_impl.cc b/lib/noaa_apt_sink_impl.cc index a11001f..a86a483 100644 --- a/lib/noaa_apt_sink_impl.cc +++ b/lib/noaa_apt_sink_impl.cc @@ -180,7 +180,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])) {