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])) {