mirror of
https://github.com/brmlab/osmo-tetra.git
synced 2025-06-08 09:54:09 +02:00
works with rtl sdr and gnuradio 3.8
This commit is contained in:
parent
1d569bbd62
commit
0aef6eb648
2 changed files with 17 additions and 72 deletions
|
@ -94,7 +94,7 @@ class cqpsk_mod(gr.hier_block2):
|
||||||
raise TypeError, ("sbp must be an integer >= 2, is %d" % samples_per_symbol)
|
raise TypeError, ("sbp must be an integer >= 2, is %d" % samples_per_symbol)
|
||||||
|
|
||||||
ntaps = 11 * samples_per_symbol
|
ntaps = 11 * samples_per_symbol
|
||||||
|
|
||||||
arity = 8
|
arity = 8
|
||||||
|
|
||||||
# turn bytes into k-bit vectors
|
# turn bytes into k-bit vectors
|
||||||
|
@ -122,10 +122,10 @@ class cqpsk_mod(gr.hier_block2):
|
||||||
|
|
||||||
if verbose:
|
if verbose:
|
||||||
self._print_verbage()
|
self._print_verbage()
|
||||||
|
|
||||||
if log:
|
if log:
|
||||||
self._setup_logging()
|
self._setup_logging()
|
||||||
|
|
||||||
# Connect & Initialize base class
|
# Connect & Initialize base class
|
||||||
self.connect(self, self.bytes2chunks, self.symbol_mapper, self.diffenc,
|
self.connect(self, self.bytes2chunks, self.symbol_mapper, self.diffenc,
|
||||||
self.chunks2symbols, self.rrc_filter, self)
|
self.chunks2symbols, self.rrc_filter, self)
|
||||||
|
@ -150,7 +150,7 @@ class cqpsk_mod(gr.hier_block2):
|
||||||
self.connect(self.symbol_mapper,
|
self.connect(self.symbol_mapper,
|
||||||
blocks.file_sink(gr.sizeof_char, "tx_graycoder.dat"))
|
blocks.file_sink(gr.sizeof_char, "tx_graycoder.dat"))
|
||||||
self.connect(self.diffenc,
|
self.connect(self.diffenc,
|
||||||
blocks.file_sink(gr.sizeof_char, "tx_diffenc.dat"))
|
blocks.file_sink(gr.sizeof_char, "tx_diffenc.dat"))
|
||||||
self.connect(self.chunks2symbols,
|
self.connect(self.chunks2symbols,
|
||||||
blocks.file_sink(gr.sizeof_gr_complex, "tx_chunks2symbols.dat"))
|
blocks.file_sink(gr.sizeof_gr_complex, "tx_chunks2symbols.dat"))
|
||||||
self.connect(self.rrc_filter,
|
self.connect(self.rrc_filter,
|
||||||
|
@ -184,7 +184,7 @@ class cqpsk_mod(gr.hier_block2):
|
||||||
|
|
||||||
class cqpsk_demod(gr.hier_block2):
|
class cqpsk_demod(gr.hier_block2):
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
samples_per_symbol=_def_samples_per_symbol,
|
samples_per_symbol=_def_samples_per_symbol,
|
||||||
excess_bw=_def_excess_bw,
|
excess_bw=_def_excess_bw,
|
||||||
costas_alpha=_def_costas_alpha,
|
costas_alpha=_def_costas_alpha,
|
||||||
|
@ -236,13 +236,13 @@ class cqpsk_demod(gr.hier_block2):
|
||||||
raise TypeError, "sbp must be >= 2, is %d" % samples_per_symbol
|
raise TypeError, "sbp must be >= 2, is %d" % samples_per_symbol
|
||||||
|
|
||||||
arity = pow(2,self.bits_per_symbol())
|
arity = pow(2,self.bits_per_symbol())
|
||||||
|
|
||||||
# Automatic gain control
|
# Automatic gain control
|
||||||
scale = (1.0/16384.0)
|
scale = (1.0/16384.0)
|
||||||
self.pre_scaler = blocks.multiply_const_cc(scale) # scale the signal from full-range to +-1
|
self.pre_scaler = blocks.multiply_const_cc(scale) # scale the signal from full-range to +-1
|
||||||
#self.agc = gr.agc2_cc(0.6e-1, 1e-3, 1, 1, 100)
|
#self.agc = gr.agc2_cc(0.6e-1, 1e-3, 1, 1, 100)
|
||||||
self.agc = analog.feedforward_agc_cc(16, 2.0)
|
self.agc = analog.feedforward_agc_cc(16, 2.0)
|
||||||
|
|
||||||
# RRC data filter
|
# RRC data filter
|
||||||
ntaps = 11 * samples_per_symbol
|
ntaps = 11 * samples_per_symbol
|
||||||
self.rrc_taps = firdes.root_raised_cosine(
|
self.rrc_taps = firdes.root_raised_cosine(
|
||||||
|
@ -251,7 +251,7 @@ class cqpsk_demod(gr.hier_block2):
|
||||||
1.0, # symbol rate
|
1.0, # symbol rate
|
||||||
self._excess_bw, # excess bandwidth (roll-off factor)
|
self._excess_bw, # excess bandwidth (roll-off factor)
|
||||||
ntaps)
|
ntaps)
|
||||||
self.rrc_filter=filter.interp_fir_filter_ccf(1, self.rrc_taps)
|
self.rrc_filter=filter.interp_fir_filter_ccf(1, self.rrc_taps)
|
||||||
|
|
||||||
if not self._mm_gain_mu:
|
if not self._mm_gain_mu:
|
||||||
sbs_to_mm = {2: 0.050, 3: 0.075, 4: 0.11, 5: 0.125, 6: 0.15, 7: 0.15}
|
sbs_to_mm = {2: 0.050, 3: 0.075, 4: 0.11, 5: 0.125, 6: 0.15, 7: 0.15}
|
||||||
|
@ -262,7 +262,7 @@ class cqpsk_demod(gr.hier_block2):
|
||||||
self._costas_beta = 0.25 * self._costas_alpha * self._costas_alpha
|
self._costas_beta = 0.25 * self._costas_alpha * self._costas_alpha
|
||||||
fmin = -0.025
|
fmin = -0.025
|
||||||
fmax = 0.025
|
fmax = 0.025
|
||||||
|
|
||||||
if not _def_has_gr_digital:
|
if not _def_has_gr_digital:
|
||||||
self.receiver=gr.mpsk_receiver_cc(arity, pi/4.0,
|
self.receiver=gr.mpsk_receiver_cc(arity, pi/4.0,
|
||||||
self._costas_alpha, self._costas_beta,
|
self._costas_alpha, self._costas_beta,
|
||||||
|
@ -292,10 +292,10 @@ class cqpsk_demod(gr.hier_block2):
|
||||||
|
|
||||||
if verbose:
|
if verbose:
|
||||||
self._print_verbage()
|
self._print_verbage()
|
||||||
|
|
||||||
if log:
|
if log:
|
||||||
self._setup_logging()
|
self._setup_logging()
|
||||||
|
|
||||||
# Connect & Initialize base class
|
# Connect & Initialize base class
|
||||||
self.connect(self, self.pre_scaler, self.agc, self.rrc_filter, self.receiver,
|
self.connect(self, self.pre_scaler, self.agc, self.rrc_filter, self.receiver,
|
||||||
self.diffdec, self.to_float, self.rescale, self)
|
self.diffdec, self.to_float, self.rescale, self)
|
||||||
|
@ -331,7 +331,7 @@ class cqpsk_demod(gr.hier_block2):
|
||||||
self.connect(self.receiver,
|
self.connect(self.receiver,
|
||||||
blocks.file_sink(gr.sizeof_gr_complex, "rx_receiver.dat"))
|
blocks.file_sink(gr.sizeof_gr_complex, "rx_receiver.dat"))
|
||||||
self.connect(self.diffdec,
|
self.connect(self.diffdec,
|
||||||
blocks.file_sink(gr.sizeof_gr_complex, "rx_diffdec.dat"))
|
blocks.file_sink(gr.sizeof_gr_complex, "rx_diffdec.dat"))
|
||||||
self.connect(self.to_float,
|
self.connect(self.to_float,
|
||||||
blocks.file_sink(gr.sizeof_float, "rx_to_float.dat"))
|
blocks.file_sink(gr.sizeof_float, "rx_to_float.dat"))
|
||||||
self.connect(self.rescale,
|
self.connect(self.rescale,
|
||||||
|
|
|
@ -25,10 +25,7 @@ from optparse import OptionParser
|
||||||
import osmosdr
|
import osmosdr
|
||||||
import wx
|
import wx
|
||||||
|
|
||||||
try:
|
import cqpsk
|
||||||
import cqpsk
|
|
||||||
except:
|
|
||||||
from tetra_demod import cqpsk
|
|
||||||
|
|
||||||
# applies frequency translation, resampling and demodulation
|
# applies frequency translation, resampling and demodulation
|
||||||
|
|
||||||
|
@ -45,15 +42,10 @@ class top_block(grc_wxgui.top_block_gui):
|
||||||
self.src = osmosdr.source(options.args)
|
self.src = osmosdr.source(options.args)
|
||||||
self.src.set_center_freq(self.ifreq)
|
self.src.set_center_freq(self.ifreq)
|
||||||
self.src.set_sample_rate(int(options.sample_rate))
|
self.src.set_sample_rate(int(options.sample_rate))
|
||||||
|
self.src.set_freq_corr(0, 0)
|
||||||
if self.rfgain is None:
|
self.src.set_dc_offset_mode(2, 0)
|
||||||
self.src.set_gain_mode(1)
|
self.src.set_iq_balance_mode(2, 0)
|
||||||
self.iagc = 1
|
self.src.set_gain_mode(1, 0)
|
||||||
self.rfgain = 0
|
|
||||||
else:
|
|
||||||
self.iagc = 0
|
|
||||||
self.src.set_gain_mode(0)
|
|
||||||
self.src.set_gain(self.rfgain)
|
|
||||||
|
|
||||||
# may differ from the requested rate
|
# may differ from the requested rate
|
||||||
sample_rate = self.src.get_sample_rate()
|
sample_rate = self.src.get_sample_rate()
|
||||||
|
@ -118,53 +110,6 @@ class top_block(grc_wxgui.top_block_gui):
|
||||||
)
|
)
|
||||||
self.Add(self._ifreq_text_box)
|
self.Add(self._ifreq_text_box)
|
||||||
|
|
||||||
def set_iagc(iagc):
|
|
||||||
self.iagc = iagc
|
|
||||||
self._agc_check_box.set_value(self.iagc)
|
|
||||||
self.src.set_gain_mode(self.iagc, 0)
|
|
||||||
self.src.set_gain(0 if self.iagc == 1 else self.rfgain, 0)
|
|
||||||
|
|
||||||
self._agc_check_box = forms.check_box(
|
|
||||||
parent=self.GetWin(),
|
|
||||||
value=self.iagc,
|
|
||||||
callback=set_iagc,
|
|
||||||
label="Automatic Gain",
|
|
||||||
true=1,
|
|
||||||
false=0,
|
|
||||||
)
|
|
||||||
|
|
||||||
self.Add(self._agc_check_box)
|
|
||||||
|
|
||||||
def set_rfgain(rfgain):
|
|
||||||
self.rfgain = rfgain
|
|
||||||
self._rfgain_slider.set_value(self.rfgain)
|
|
||||||
self._rfgain_text_box.set_value(self.rfgain)
|
|
||||||
self.src.set_gain(0 if self.iagc == 1 else self.rfgain, 0)
|
|
||||||
|
|
||||||
_rfgain_sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
self._rfgain_text_box = forms.text_box(
|
|
||||||
parent=self.GetWin(),
|
|
||||||
sizer=_rfgain_sizer,
|
|
||||||
value=self.rfgain,
|
|
||||||
callback=set_rfgain,
|
|
||||||
label="RF Gain",
|
|
||||||
converter=forms.float_converter(),
|
|
||||||
proportion=0,
|
|
||||||
)
|
|
||||||
self._rfgain_slider = forms.slider(
|
|
||||||
parent=self.GetWin(),
|
|
||||||
sizer=_rfgain_sizer,
|
|
||||||
value=self.rfgain,
|
|
||||||
callback=set_rfgain,
|
|
||||||
minimum=0,
|
|
||||||
maximum=50,
|
|
||||||
num_steps=200,
|
|
||||||
style=wx.SL_HORIZONTAL,
|
|
||||||
cast=float,
|
|
||||||
proportion=1,
|
|
||||||
)
|
|
||||||
|
|
||||||
self.Add(_rfgain_sizer)
|
|
||||||
|
|
||||||
self.Add(self.Main)
|
self.Add(self.Main)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue