uhd: add lo_offset argument

This might be used to tune away from the noisy center region caused by
direct conversion receiver principle. The offset shall be choosen within
receiver (daughterboard) bandwidth.

Thanks to Marcus Leech & G0HWW for the original idea.
gr3.6
Dimitri Stolnikov 10 years ago
parent 2193c32ae0
commit ccff99ea4f

@ -40,7 +40,8 @@ uhd_source_c_sptr make_uhd_source_c(const std::string &args)
uhd_source_c::uhd_source_c(const std::string &args) :
gr_hier_block2("uhd_source_c",
gr_make_io_signature (0, 0, 0),
args_to_io_signature(args))
args_to_io_signature(args)),
_lo_offset(0.0f)
{
size_t nchan = 1;
dict_t dict = params_to_dict(args);
@ -51,11 +52,15 @@ uhd_source_c::uhd_source_c(const std::string &args) :
if (0 == nchan)
nchan = 1;
if (dict.count("lo_offset"))
_lo_offset = boost::lexical_cast< double >( dict["lo_offset"] );
std::string arguments; // rebuild argument string without internal arguments
BOOST_FOREACH( dict_t::value_type &entry, dict ) {
if ( "uhd" != entry.first &&
"nchan" != entry.first &&
"subdev" != entry.first ) {
"subdev" != entry.first &&
"lo_offset" != entry.first ) {
arguments += entry.first + "=" + entry.second + ",";
}
}
@ -64,9 +69,16 @@ uhd_source_c::uhd_source_c(const std::string &args) :
uhd::io_type_t::COMPLEX_FLOAT32,
nchan );
if (dict.count("subdev"))
if (dict.count("subdev")) {
_src->set_subdev_spec( dict["subdev"] );
std::cerr << "-- Using subdev spec '" << _src->get_subdev_spec() << "'."
<< std::endl;
}
if (0.0 != _lo_offset)
std::cerr << "-- Using lo offset of " << _lo_offset << " Hz." << std::endl;
for ( size_t i = 0; i < nchan; i++ )
connect( _src, i, self(), i );
}
@ -167,7 +179,12 @@ osmosdr::freq_range_t uhd_source_c::get_freq_range( size_t chan )
double uhd_source_c::set_center_freq( double freq, size_t chan )
{
_src->set_center_freq(freq, chan);
//_src->set_center_freq(freq, chan);
// advanced tuning with tune_request_t
uhd::tune_request_t tune_req(freq, _lo_offset);
_src->set_center_freq(tune_req, chan);
return get_center_freq(chan);
}

@ -77,6 +77,7 @@ public:
std::string get_antenna( size_t chan = 0 );
private:
double _lo_offset;
boost::shared_ptr<uhd_usrp_source> _src;
};

Loading…
Cancel
Save