Fix METEOR flowgraph

* Set the METEOR flowgraph in non-X mode
* Reduce the stored bandwidth by a factor of 2. Captures have shown that
twice the bandwidth of the METEOR is enough for RRC and clock recovery
This commit is contained in:
Manolis Surligas 2018-01-11 02:25:23 +02:00
parent 08522517c2
commit 22cb5e1844
2 changed files with 11 additions and 450 deletions

View File

@ -38,7 +38,7 @@
</param> </param>
<param> <param>
<key>generate_options</key> <key>generate_options</key>
<value>qt_gui</value> <value>no_gui</value>
</param> </param>
<param> <param>
<key>hier_block_src_path</key> <key>hier_block_src_path</key>
@ -105,34 +105,7 @@
</param> </param>
<param> <param>
<key>value</key> <key>value</key>
<value>4*80000.0</value> <value>2*80000.0</value>
</param>
</block>
<block>
<key>variable</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(239, 75)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>samp_rate_lcm</value>
</param>
<param>
<key>value</key>
<value>satnogs.lcm(filter_rate, int(samp_rate_rx / int(samp_rate_rx/filter_rate)))</value>
</param> </param>
</block> </block>
<block> <block>
@ -2193,305 +2166,6 @@ we shift the LO a little further</value>
<value>0</value> <value>0</value>
</param> </param>
</block> </block>
<block>
<key>qtgui_freq_sink_x</key>
<param>
<key>autoscale</key>
<value>False</value>
</param>
<param>
<key>average</key>
<value>1.0</value>
</param>
<param>
<key>axislabels</key>
<value>True</value>
</param>
<param>
<key>bw</key>
<value>filter_rate</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>fc</key>
<value>0</value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>ctrlpanel</key>
<value>False</value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>fftsize</key>
<value>1024</value>
</param>
<param>
<key>_coordinate</key>
<value>(1037, 590)</value>
</param>
<param>
<key>gui_hint</key>
<value></value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>grid</key>
<value>False</value>
</param>
<param>
<key>id</key>
<value>qtgui_freq_sink_x_0</value>
</param>
<param>
<key>legend</key>
<value>True</value>
</param>
<param>
<key>alpha1</key>
<value>1.0</value>
</param>
<param>
<key>color1</key>
<value>"blue"</value>
</param>
<param>
<key>label1</key>
<value></value>
</param>
<param>
<key>width1</key>
<value>1</value>
</param>
<param>
<key>alpha10</key>
<value>1.0</value>
</param>
<param>
<key>color10</key>
<value>"dark blue"</value>
</param>
<param>
<key>label10</key>
<value></value>
</param>
<param>
<key>width10</key>
<value>1</value>
</param>
<param>
<key>alpha2</key>
<value>1.0</value>
</param>
<param>
<key>color2</key>
<value>"red"</value>
</param>
<param>
<key>label2</key>
<value></value>
</param>
<param>
<key>width2</key>
<value>1</value>
</param>
<param>
<key>alpha3</key>
<value>1.0</value>
</param>
<param>
<key>color3</key>
<value>"green"</value>
</param>
<param>
<key>label3</key>
<value></value>
</param>
<param>
<key>width3</key>
<value>1</value>
</param>
<param>
<key>alpha4</key>
<value>1.0</value>
</param>
<param>
<key>color4</key>
<value>"black"</value>
</param>
<param>
<key>label4</key>
<value></value>
</param>
<param>
<key>width4</key>
<value>1</value>
</param>
<param>
<key>alpha5</key>
<value>1.0</value>
</param>
<param>
<key>color5</key>
<value>"cyan"</value>
</param>
<param>
<key>label5</key>
<value></value>
</param>
<param>
<key>width5</key>
<value>1</value>
</param>
<param>
<key>alpha6</key>
<value>1.0</value>
</param>
<param>
<key>color6</key>
<value>"magenta"</value>
</param>
<param>
<key>label6</key>
<value></value>
</param>
<param>
<key>width6</key>
<value>1</value>
</param>
<param>
<key>alpha7</key>
<value>1.0</value>
</param>
<param>
<key>color7</key>
<value>"yellow"</value>
</param>
<param>
<key>label7</key>
<value></value>
</param>
<param>
<key>width7</key>
<value>1</value>
</param>
<param>
<key>alpha8</key>
<value>1.0</value>
</param>
<param>
<key>color8</key>
<value>"dark red"</value>
</param>
<param>
<key>label8</key>
<value></value>
</param>
<param>
<key>width8</key>
<value>1</value>
</param>
<param>
<key>alpha9</key>
<value>1.0</value>
</param>
<param>
<key>color9</key>
<value>"dark green"</value>
</param>
<param>
<key>label9</key>
<value></value>
</param>
<param>
<key>width9</key>
<value>1</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>name</key>
<value>""</value>
</param>
<param>
<key>nconnections</key>
<value>1</value>
</param>
<param>
<key>showports</key>
<value>True</value>
</param>
<param>
<key>freqhalf</key>
<value>True</value>
</param>
<param>
<key>tr_chan</key>
<value>0</value>
</param>
<param>
<key>tr_level</key>
<value>0.0</value>
</param>
<param>
<key>tr_mode</key>
<value>qtgui.TRIG_MODE_FREE</value>
</param>
<param>
<key>tr_tag</key>
<value>""</value>
</param>
<param>
<key>type</key>
<value>complex</value>
</param>
<param>
<key>update_time</key>
<value>0.10</value>
</param>
<param>
<key>wintype</key>
<value>firdes.WIN_BLACKMAN_hARRIS</value>
</param>
<param>
<key>label</key>
<value>Relative Gain</value>
</param>
<param>
<key>ymax</key>
<value>10</value>
</param>
<param>
<key>ymin</key>
<value>-140</value>
</param>
<param>
<key>units</key>
<value>dB</value>
</param>
</block>
<block> <block>
<key>parameter</key> <key>parameter</key>
<param> <param>
@ -2927,12 +2601,6 @@ we shift the LO a little further</value>
<source_key>0</source_key> <source_key>0</source_key>
<sink_key>0</sink_key> <sink_key>0</sink_key>
</connection> </connection>
<connection>
<source_block_id>pfb_arb_resampler_xxx_0</source_block_id>
<sink_block_id>qtgui_freq_sink_x_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection> <connection>
<source_block_id>pfb_arb_resampler_xxx_0</source_block_id> <source_block_id>pfb_arb_resampler_xxx_0</source_block_id>
<sink_block_id>satnogs_iq_sink_0</sink_block_id> <sink_block_id>satnogs_iq_sink_0</sink_block_id>

