forked from sdr/gr-osmosdr
implement virtually arbitrary gain values
internally, this will pick a certain gain value out of the valid gains using the "smallest error" strategy.
This commit is contained in:
parent
ba0b52868a
commit
3a066ff258
|
@ -435,10 +435,31 @@ bool rtl_source_c::get_gain_mode( size_t chan )
|
||||||
return _auto_gain;
|
return _auto_gain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double pick_closest_gain(osmosdr::gain_range_t &gains, double required)
|
||||||
|
{
|
||||||
|
double result = required;
|
||||||
|
double distance = 100;
|
||||||
|
|
||||||
|
BOOST_FOREACH(osmosdr::range_t gain, gains)
|
||||||
|
{
|
||||||
|
double diff = fabs(gain.start() - required);
|
||||||
|
|
||||||
|
if (diff < distance) {
|
||||||
|
distance = diff;
|
||||||
|
result = gain.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
double rtl_source_c::set_gain( double gain, size_t chan )
|
double rtl_source_c::set_gain( double gain, size_t chan )
|
||||||
{
|
{
|
||||||
|
osmosdr::gain_range_t gains = rtl_source_c::get_gain_range( chan );
|
||||||
|
double picked_gain = pick_closest_gain( gains, gain );
|
||||||
|
|
||||||
if (_dev)
|
if (_dev)
|
||||||
rtlsdr_set_tuner_gain( _dev, int(gain * 10.0) );
|
rtlsdr_set_tuner_gain( _dev, int(picked_gain * 10.0) );
|
||||||
|
|
||||||
return get_gain( chan );
|
return get_gain( chan );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue