diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt
index da2c642..318d7ea 100644
--- a/apps/CMakeLists.txt
+++ b/apps/CMakeLists.txt
@@ -23,5 +23,6 @@ GR_PYTHON_INSTALL(
PROGRAMS
flowgraphs/upsat_transceiver_cli.py
flowgraphs/satnogs_fm_demod.py
+ flowgraphs/satnogs_generic_iq_receiver.py
DESTINATION bin
)
diff --git a/apps/flowgraphs/fm_demod.grc b/apps/flowgraphs/fm_demod.grc
index a5a4d96..64f1ccd 100644
--- a/apps/flowgraphs/fm_demod.grc
+++ b/apps/flowgraphs/fm_demod.grc
@@ -38,7 +38,7 @@
generate_options
- qt_gui
+ no_gui
hier_block_src_path
@@ -66,7 +66,7 @@
run_options
- prompt
+ run
run
@@ -554,6 +554,49 @@ TX sampling rate
audio_samp_rate
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (64, 860)
+
+
+ _rotation
+ 0
+
+
+ id
+ doppler_correction_per_sec
+
+
+ label
+
+
+
+ short_id
+
+
+
+ type
+ intx
+
+
+ value
+ 1000
+
+
parameter
@@ -2485,7 +2528,50 @@ we shift the LO a little further
_coordinate
- (64, 724)
+ (64, 780)
+
+
+ _rotation
+ 0
+
+
+ id
+ rigctl_port
+
+
+ label
+
+
+
+ short_id
+
+
+
+ type
+ intx
+
+
+ value
+ 4532
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (64, 700)
_rotation
@@ -2571,7 +2657,7 @@ we shift the LO a little further
corrections_per_sec
- 1000
+ doppler_correction_per_sec
_enabled
@@ -2642,7 +2728,7 @@ we shift the LO a little further
port
- 4532
+ rigctl_port
mtu
diff --git a/apps/flowgraphs/generic_iq_receiver.grc b/apps/flowgraphs/generic_iq_receiver.grc
new file mode 100644
index 0000000..ed25c2a
--- /dev/null
+++ b/apps/flowgraphs/generic_iq_receiver.grc
@@ -0,0 +1,2631 @@
+
+
+
+ Thu May 5 00:22:45 2016
+
+ options
+
+ author
+ Manolis Surligas (surligas@gmail.com)
+
+
+ window_size
+
+
+
+ category
+ Custom
+
+
+ comment
+
+
+
+ description
+ A generic FM demodulation block
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (8, 8)
+
+
+ _rotation
+ 0
+
+
+ generate_options
+ no_gui
+
+
+ hier_block_src_path
+ .:
+
+
+ id
+ satnogs_generic_iq_receiver
+
+
+ max_nouts
+ 0
+
+
+ qt_qss_theme
+
+
+
+ realtime_scheduling
+
+
+
+ run_command
+ {python} -u {filename}
+
+
+ run_options
+ run
+
+
+ run
+ True
+
+
+ thread_safe_setters
+
+
+
+ title
+ Generic IQ samples receiver
+
+
+
+ variable
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (568, 508)
+
+
+ _rotation
+ 0
+
+
+ id
+ audio_decimation
+
+
+ value
+ 2
+
+
+
+ variable
+
+ comment
+ Decimation factor
+for the RX after the
+SDR received samples
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (336, 612)
+
+
+ _rotation
+ 0
+
+
+ id
+ audio_gain
+
+
+ value
+ satnogs.fm_demod_settings[rx_sdr_device]['audio_gain']
+
+
+
+ variable
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (568, 580)
+
+
+ _rotation
+ 0
+
+
+ id
+ audio_samp_rate
+
+
+ value
+ 44100
+
+
+
+ variable
+
+ comment
+ Decimation factor
+for the RX after the
+SDR received samples
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (192, 612)
+
+
+ _rotation
+ 0
+
+
+ id
+ decimation_rx
+
+
+ value
+ satnogs.fm_demod_settings[rx_sdr_device]['decimation_rx']
+
+
+
+ variable
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (432, 476)
+
+
+ _rotation
+ 0
+
+
+ id
+ quadrature_rate
+
+
+ value
+ samp_rate_rx / decimation_rx
+
+
+
+ variable
+
+ comment
+ SDR device
+TX sampling rate
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (192, 484)
+
+
+ _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
+ (560, 648)
+
+
+ _rotation
+ 0
+
+
+ gain
+ 12.0
+
+
+ id
+ taps
+
+
+ samp_rate
+ samp_rate_rx
+
+
+ width
+ 60000
+
+
+ win
+ firdes.WIN_HAMMING
+
+
+
+ analog_sig_source_x
+
+ amp
+ 1
+
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ 0
+
+
+ freq
+ -lo_offset
+
+
+ _coordinate
+ (312, 24)
+
+
+ _rotation
+ 0
+
+
+ id
+ analog_sig_source_x_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ offset
+ 0
+
+
+ type
+ complex
+
+
+ samp_rate
+ samp_rate_rx
+
+
+ waveform
+ analog.GR_COS_WAVE
+
+
+
+ blocks_file_sink
+
+ append
+ False
+
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ file
+ file_path
+
+
+ _coordinate
+ (784, 284)
+
+
+ _rotation
+ 0
+
+
+ id
+ blocks_file_sink_0
+
+
+ type
+ complex
+
+
+ unbuffered
+ True
+
+
+ vlen
+ 1
+
+
+
+ blocks_multiply_xx
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ 0
+
+
+ _coordinate
+ (568, 64)
+
+
+ _rotation
+ 0
+
+
+ id
+ blocks_multiply_xx_0
+
+
+ type
+ complex
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ num_inputs
+ 2
+
+
+ vlen
+ 1
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (64, 860)
+
+
+ _rotation
+ 0
+
+
+ id
+ doppler_correction_per_sec
+
+
+ label
+
+
+
+ short_id
+
+
+
+ type
+ intx
+
+
+ value
+ 1000
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (64, 620)
+
+
+ _rotation
+ 0
+
+
+ id
+ file_path
+
+
+ label
+
+
+
+ short_id
+
+
+
+ type
+ string
+
+
+ value
+ test.wav
+
+
+
+ freq_xlating_fir_filter_xxx
+
+ alias
+
+
+
+ center_freq
+ lo_offset
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ decim
+ decimation_rx
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (520, 280)
+
+
+ _rotation
+ 0
+
+
+ id
+ freq_xlating_fir_filter_xxx_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ samp_rate
+ samp_rate_rx
+
+
+ taps
+ taps
+
+
+ type
+ ccc
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+ To avoid the SDR carrier at the DC
+we shift the LO a little further
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (328, 476)
+
+
+ _rotation
+ 0
+
+
+ id
+ lo_offset
+
+
+ label
+
+
+
+ short_id
+
+
+
+ type
+ eng_float
+
+
+ value
+ 100e3
+
+
+
+ osmosdr_source
+
+ alias
+
+
+
+ ant0
+ satnogs.hw_rx_settings[rx_sdr_device]['antenna']
+
+
+ bb_gain0
+ satnogs.hw_rx_settings[rx_sdr_device]['bb_gain']
+
+
+ bw0
+ samp_rate_rx
+
+
+ dc_offset_mode0
+ 0
+
+
+ corr0
+ 0
+
+
+ freq0
+ rx_freq - lo_offset
+
+
+ gain_mode0
+ False
+
+
+ if_gain0
+ satnogs.hw_rx_settings[rx_sdr_device]['if_gain']
+
+
+ iq_balance_mode0
+ 0
+
+
+ gain0
+ satnogs.hw_rx_settings[rx_sdr_device]['rf_gain']
+
+
+ ant10
+
+
+
+ bb_gain10
+ 20
+
+
+ bw10
+ 0
+
+
+ dc_offset_mode10
+ 0
+
+
+ corr10
+ 0
+
+
+ freq10
+ 100e6
+
+
+ gain_mode10
+ False
+
+
+ if_gain10
+ 20
+
+
+ iq_balance_mode10
+ 0
+
+
+ gain10
+ 10
+
+
+ ant11
+
+
+
+ bb_gain11
+ 20
+
+
+ bw11
+ 0
+
+
+ dc_offset_mode11
+ 0
+
+
+ corr11
+ 0
+
+
+ freq11
+ 100e6
+
+
+ gain_mode11
+ False
+
+
+ if_gain11
+ 20
+
+
+ iq_balance_mode11
+ 0
+
+
+ gain11
+ 10
+
+
+ ant12
+
+
+
+ bb_gain12
+ 20
+
+
+ bw12
+ 0
+
+
+ dc_offset_mode12
+ 0
+
+
+ corr12
+ 0
+
+
+ freq12
+ 100e6
+
+
+ gain_mode12
+ False
+
+
+ if_gain12
+ 20
+
+
+ iq_balance_mode12
+ 0
+
+
+ gain12
+ 10
+
+
+ ant13
+
+
+
+ bb_gain13
+ 20
+
+
+ bw13
+ 0
+
+
+ dc_offset_mode13
+ 0
+
+
+ corr13
+ 0
+
+
+ freq13
+ 100e6
+
+
+ gain_mode13
+ False
+
+
+ if_gain13
+ 20
+
+
+ iq_balance_mode13
+ 0
+
+
+ gain13
+ 10
+
+
+ ant14
+
+
+
+ bb_gain14
+ 20
+
+
+ bw14
+ 0
+
+
+ dc_offset_mode14
+ 0
+
+
+ corr14
+ 0
+
+
+ freq14
+ 100e6
+
+
+ gain_mode14
+ False
+
+
+ if_gain14
+ 20
+
+
+ iq_balance_mode14
+ 0
+
+
+ gain14
+ 10
+
+
+ ant15
+
+
+
+ bb_gain15
+ 20
+
+
+ bw15
+ 0
+
+
+ dc_offset_mode15
+ 0
+
+
+ corr15
+ 0
+
+
+ freq15
+ 100e6
+
+
+ gain_mode15
+ False
+
+
+ if_gain15
+ 20
+
+
+ iq_balance_mode15
+ 0
+
+
+ gain15
+ 10
+
+
+ ant16
+
+
+
+ bb_gain16
+ 20
+
+
+ bw16
+ 0
+
+
+ dc_offset_mode16
+ 0
+
+
+ corr16
+ 0
+
+
+ freq16
+ 100e6
+
+
+ gain_mode16
+ False
+
+
+ if_gain16
+ 20
+
+
+ iq_balance_mode16
+ 0
+
+
+ gain16
+ 10
+
+
+ ant17
+
+
+
+ bb_gain17
+ 20
+
+
+ bw17
+ 0
+
+
+ dc_offset_mode17
+ 0
+
+
+ corr17
+ 0
+
+
+ freq17
+ 100e6
+
+
+ gain_mode17
+ False
+
+
+ if_gain17
+ 20
+
+
+ iq_balance_mode17
+ 0
+
+
+ gain17
+ 10
+
+
+ ant18
+
+
+
+ bb_gain18
+ 20
+
+
+ bw18
+ 0
+
+
+ dc_offset_mode18
+ 0
+
+
+ corr18
+ 0
+
+
+ freq18
+ 100e6
+
+
+ gain_mode18
+ False
+
+
+ if_gain18
+ 20
+
+
+ iq_balance_mode18
+ 0
+
+
+ gain18
+ 10
+
+
+ ant19
+
+
+
+ bb_gain19
+ 20
+
+
+ bw19
+ 0
+
+
+ dc_offset_mode19
+ 0
+
+
+ corr19
+ 0
+
+
+ freq19
+ 100e6
+
+
+ gain_mode19
+ False
+
+
+ if_gain19
+ 20
+
+
+ iq_balance_mode19
+ 0
+
+
+ gain19
+ 10
+
+
+ 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
+
+
+ ant20
+
+
+
+ bb_gain20
+ 20
+
+
+ bw20
+ 0
+
+
+ dc_offset_mode20
+ 0
+
+
+ corr20
+ 0
+
+
+ freq20
+ 100e6
+
+
+ gain_mode20
+ False
+
+
+ if_gain20
+ 20
+
+
+ iq_balance_mode20
+ 0
+
+
+ gain20
+ 10
+
+
+ ant21
+
+
+
+ bb_gain21
+ 20
+
+
+ bw21
+ 0
+
+
+ dc_offset_mode21
+ 0
+
+
+ corr21
+ 0
+
+
+ freq21
+ 100e6
+
+
+ gain_mode21
+ False
+
+
+ if_gain21
+ 20
+
+
+ iq_balance_mode21
+ 0
+
+
+ gain21
+ 10
+
+
+ ant22
+
+
+
+ bb_gain22
+ 20
+
+
+ bw22
+ 0
+
+
+ dc_offset_mode22
+ 0
+
+
+ corr22
+ 0
+
+
+ freq22
+ 100e6
+
+
+ gain_mode22
+ False
+
+
+ if_gain22
+ 20
+
+
+ iq_balance_mode22
+ 0
+
+
+ gain22
+ 10
+
+
+ ant23
+
+
+
+ bb_gain23
+ 20
+
+
+ bw23
+ 0
+
+
+ dc_offset_mode23
+ 0
+
+
+ corr23
+ 0
+
+
+ freq23
+ 100e6
+
+
+ gain_mode23
+ False
+
+
+ if_gain23
+ 20
+
+
+ iq_balance_mode23
+ 0
+
+
+ gain23
+ 10
+
+
+ ant24
+
+
+
+ bb_gain24
+ 20
+
+
+ bw24
+ 0
+
+
+ dc_offset_mode24
+ 0
+
+
+ corr24
+ 0
+
+
+ freq24
+ 100e6
+
+
+ gain_mode24
+ False
+
+
+ if_gain24
+ 20
+
+
+ iq_balance_mode24
+ 0
+
+
+ gain24
+ 10
+
+
+ ant25
+
+
+
+ bb_gain25
+ 20
+
+
+ bw25
+ 0
+
+
+ dc_offset_mode25
+ 0
+
+
+ corr25
+ 0
+
+
+ freq25
+ 100e6
+
+
+ gain_mode25
+ False
+
+
+ if_gain25
+ 20
+
+
+ iq_balance_mode25
+ 0
+
+
+ gain25
+ 10
+
+
+ ant26
+
+
+
+ bb_gain26
+ 20
+
+
+ bw26
+ 0
+
+
+ dc_offset_mode26
+ 0
+
+
+ corr26
+ 0
+
+
+ freq26
+ 100e6
+
+
+ gain_mode26
+ False
+
+
+ if_gain26
+ 20
+
+
+ iq_balance_mode26
+ 0
+
+
+ gain26
+ 10
+
+
+ ant27
+
+
+
+ bb_gain27
+ 20
+
+
+ bw27
+ 0
+
+
+ dc_offset_mode27
+ 0
+
+
+ corr27
+ 0
+
+
+ freq27
+ 100e6
+
+
+ gain_mode27
+ False
+
+
+ if_gain27
+ 20
+
+
+ iq_balance_mode27
+ 0
+
+
+ gain27
+ 10
+
+
+ ant28
+
+
+
+ bb_gain28
+ 20
+
+
+ bw28
+ 0
+
+
+ dc_offset_mode28
+ 0
+
+
+ corr28
+ 0
+
+
+ freq28
+ 100e6
+
+
+ gain_mode28
+ False
+
+
+ if_gain28
+ 20
+
+
+ iq_balance_mode28
+ 0
+
+
+ gain28
+ 10
+
+
+ ant29
+
+
+
+ bb_gain29
+ 20
+
+
+ bw29
+ 0
+
+
+ dc_offset_mode29
+ 0
+
+
+ corr29
+ 0
+
+
+ freq29
+ 100e6
+
+
+ gain_mode29
+ False
+
+
+ if_gain29
+ 20
+
+
+ iq_balance_mode29
+ 0
+
+
+ gain29
+ 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
+
+
+ ant30
+
+
+
+ bb_gain30
+ 20
+
+
+ bw30
+ 0
+
+
+ dc_offset_mode30
+ 0
+
+
+ corr30
+ 0
+
+
+ freq30
+ 100e6
+
+
+ gain_mode30
+ False
+
+
+ if_gain30
+ 20
+
+
+ iq_balance_mode30
+ 0
+
+
+ gain30
+ 10
+
+
+ ant31
+
+
+
+ bb_gain31
+ 20
+
+
+ bw31
+ 0
+
+
+ dc_offset_mode31
+ 0
+
+
+ corr31
+ 0
+
+
+ freq31
+ 100e6
+
+
+ gain_mode31
+ False
+
+
+ if_gain31
+ 20
+
+
+ iq_balance_mode31
+ 0
+
+
+ gain31
+ 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
+
+
+ ant5
+
+
+
+ bb_gain5
+ 20
+
+
+ bw5
+ 0
+
+
+ dc_offset_mode5
+ 0
+
+
+ corr5
+ 0
+
+
+ freq5
+ 100e6
+
+
+ gain_mode5
+ False
+
+
+ if_gain5
+ 20
+
+
+ iq_balance_mode5
+ 0
+
+
+ gain5
+ 10
+
+
+ ant6
+
+
+
+ bb_gain6
+ 20
+
+
+ bw6
+ 0
+
+
+ dc_offset_mode6
+ 0
+
+
+ corr6
+ 0
+
+
+ freq6
+ 100e6
+
+
+ gain_mode6
+ False
+
+
+ if_gain6
+ 20
+
+
+ iq_balance_mode6
+ 0
+
+
+ gain6
+ 10
+
+
+ ant7
+
+
+
+ bb_gain7
+ 20
+
+
+ bw7
+ 0
+
+
+ dc_offset_mode7
+ 0
+
+
+ corr7
+ 0
+
+
+ freq7
+ 100e6
+
+
+ gain_mode7
+ False
+
+
+ if_gain7
+ 20
+
+
+ iq_balance_mode7
+ 0
+
+
+ gain7
+ 10
+
+
+ ant8
+
+
+
+ bb_gain8
+ 20
+
+
+ bw8
+ 0
+
+
+ dc_offset_mode8
+ 0
+
+
+ corr8
+ 0
+
+
+ freq8
+ 100e6
+
+
+ gain_mode8
+ False
+
+
+ if_gain8
+ 20
+
+
+ iq_balance_mode8
+ 0
+
+
+ gain8
+ 10
+
+
+ ant9
+
+
+
+ bb_gain9
+ 20
+
+
+ bw9
+ 0
+
+
+ dc_offset_mode9
+ 0
+
+
+ corr9
+ 0
+
+
+ freq9
+ 100e6
+
+
+ gain_mode9
+ False
+
+
+ if_gain9
+ 20
+
+
+ iq_balance_mode9
+ 0
+
+
+ gain9
+ 10
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ args
+ satnogs.hw_rx_settings[rx_sdr_device]['dev_arg']
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (24, 256)
+
+
+ _rotation
+ 0
+
+
+ id
+ osmosdr_source_0
+
+
+ maxoutbuf
+ 0
+
+
+ clock_source0
+
+
+
+ time_source0
+
+
+
+ clock_source1
+
+
+
+ time_source1
+
+
+
+ clock_source2
+
+
+
+ time_source2
+
+
+
+ clock_source3
+
+
+
+ time_source3
+
+
+
+ clock_source4
+
+
+
+ time_source4
+
+
+
+ clock_source5
+
+
+
+ time_source5
+
+
+
+ clock_source6
+
+
+
+ time_source6
+
+
+
+ clock_source7
+
+
+
+ time_source7
+
+
+
+ minoutbuf
+ 0
+
+
+ nchan
+ 1
+
+
+ num_mboards
+ 1
+
+
+ type
+ fc32
+
+
+ sample_rate
+ samp_rate_rx
+
+
+ sync
+
+
+
+
+ qtgui_freq_sink_x
+
+ autoscale
+ False
+
+
+ average
+ 1.0
+
+
+ axislabels
+ True
+
+
+ bw
+ samp_rate_rx
+
+
+ alias
+
+
+
+ fc
+ 0
+
+
+ comment
+
+
+
+ ctrlpanel
+ True
+
+
+ affinity
+
+
+
+ _enabled
+ 0
+
+
+ fftsize
+ 1024
+
+
+ _coordinate
+ (792, 28)
+
+
+ gui_hint
+
+
+
+ _rotation
+ 0
+
+
+ grid
+ True
+
+
+ id
+ qtgui_freq_sink_x_0
+
+
+ legend
+ True
+
+
+ alpha1
+ 1.0
+
+
+ color1
+ "blue"
+
+
+ label1
+
+
+
+ width1
+ 1
+
+
+ alpha10
+ 1.0
+
+
+ color10
+ "dark blue"
+
+
+ label10
+
+
+
+ width10
+ 1
+
+
+ alpha2
+ 1.0
+
+
+ color2
+ "red"
+
+
+ label2
+
+
+
+ width2
+ 1
+
+
+ alpha3
+ 1.0
+
+
+ color3
+ "green"
+
+
+ label3
+
+
+
+ width3
+ 1
+
+
+ alpha4
+ 1.0
+
+
+ color4
+ "black"
+
+
+ label4
+
+
+
+ width4
+ 1
+
+
+ alpha5
+ 1.0
+
+
+ color5
+ "cyan"
+
+
+ label5
+
+
+
+ width5
+ 1
+
+
+ alpha6
+ 1.0
+
+
+ color6
+ "magenta"
+
+
+ label6
+
+
+
+ width6
+ 1
+
+
+ alpha7
+ 1.0
+
+
+ color7
+ "yellow"
+
+
+ label7
+
+
+
+ width7
+ 1
+
+
+ alpha8
+ 1.0
+
+
+ color8
+ "dark red"
+
+
+ label8
+
+
+
+ width8
+ 1
+
+
+ alpha9
+ 1.0
+
+
+ color9
+ "dark green"
+
+
+ label9
+
+
+
+ width9
+ 1
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ name
+ ""
+
+
+ nconnections
+ 1
+
+
+ showports
+ True
+
+
+ freqhalf
+ True
+
+
+ tr_chan
+ 0
+
+
+ tr_level
+ 0.0
+
+
+ tr_mode
+ qtgui.TRIG_MODE_FREE
+
+
+ tr_tag
+ ""
+
+
+ type
+ complex
+
+
+ update_time
+ 0.01
+
+
+ wintype
+ firdes.WIN_BLACKMAN_hARRIS
+
+
+ label
+ Relative Gain
+
+
+ ymax
+ 10
+
+
+ ymin
+ -140
+
+
+ units
+ dB
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (64, 780)
+
+
+ _rotation
+ 0
+
+
+ id
+ rigctl_port
+
+
+ label
+
+
+
+ short_id
+
+
+
+ type
+ intx
+
+
+ value
+ 4532
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (64, 700)
+
+
+ _rotation
+ 0
+
+
+ id
+ rx_freq
+
+
+ label
+
+
+
+ short_id
+
+
+
+ type
+ eng_float
+
+
+ value
+ 100e6
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (64, 484)
+
+
+ _rotation
+ 0
+
+
+ id
+ rx_sdr_device
+
+
+ label
+
+
+
+ short_id
+
+
+
+ type
+ string
+
+
+ value
+ usrpb200
+
+
+
+ satnogs_doppler_correction_cc
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ corrections_per_sec
+ doppler_correction_per_sec
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (304, 256)
+
+
+ _rotation
+ 0
+
+
+ id
+ satnogs_doppler_correction_cc_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ sampling_rate
+ samp_rate_rx
+
+
+ target_freq
+ rx_freq
+
+
+
+ satnogs_tcp_rigctl_msg_source
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (24, 164)
+
+
+ _rotation
+ 0
+
+
+ id
+ satnogs_tcp_rigctl_msg_source_0
+
+
+ addr
+ "127.0.0.1"
+
+
+ port
+ rigctl_port
+
+
+ mtu
+ 1500
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+
+ analog_sig_source_x_0
+ blocks_multiply_xx_0
+ 0
+ 0
+
+
+ blocks_multiply_xx_0
+ qtgui_freq_sink_x_0
+ 0
+ 0
+
+
+ freq_xlating_fir_filter_xxx_0
+ blocks_file_sink_0
+ 0
+ 0
+
+
+ osmosdr_source_0
+ blocks_multiply_xx_0
+ 0
+ 1
+
+
+ osmosdr_source_0
+ satnogs_doppler_correction_cc_0
+ 0
+ 0
+
+
+ satnogs_doppler_correction_cc_0
+ freq_xlating_fir_filter_xxx_0
+ 0
+ 0
+
+
+ satnogs_tcp_rigctl_msg_source_0
+ satnogs_doppler_correction_cc_0
+ freq
+ freq
+
+
diff --git a/apps/flowgraphs/satnogs_fm_demod.py b/apps/flowgraphs/satnogs_fm_demod.py
index 3eccf05..be266ed 100755
--- a/apps/flowgraphs/satnogs_fm_demod.py
+++ b/apps/flowgraphs/satnogs_fm_demod.py
@@ -5,20 +5,9 @@
# Title: FM Generic Demodulation
# Author: Manolis Surligas (surligas@gmail.com)
# Description: A generic FM demodulation block
-# Generated: Wed Oct 12 21:16:27 2016
+# Generated: Mon Oct 17 19:24:53 2016
##################################################
-if __name__ == '__main__':
- import ctypes
- import sys
- if sys.platform.startswith('linux'):
- try:
- x11 = ctypes.cdll.LoadLibrary('libX11.so')
- x11.XInitThreads()
- except:
- print "Warning: failed to XInitThreads()"
-
-from PyQt4 import Qt
from gnuradio import analog
from gnuradio import blocks
from gnuradio import eng_notation
@@ -30,40 +19,21 @@ from gnuradio.filter import pfb
from optparse import OptionParser
import osmosdr
import satnogs
-import sys
import time
-class satnogs_fm_demod(gr.top_block, Qt.QWidget):
+class satnogs_fm_demod(gr.top_block):
- def __init__(self, file_path="test.wav", lo_offset=100e3, rx_freq=100e6, rx_sdr_device="usrpb200"):
+ def __init__(self, doppler_correction_per_sec=1000, file_path="test.wav", lo_offset=100e3, rigctl_port=4532, rx_freq=100e6, rx_sdr_device="usrpb200"):
gr.top_block.__init__(self, "FM Generic Demodulation")
- Qt.QWidget.__init__(self)
- self.setWindowTitle("FM Generic Demodulation")
- try:
- self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
- except:
- pass
- self.top_scroll_layout = Qt.QVBoxLayout()
- self.setLayout(self.top_scroll_layout)
- self.top_scroll = Qt.QScrollArea()
- self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
- self.top_scroll_layout.addWidget(self.top_scroll)
- self.top_scroll.setWidgetResizable(True)
- self.top_widget = Qt.QWidget()
- self.top_scroll.setWidget(self.top_widget)
- self.top_layout = Qt.QVBoxLayout(self.top_widget)
- self.top_grid_layout = Qt.QGridLayout()
- self.top_layout.addLayout(self.top_grid_layout)
-
- self.settings = Qt.QSettings("GNU Radio", "satnogs_fm_demod")
- self.restoreGeometry(self.settings.value("geometry").toByteArray())
##################################################
# Parameters
##################################################
+ self.doppler_correction_per_sec = doppler_correction_per_sec
self.file_path = file_path
self.lo_offset = lo_offset
+ self.rigctl_port = rigctl_port
self.rx_freq = rx_freq
self.rx_sdr_device = rx_sdr_device
@@ -83,8 +53,8 @@ class satnogs_fm_demod(gr.top_block, Qt.QWidget):
##################################################
# Blocks
##################################################
- self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source("127.0.0.1", 4532, 1500)
- self.satnogs_doppler_correction_cc_0 = satnogs.doppler_correction_cc(rx_freq, samp_rate_rx, 1000)
+ self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source("127.0.0.1", rigctl_port, 1500)
+ self.satnogs_doppler_correction_cc_0 = satnogs.doppler_correction_cc(rx_freq, samp_rate_rx, doppler_correction_per_sec)
self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_fff(
audio_samp_rate / (quadrature_rate * 1.0 / audio_decimation),
taps=(firdes.low_pass_2(32, 32, 0.8, 0.1, 100)),
@@ -123,10 +93,11 @@ class satnogs_fm_demod(gr.top_block, Qt.QWidget):
self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.blocks_multiply_const_vxx_0, 0))
self.connect((self.satnogs_doppler_correction_cc_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0))
- def closeEvent(self, event):
- self.settings = Qt.QSettings("GNU Radio", "satnogs_fm_demod")
- self.settings.setValue("geometry", self.saveGeometry())
- event.accept()
+ 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_file_path(self):
return self.file_path
@@ -143,6 +114,12 @@ class satnogs_fm_demod(gr.top_block, Qt.QWidget):
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_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
@@ -218,12 +195,18 @@ class satnogs_fm_demod(gr.top_block, Qt.QWidget):
def argument_parser():
description = 'A generic FM demodulation block'
parser = OptionParser(usage="%prog: [options]", option_class=eng_option, description=description)
+ parser.add_option(
+ "", "--doppler-correction-per-sec", dest="doppler_correction_per_sec", type="intx", default=1000,
+ help="Set doppler_correction_per_sec [default=%default]")
parser.add_option(
"", "--file-path", dest="file_path", type="string", default="test.wav",
help="Set 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(
+ "", "--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]")
@@ -237,21 +220,9 @@ def main(top_block_cls=satnogs_fm_demod, options=None):
if options is None:
options, _ = argument_parser().parse_args()
- from distutils.version import StrictVersion
- if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
- style = gr.prefs().get_string('qtgui', 'style', 'raster')
- Qt.QApplication.setGraphicsSystem(style)
- qapp = Qt.QApplication(sys.argv)
-
- tb = top_block_cls(file_path=options.file_path, lo_offset=options.lo_offset, rx_freq=options.rx_freq, rx_sdr_device=options.rx_sdr_device)
+ tb = top_block_cls(doppler_correction_per_sec=options.doppler_correction_per_sec, file_path=options.file_path, lo_offset=options.lo_offset, rigctl_port=options.rigctl_port, rx_freq=options.rx_freq, rx_sdr_device=options.rx_sdr_device)
tb.start()
- tb.show()
-
- def quitting():
- tb.stop()
- tb.wait()
- qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
- qapp.exec_()
+ tb.wait()
if __name__ == '__main__':
diff --git a/apps/flowgraphs/satnogs_generic_iq_receiver.py b/apps/flowgraphs/satnogs_generic_iq_receiver.py
new file mode 100755
index 0000000..a9a25e0
--- /dev/null
+++ b/apps/flowgraphs/satnogs_generic_iq_receiver.py
@@ -0,0 +1,210 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+##################################################
+# GNU Radio Python Flow Graph
+# Title: Generic IQ samples receiver
+# Author: Manolis Surligas (surligas@gmail.com)
+# Description: A generic FM demodulation block
+# Generated: Mon Oct 17 19:32:33 2016
+##################################################
+
+from gnuradio import blocks
+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
+import time
+
+
+class satnogs_generic_iq_receiver(gr.top_block):
+
+ def __init__(self, doppler_correction_per_sec=1000, file_path="test.wav", lo_offset=100e3, rigctl_port=4532, rx_freq=100e6, rx_sdr_device="usrpb200"):
+ gr.top_block.__init__(self, "Generic IQ samples receiver")
+
+ ##################################################
+ # Parameters
+ ##################################################
+ self.doppler_correction_per_sec = doppler_correction_per_sec
+ self.file_path = file_path
+ self.lo_offset = lo_offset
+ self.rigctl_port = rigctl_port
+ self.rx_freq = rx_freq
+ self.rx_sdr_device = rx_sdr_device
+
+ ##################################################
+ # Variables
+ ##################################################
+ self.samp_rate_rx = samp_rate_rx = satnogs.hw_rx_settings[rx_sdr_device]['samp_rate']
+ self.decimation_rx = decimation_rx = satnogs.fm_demod_settings[rx_sdr_device]['decimation_rx']
+
+ self.taps = taps = firdes.low_pass(12.0, samp_rate_rx, 100e3, 60000, firdes.WIN_HAMMING, 6.76)
+
+ self.quadrature_rate = quadrature_rate = samp_rate_rx / decimation_rx
+ self.audio_samp_rate = audio_samp_rate = 44100
+ self.audio_gain = audio_gain = satnogs.fm_demod_settings[rx_sdr_device]['audio_gain']
+ self.audio_decimation = audio_decimation = 2
+
+ ##################################################
+ # Blocks
+ ##################################################
+ self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source("127.0.0.1", rigctl_port, 1500)
+ self.satnogs_doppler_correction_cc_0 = satnogs.doppler_correction_cc(rx_freq, samp_rate_rx, doppler_correction_per_sec)
+ self.osmosdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + satnogs.hw_rx_settings[rx_sdr_device]['dev_arg'] )
+ 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(0, 0)
+ self.osmosdr_source_0.set_dc_offset_mode(0, 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.hw_rx_settings[rx_sdr_device]['rf_gain'], 0)
+ self.osmosdr_source_0.set_if_gain(satnogs.hw_rx_settings[rx_sdr_device]['if_gain'], 0)
+ self.osmosdr_source_0.set_bb_gain(satnogs.hw_rx_settings[rx_sdr_device]['bb_gain'], 0)
+ self.osmosdr_source_0.set_antenna(satnogs.hw_rx_settings[rx_sdr_device]['antenna'], 0)
+ self.osmosdr_source_0.set_bandwidth(samp_rate_rx, 0)
+
+ self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(decimation_rx, (taps), lo_offset, samp_rate_rx)
+ self.blocks_file_sink_0 = blocks.file_sink(gr.sizeof_gr_complex*1, file_path, False)
+ self.blocks_file_sink_0.set_unbuffered(True)
+
+ ##################################################
+ # Connections
+ ##################################################
+ self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_doppler_correction_cc_0, 'freq'))
+ self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.blocks_file_sink_0, 0))
+ self.connect((self.osmosdr_source_0, 0), (self.satnogs_doppler_correction_cc_0, 0))
+ self.connect((self.satnogs_doppler_correction_cc_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0))
+
+ 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_file_path(self):
+ return self.file_path
+
+ def set_file_path(self, file_path):
+ self.file_path = file_path
+ self.blocks_file_sink_0.open(self.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_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.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.set_decimation_rx(satnogs.fm_demod_settings[self.rx_sdr_device]['decimation_rx'])
+ self.osmosdr_source_0.set_gain(satnogs.hw_rx_settings[self.rx_sdr_device]['rf_gain'], 0)
+ self.osmosdr_source_0.set_if_gain(satnogs.hw_rx_settings[self.rx_sdr_device]['if_gain'], 0)
+ self.osmosdr_source_0.set_bb_gain(satnogs.hw_rx_settings[self.rx_sdr_device]['bb_gain'], 0)
+ self.osmosdr_source_0.set_antenna(satnogs.hw_rx_settings[self.rx_sdr_device]['antenna'], 0)
+ self.set_audio_gain(satnogs.fm_demod_settings[self.rx_sdr_device]['audio_gain'])
+
+ 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_quadrature_rate(self.samp_rate_rx / self.decimation_rx)
+ self.osmosdr_source_0.set_sample_rate(self.samp_rate_rx)
+ self.osmosdr_source_0.set_bandwidth(self.samp_rate_rx, 0)
+
+ def get_decimation_rx(self):
+ return self.decimation_rx
+
+ def set_decimation_rx(self, decimation_rx):
+ self.decimation_rx = decimation_rx
+ self.set_quadrature_rate(self.samp_rate_rx / self.decimation_rx)
+
+ def get_taps(self):
+ return self.taps
+
+ def set_taps(self, taps):
+ self.taps = taps
+ self.freq_xlating_fir_filter_xxx_0.set_taps((self.taps))
+
+ def get_quadrature_rate(self):
+ return self.quadrature_rate
+
+ def set_quadrature_rate(self, quadrature_rate):
+ self.quadrature_rate = quadrature_rate
+
+ 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
+
+ def get_audio_gain(self):
+ return self.audio_gain
+
+ def set_audio_gain(self, audio_gain):
+ self.audio_gain = audio_gain
+
+ def get_audio_decimation(self):
+ return self.audio_decimation
+
+ def set_audio_decimation(self, audio_decimation):
+ self.audio_decimation = audio_decimation
+
+
+def argument_parser():
+ description = 'A generic FM demodulation block'
+ parser = OptionParser(usage="%prog: [options]", option_class=eng_option, description=description)
+ parser.add_option(
+ "", "--doppler-correction-per-sec", dest="doppler_correction_per_sec", type="intx", default=1000,
+ help="Set doppler_correction_per_sec [default=%default]")
+ parser.add_option(
+ "", "--file-path", dest="file_path", type="string", default="test.wav",
+ help="Set 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(
+ "", "--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="usrpb200",
+ help="Set rx_sdr_device [default=%default]")
+ return parser
+
+
+def main(top_block_cls=satnogs_generic_iq_receiver, options=None):
+ if options is None:
+ options, _ = argument_parser().parse_args()
+
+ tb = top_block_cls(doppler_correction_per_sec=options.doppler_correction_per_sec, file_path=options.file_path, lo_offset=options.lo_offset, rigctl_port=options.rigctl_port, rx_freq=options.rx_freq, rx_sdr_device=options.rx_sdr_device)
+ tb.start()
+ tb.wait()
+
+
+if __name__ == '__main__':
+ main()