works with rtl sdr and gnuradio 3.8

This commit is contained in:
Bastian Bloessl 2013-11-17 20:00:18 +01:00 committed by Jiří Pinkava
parent 1d569bbd62
commit 0aef6eb648
2 changed files with 17 additions and 72 deletions

View file

@ -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,

View file

@ -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)