View File

@ -5,61 +5,25 @@
# Title: METEOR Demodulation # Title: METEOR Demodulation
# Author: Manolis Surligas (surligas@gmail.com) # Author: Manolis Surligas (surligas@gmail.com)
# Description: A METEOR weather satellite decoder # Description: A METEOR weather satellite decoder
# Generated: Mon Jan 8 19:06:02 2018 # Generated: Thu Jan 11 02:21:20 2018
################################################## ##################################################
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 eng_notation from gnuradio import eng_notation
from gnuradio import filter from gnuradio import filter
from gnuradio import gr from gnuradio import gr
from gnuradio import qtgui
from gnuradio.eng_option import eng_option from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes from gnuradio.filter import firdes
from gnuradio.filter import pfb from gnuradio.filter import pfb
from optparse import OptionParser from optparse import OptionParser
import osmosdr import osmosdr
import satnogs import satnogs
import sip
import sys
import time import time
from gnuradio import qtgui
class satnogs_meteor_decoder(gr.top_block, Qt.QWidget): class satnogs_meteor_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=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='usrpb200', waterfall_file_path='/tmp/waterfall.dat'): 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=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='usrpb200', waterfall_file_path='/tmp/waterfall.dat'):
gr.top_block.__init__(self, "METEOR Demodulation") gr.top_block.__init__(self, "METEOR Demodulation")
Qt.QWidget.__init__(self)
self.setWindowTitle("METEOR Demodulation")
qtgui.util.check_set_qss()
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_meteor_decoder")
self.restoreGeometry(self.settings.value("geometry").toByteArray())
################################################## ##################################################
# Parameters # Parameters
@ -85,9 +49,8 @@ class satnogs_meteor_decoder(gr.top_block, Qt.QWidget):
# Variables # Variables
################################################## ##################################################
self.samp_rate_rx = samp_rate_rx = satnogs.hw_rx_settings[rx_sdr_device]['samp_rate'] self.samp_rate_rx = samp_rate_rx = satnogs.hw_rx_settings[rx_sdr_device]['samp_rate']
self.filter_rate = filter_rate = 4*80000.0
self.xlate_filter_taps = xlate_filter_taps = firdes.low_pass(1, samp_rate_rx, 80000, 25000, firdes.WIN_HAMMING, 6.76) self.xlate_filter_taps = xlate_filter_taps = firdes.low_pass(1, samp_rate_rx, 80000, 25000, firdes.WIN_HAMMING, 6.76)
self.samp_rate_lcm = samp_rate_lcm = satnogs.lcm(filter_rate, int(samp_rate_rx / int(samp_rate_rx/filter_rate))) self.filter_rate = filter_rate = 2*80000.0
################################################## ##################################################
# Blocks # Blocks
@ -96,49 +59,6 @@ class satnogs_meteor_decoder(gr.top_block, Qt.QWidget):
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_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_iq_sink_0 = satnogs.iq_sink(32767, iq_file_path, False, enable_iq_dump) 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) self.satnogs_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, samp_rate_rx)
self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c(
1024, #size
firdes.WIN_BLACKMAN_hARRIS, #wintype
0, #fc
filter_rate, #bw
"", #name
1 #number of inputs
)
self.qtgui_freq_sink_x_0.set_update_time(0.10)
self.qtgui_freq_sink_x_0.set_y_axis(-140, 10)
self.qtgui_freq_sink_x_0.set_y_label('Relative Gain', 'dB')
self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "")
self.qtgui_freq_sink_x_0.enable_autoscale(False)
self.qtgui_freq_sink_x_0.enable_grid(False)
self.qtgui_freq_sink_x_0.set_fft_average(1.0)
self.qtgui_freq_sink_x_0.enable_axis_labels(True)
self.qtgui_freq_sink_x_0.enable_control_panel(False)
if not True:
self.qtgui_freq_sink_x_0.disable_legend()
if "complex" == "float" or "complex" == "msg_float":
self.qtgui_freq_sink_x_0.set_plot_pos_half(not True)
labels = ['', '', '', '', '',
'', '', '', '', '']
widths = [1, 1, 1, 1, 1,
1, 1, 1, 1, 1]
colors = ["blue", "red", "green", "black", "cyan",
"magenta", "yellow", "dark red", "dark green", "dark blue"]
alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0]
for i in xrange(1):
if len(labels[i]) == 0:
self.qtgui_freq_sink_x_0.set_line_label(i, "Data {0}".format(i))
else:
self.qtgui_freq_sink_x_0.set_line_label(i, labels[i])
self.qtgui_freq_sink_x_0.set_line_width(i, widths[i])
self.qtgui_freq_sink_x_0.set_line_color(i, colors[i])
self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i])
self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget)
self.top_layout.addWidget(self._qtgui_freq_sink_x_0_win)
self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf( self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf(
filter_rate / int(samp_rate_rx / int(samp_rate_rx/filter_rate)), filter_rate / int(samp_rate_rx / int(samp_rate_rx/filter_rate)),
taps=None, taps=None,
@ -166,16 +86,10 @@ class satnogs_meteor_decoder(gr.top_block, Qt.QWidget):
self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_coarse_doppler_correction_cc_0, 'freq')) self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_coarse_doppler_correction_cc_0, 'freq'))
self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.pfb_arb_resampler_xxx_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.pfb_arb_resampler_xxx_0, 0))
self.connect((self.osmosdr_source_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0)) self.connect((self.osmosdr_source_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0))
self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.qtgui_freq_sink_x_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_iq_sink_0, 0))
self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.satnogs_waterfall_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.freq_xlating_fir_filter_xxx_0, 0)) self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0))
def closeEvent(self, event):
self.settings = Qt.QSettings("GNU Radio", "satnogs_meteor_decoder")
self.settings.setValue("geometry", self.saveGeometry())
event.accept()
def get_antenna(self): def get_antenna(self):
return self.antenna return self.antenna
@ -292,20 +206,10 @@ class satnogs_meteor_decoder(gr.top_block, Qt.QWidget):
def set_samp_rate_rx(self, samp_rate_rx): def set_samp_rate_rx(self, samp_rate_rx):
self.samp_rate_rx = samp_rate_rx self.samp_rate_rx = samp_rate_rx
self.set_xlate_filter_taps(firdes.low_pass(1, self.samp_rate_rx, 80000, 25000, firdes.WIN_HAMMING, 6.76)) self.set_xlate_filter_taps(firdes.low_pass(1, self.samp_rate_rx, 80000, 25000, firdes.WIN_HAMMING, 6.76))
self.set_samp_rate_lcm(satnogs.lcm(self.filter_rate, int(self.samp_rate_rx / int(self.samp_rate_rx/self.filter_rate))))
self.pfb_arb_resampler_xxx_0.set_rate(self.filter_rate / int(self.samp_rate_rx / int(self.samp_rate_rx/self.filter_rate))) self.pfb_arb_resampler_xxx_0.set_rate(self.filter_rate / int(self.samp_rate_rx / int(self.samp_rate_rx/self.filter_rate)))
self.osmosdr_source_0.set_sample_rate(self.samp_rate_rx) self.osmosdr_source_0.set_sample_rate(self.samp_rate_rx)
self.osmosdr_source_0.set_bandwidth(self.samp_rate_rx, 0) self.osmosdr_source_0.set_bandwidth(self.samp_rate_rx, 0)
def get_filter_rate(self):
return self.filter_rate
def set_filter_rate(self, filter_rate):
self.filter_rate = filter_rate
self.set_samp_rate_lcm(satnogs.lcm(self.filter_rate, int(self.samp_rate_rx / int(self.samp_rate_rx/self.filter_rate))))
self.qtgui_freq_sink_x_0.set_frequency_range(0, self.filter_rate)
self.pfb_arb_resampler_xxx_0.set_rate(self.filter_rate / int(self.samp_rate_rx / int(self.samp_rate_rx/self.filter_rate)))
def get_xlate_filter_taps(self): def get_xlate_filter_taps(self):
return self.xlate_filter_taps return self.xlate_filter_taps
@ -313,11 +217,12 @@ class satnogs_meteor_decoder(gr.top_block, Qt.QWidget):
self.xlate_filter_taps = xlate_filter_taps self.xlate_filter_taps = xlate_filter_taps
self.freq_xlating_fir_filter_xxx_0.set_taps((self.xlate_filter_taps)) self.freq_xlating_fir_filter_xxx_0.set_taps((self.xlate_filter_taps))
def get_samp_rate_lcm(self): def get_filter_rate(self):
return self.samp_rate_lcm return self.filter_rate
def set_samp_rate_lcm(self, samp_rate_lcm): def set_filter_rate(self, filter_rate):
self.samp_rate_lcm = samp_rate_lcm self.filter_rate = filter_rate
self.pfb_arb_resampler_xxx_0.set_rate(self.filter_rate / int(self.samp_rate_rx / int(self.samp_rate_rx/self.filter_rate)))
def argument_parser(): def argument_parser():
@ -378,21 +283,9 @@ def main(top_block_cls=satnogs_meteor_decoder, options=None):
if options is None: if options is None:
options, _ = argument_parser().parse_args() 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(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, waterfall_file_path=options.waterfall_file_path) 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, waterfall_file_path=options.waterfall_file_path)
tb.start() tb.start()
tb.show() tb.wait()
def quitting():
tb.stop()
tb.wait()
qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
qapp.exec_()
if __name__ == '__main__': if __name__ == '__main__':