mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-09-04 22:27:53 -04:00
PlutoSDR input: restore full range of FIR Rx gain
This commit is contained in:
parent
7fed299b97
commit
629fc9ce79
@ -27,6 +27,8 @@
|
|||||||
#include "deviceplutosdrbox.h"
|
#include "deviceplutosdrbox.h"
|
||||||
|
|
||||||
DevicePlutoSDRBox::DevicePlutoSDRBox(const std::string& uri) :
|
DevicePlutoSDRBox::DevicePlutoSDRBox(const std::string& uri) :
|
||||||
|
m_lpfFIRRxGain(0),
|
||||||
|
m_lpfFIRTxGain(0),
|
||||||
m_chnRx0(0),
|
m_chnRx0(0),
|
||||||
m_chnTx0(0),
|
m_chnTx0(0),
|
||||||
m_rxBuf(0),
|
m_rxBuf(0),
|
||||||
@ -470,7 +472,14 @@ void DevicePlutoSDRBox::setSampleRate(uint32_t sampleRate)
|
|||||||
m_devSampleRate = sampleRate;
|
m_devSampleRate = sampleRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DevicePlutoSDRBox::setFIR(uint32_t sampleRate, uint32_t log2IntDec, uint32_t bw, int gain)
|
/**
|
||||||
|
* @param sampleRate baseband sample rate (S/s)
|
||||||
|
* @param log2IntDec FIR interpolation or decimation factor
|
||||||
|
* @param use Rx or Tx. Applies to the rest of the parameters
|
||||||
|
* @param bw FIR filter bandwidth at approximately -6 dB cutoff (Hz)
|
||||||
|
* @param gain FIR filter gain (dB)
|
||||||
|
*/
|
||||||
|
void DevicePlutoSDRBox::setFIR(uint32_t sampleRate, uint32_t log2IntDec, DeviceUse use, uint32_t bw, int gain)
|
||||||
{
|
{
|
||||||
SampleRates sampleRates;
|
SampleRates sampleRates;
|
||||||
std::ostringstream ostr;
|
std::ostringstream ostr;
|
||||||
@ -479,11 +488,19 @@ void DevicePlutoSDRBox::setFIR(uint32_t sampleRate, uint32_t log2IntDec, uint32_
|
|||||||
double normalizedBW;
|
double normalizedBW;
|
||||||
uint32_t intdec = 1<<(log2IntDec > 2 ? 2 : log2IntDec);
|
uint32_t intdec = 1<<(log2IntDec > 2 ? 2 : log2IntDec);
|
||||||
|
|
||||||
|
// update gain parameter
|
||||||
|
|
||||||
|
if (use == USE_RX) {
|
||||||
|
m_lpfFIRRxGain = gain;
|
||||||
|
} else {
|
||||||
|
m_lpfFIRTxGain = gain;
|
||||||
|
}
|
||||||
|
|
||||||
// set a dummy minimal filter first to get the sample rates right
|
// set a dummy minimal filter first to get the sample rates right
|
||||||
|
|
||||||
setFIREnable(false); // disable first
|
setFIREnable(false); // disable first
|
||||||
|
|
||||||
formatFIRHeader(ostr, intdec, gain);
|
formatFIRHeader(ostr, intdec);
|
||||||
formatFIRCoefficients(ostr, 16, 0.5);
|
formatFIRCoefficients(ostr, 16, 0.5);
|
||||||
setFilter(ostr.str());
|
setFilter(ostr.str());
|
||||||
ostr.str(""); // reset string stream
|
ostr.str(""); // reset string stream
|
||||||
@ -515,13 +532,12 @@ void DevicePlutoSDRBox::setFIR(uint32_t sampleRate, uint32_t log2IntDec, uint32_
|
|||||||
|
|
||||||
// set the right filter
|
// set the right filter
|
||||||
|
|
||||||
formatFIRHeader(ostr, intdec, gain);
|
formatFIRHeader(ostr, intdec);
|
||||||
formatFIRCoefficients(ostr, nbTaps, normalizedBW);
|
formatFIRCoefficients(ostr, nbTaps, normalizedBW);
|
||||||
setFilter(ostr.str());
|
setFilter(ostr.str());
|
||||||
|
|
||||||
m_lpfFIRlog2Decim = log2IntDec;
|
m_lpfFIRlog2Decim = log2IntDec;
|
||||||
m_lpfFIRBW = bw;
|
m_lpfFIRBW = bw;
|
||||||
m_lpfFIRGain = gain;
|
|
||||||
|
|
||||||
// enable and set sample rate will be done by the caller
|
// enable and set sample rate will be done by the caller
|
||||||
}
|
}
|
||||||
@ -547,10 +563,10 @@ void DevicePlutoSDRBox::setLOPPMTenths(int ppmTenths)
|
|||||||
m_LOppmTenths = ppmTenths;
|
m_LOppmTenths = ppmTenths;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DevicePlutoSDRBox::formatFIRHeader(std::ostringstream& ostr,uint32_t intdec, int32_t gain)
|
void DevicePlutoSDRBox::formatFIRHeader(std::ostringstream& ostr,uint32_t intdec)
|
||||||
{
|
{
|
||||||
ostr << "RX 3 GAIN " << gain << " DEC " << intdec << std::endl;
|
ostr << "RX 3 GAIN " << m_lpfFIRRxGain << " DEC " << intdec << std::endl;
|
||||||
ostr << "TX 3 GAIN " << gain << " INT " << intdec << std::endl;
|
ostr << "TX 3 GAIN " << m_lpfFIRTxGain << " INT " << intdec << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DevicePlutoSDRBox::formatFIRCoefficients(std::ostringstream& ostr, uint32_t nbTaps, double normalizedBW)
|
void DevicePlutoSDRBox::formatFIRCoefficients(std::ostringstream& ostr, uint32_t nbTaps, double normalizedBW)
|
||||||
|
@ -57,7 +57,8 @@ public:
|
|||||||
bool m_lpfFIREnable; //!< enable digital lowpass FIR filter
|
bool m_lpfFIREnable; //!< enable digital lowpass FIR filter
|
||||||
float m_lpfFIRBW; //!< digital lowpass FIR filter bandwidth (Hz)
|
float m_lpfFIRBW; //!< digital lowpass FIR filter bandwidth (Hz)
|
||||||
uint32_t m_lpfFIRlog2Decim; //!< digital lowpass FIR filter log2 of decimation factor (0..2)
|
uint32_t m_lpfFIRlog2Decim; //!< digital lowpass FIR filter log2 of decimation factor (0..2)
|
||||||
int m_lpfFIRGain; //!< digital lowpass FIR filter gain (dB)
|
int m_lpfFIRRxGain; //!< digital lowpass FIR filter gain Rx side (dB)
|
||||||
|
int m_lpfFIRTxGain; //!< digital lowpass FIR filter gain Tx side (dB)
|
||||||
|
|
||||||
DevicePlutoSDRBox(const std::string& uri);
|
DevicePlutoSDRBox(const std::string& uri);
|
||||||
~DevicePlutoSDRBox();
|
~DevicePlutoSDRBox();
|
||||||
@ -88,7 +89,7 @@ public:
|
|||||||
bool getRxSampleRates(SampleRates& sampleRates);
|
bool getRxSampleRates(SampleRates& sampleRates);
|
||||||
bool getTxSampleRates(SampleRates& sampleRates);
|
bool getTxSampleRates(SampleRates& sampleRates);
|
||||||
void setSampleRate(uint32_t sampleRate);
|
void setSampleRate(uint32_t sampleRate);
|
||||||
void setFIR(uint32_t sampleRate, uint32_t intdec, uint32_t bw, int gain);
|
void setFIR(uint32_t sampleRate, uint32_t intdec, DeviceUse use, uint32_t bw, int gain);
|
||||||
void setFIREnable(bool enable);
|
void setFIREnable(bool enable);
|
||||||
void setLOPPMTenths(int ppmTenths);
|
void setLOPPMTenths(int ppmTenths);
|
||||||
bool getRSSI(std::string& rssiStr, unsigned int chan);
|
bool getRSSI(std::string& rssiStr, unsigned int chan);
|
||||||
@ -111,7 +112,7 @@ private:
|
|||||||
|
|
||||||
bool parseSampleRates(const std::string& rateStr, SampleRates& sampleRates);
|
bool parseSampleRates(const std::string& rateStr, SampleRates& sampleRates);
|
||||||
void setFilter(const std::string& filterConfigStr);
|
void setFilter(const std::string& filterConfigStr);
|
||||||
void formatFIRHeader(std::ostringstream& str, uint32_t intdec, int32_t gain);
|
void formatFIRHeader(std::ostringstream& str, uint32_t intdec);
|
||||||
void formatFIRCoefficients(std::ostringstream& str, uint32_t nbTaps, double normalizedBW);
|
void formatFIRCoefficients(std::ostringstream& str, uint32_t nbTaps, double normalizedBW);
|
||||||
void getXO();
|
void getXO();
|
||||||
void setTracking();
|
void setTracking();
|
||||||
|
@ -322,7 +322,7 @@ bool PlutoSDRInput::applySettings(const PlutoSDRInputSettings& settings, bool fo
|
|||||||
(settings.m_lpfFIRBW != m_settings.m_lpfFIRBW) ||
|
(settings.m_lpfFIRBW != m_settings.m_lpfFIRBW) ||
|
||||||
(settings.m_lpfFIRGain != m_settings.m_lpfFIRGain) || force)
|
(settings.m_lpfFIRGain != m_settings.m_lpfFIRGain) || force)
|
||||||
{
|
{
|
||||||
plutoBox->setFIR(settings.m_devSampleRate, settings.m_lpfFIRlog2Decim, settings.m_lpfFIRBW, settings.m_lpfFIRGain); // don't bother with the FIR at this point
|
plutoBox->setFIR(settings.m_devSampleRate, settings.m_lpfFIRlog2Decim, DevicePlutoSDRBox::USE_RX, settings.m_lpfFIRBW, settings.m_lpfFIRGain);
|
||||||
plutoBox->setFIREnable(settings.m_lpfFIREnable); // eventually enable/disable FIR
|
plutoBox->setFIREnable(settings.m_lpfFIREnable); // eventually enable/disable FIR
|
||||||
plutoBox->setSampleRate(settings.m_devSampleRate); // and set end point sample rate
|
plutoBox->setSampleRate(settings.m_devSampleRate); // and set end point sample rate
|
||||||
|
|
||||||
|
@ -235,7 +235,7 @@ void PlutoSDRInputGui::on_lpFIRDecimation_currentIndexChanged(int index)
|
|||||||
|
|
||||||
void PlutoSDRInputGui::on_lpFIRGain_currentIndexChanged(int index)
|
void PlutoSDRInputGui::on_lpFIRGain_currentIndexChanged(int index)
|
||||||
{
|
{
|
||||||
m_settings.m_lpfFIRGain = 6*(index > 1 ? 1 : index) - 6;
|
m_settings.m_lpfFIRGain = 6*(index > 3 ? 3 : index) - 12;
|
||||||
sendSettings();
|
sendSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,7 +276,7 @@ void PlutoSDRInputGui::displaySettings()
|
|||||||
ui->lpFIREnable->setChecked(m_settings.m_lpfFIREnable);
|
ui->lpFIREnable->setChecked(m_settings.m_lpfFIREnable);
|
||||||
ui->lpFIR->setValue(m_settings.m_lpfFIRBW / 1000);
|
ui->lpFIR->setValue(m_settings.m_lpfFIRBW / 1000);
|
||||||
ui->lpFIRDecimation->setCurrentIndex(m_settings.m_lpfFIRlog2Decim);
|
ui->lpFIRDecimation->setCurrentIndex(m_settings.m_lpfFIRlog2Decim);
|
||||||
ui->lpFIRGain->setCurrentIndex((m_settings.m_lpfFIRGain + 6)/6);
|
ui->lpFIRGain->setCurrentIndex((m_settings.m_lpfFIRGain + 12)/6);
|
||||||
ui->lpFIRDecimation->setEnabled(m_settings.m_lpfFIREnable);
|
ui->lpFIRDecimation->setEnabled(m_settings.m_lpfFIREnable);
|
||||||
ui->lpFIRGain->setEnabled(m_settings.m_lpfFIREnable);
|
ui->lpFIRGain->setEnabled(m_settings.m_lpfFIREnable);
|
||||||
|
|
||||||
|
@ -701,15 +701,14 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="lpFIRGain">
|
<widget class="QComboBox" name="lpFIRGain">
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>50</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>FIR gain (dB)</string>
|
<string>FIR gain (dB)</string>
|
||||||
</property>
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>-12</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>-6</string>
|
<string>-6</string>
|
||||||
@ -720,6 +719,11 @@
|
|||||||
<string>0</string>
|
<string>0</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>+6</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user