mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-25 17:28:50 -05:00
Consistant Waterfall speed.
Saves cpu at high bandwidths.
This commit is contained in:
parent
fbef672cd0
commit
82047f69ce
@ -45,6 +45,7 @@ public:
|
|||||||
|
|
||||||
virtual const QString& getDeviceDescription() const = 0;
|
virtual const QString& getDeviceDescription() const = 0;
|
||||||
virtual int getSampleRate() const = 0;
|
virtual int getSampleRate() const = 0;
|
||||||
|
virtual int wfdecimation() const = 0;
|
||||||
virtual quint64 getCenterFrequency() const = 0;
|
virtual quint64 getCenterFrequency() const = 0;
|
||||||
|
|
||||||
virtual bool handleMessage(Message* message) = 0;
|
virtual bool handleMessage(Message* message) = 0;
|
||||||
|
@ -185,6 +185,12 @@ int RTLSDRInput::getSampleRate() const
|
|||||||
return 1536000 / (1 << m_settings.m_decimation);
|
return 1536000 / (1 << m_settings.m_decimation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int RTLSDRInput::wfdecimation() const
|
||||||
|
{
|
||||||
|
// decimate waterfall more when downsampling less
|
||||||
|
return (1 << (4 - m_settings.m_decimation) ) -1;
|
||||||
|
}
|
||||||
|
|
||||||
quint64 RTLSDRInput::getCenterFrequency() const
|
quint64 RTLSDRInput::getCenterFrequency() const
|
||||||
{
|
{
|
||||||
return m_generalSettings.m_centerFrequency;
|
return m_generalSettings.m_centerFrequency;
|
||||||
|
@ -87,6 +87,7 @@ public:
|
|||||||
|
|
||||||
const QString& getDeviceDescription() const;
|
const QString& getDeviceDescription() const;
|
||||||
int getSampleRate() const;
|
int getSampleRate() const;
|
||||||
|
int wfdecimation() const;
|
||||||
quint64 getCenterFrequency() const;
|
quint64 getCenterFrequency() const;
|
||||||
|
|
||||||
bool handleMessage(Message* message);
|
bool handleMessage(Message* message);
|
||||||
|
@ -196,6 +196,7 @@ void DSPEngine::imbalance(SampleVector::iterator begin, SampleVector::iterator e
|
|||||||
it->m_imag = (it->m_imag * m_imbalance) >> 16;
|
it->m_imag = (it->m_imag * m_imbalance) >> 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int drop_frame = 0;
|
||||||
void DSPEngine::work()
|
void DSPEngine::work()
|
||||||
{
|
{
|
||||||
SampleFifo* sampleFifo = m_sampleSource->getSampleFifo();
|
SampleFifo* sampleFifo = m_sampleSource->getSampleFifo();
|
||||||
@ -210,6 +211,12 @@ void DSPEngine::work()
|
|||||||
|
|
||||||
size_t count = sampleFifo->readBegin(sampleFifo->fill(), &part1begin, &part1end, &part2begin, &part2end);
|
size_t count = sampleFifo->readBegin(sampleFifo->fill(), &part1begin, &part1end, &part2begin, &part2end);
|
||||||
|
|
||||||
|
if (m_sampleSource->wfdecimation() & drop_frame++) {
|
||||||
|
sampleFifo->readCommit(count);
|
||||||
|
samplesDone += count;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// first part of FIFO data
|
// first part of FIFO data
|
||||||
if(part1begin != part1end) {
|
if(part1begin != part1end) {
|
||||||
// correct stuff
|
// correct stuff
|
||||||
@ -239,69 +246,6 @@ void DSPEngine::work()
|
|||||||
sampleFifo->readCommit(count);
|
sampleFifo->readCommit(count);
|
||||||
samplesDone += count;
|
samplesDone += count;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
size_t wus;
|
|
||||||
size_t maxWorkUnitSize = 0;
|
|
||||||
size_t samplesDone = 0;
|
|
||||||
|
|
||||||
wus = m_spectrum.workUnitSize();
|
|
||||||
if(wus > maxWorkUnitSize)
|
|
||||||
maxWorkUnitSize = wus;
|
|
||||||
for(SampleSinks::const_iterator it = m_sampleSinks.begin(); it != m_sampleSinks.end(); it++) {
|
|
||||||
wus = (*it)->workUnitSize();
|
|
||||||
if(wus > maxWorkUnitSize)
|
|
||||||
maxWorkUnitSize = wus;
|
|
||||||
}
|
|
||||||
|
|
||||||
while((m_sampleFifo.fill() > maxWorkUnitSize) && (m_commandQueue.countPending() == 0) && (samplesDone < m_sampleRate)) {
|
|
||||||
SampleVector::iterator part1begin;
|
|
||||||
SampleVector::iterator part1end;
|
|
||||||
SampleVector::iterator part2begin;
|
|
||||||
SampleVector::iterator part2end;
|
|
||||||
|
|
||||||
size_t count = m_sampleFifo.readBegin(m_sampleFifo.fill(), &part1begin, &part1end, &part2begin, &part2end);
|
|
||||||
|
|
||||||
// first part of FIFO data
|
|
||||||
if(part1begin != part1end) {
|
|
||||||
// correct stuff
|
|
||||||
if(m_settings.dcOffsetCorrection())
|
|
||||||
dcOffset(part1begin, part1end);
|
|
||||||
if(m_settings.iqImbalanceCorrection())
|
|
||||||
imbalance(part1begin, part1end);
|
|
||||||
// feed data to handlers
|
|
||||||
m_spectrum.feed(part1begin, part1end);
|
|
||||||
for(SampleSinks::const_iterator it = m_sampleSinks.begin(); it != m_sampleSinks.end(); it++)
|
|
||||||
(*it)->feed(part1begin, part1end);
|
|
||||||
}
|
|
||||||
// second part of FIFO data (used when block wraps around)
|
|
||||||
if(part2begin != part2end) {
|
|
||||||
// correct stuff
|
|
||||||
if(m_settings.dcOffsetCorrection())
|
|
||||||
dcOffset(part2begin, part2end);
|
|
||||||
if(m_settings.iqImbalanceCorrection())
|
|
||||||
imbalance(part2begin, part2end);
|
|
||||||
// feed data to handlers
|
|
||||||
m_spectrum.feed(part2begin, part2end);
|
|
||||||
for(SampleSinks::const_iterator it = m_sampleSinks.begin(); it != m_sampleSinks.end(); it++)
|
|
||||||
(*it)->feed(part1begin, part1end);
|
|
||||||
}
|
|
||||||
|
|
||||||
// adjust FIFO pointers
|
|
||||||
m_sampleFifo.readCommit(count);
|
|
||||||
samplesDone += count;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if the center frequency has changed (has to be responsive)
|
|
||||||
if(m_settings.isModifiedCenterFreq())
|
|
||||||
m_sampleSource->setCenterFrequency(m_settings.centerFreq());
|
|
||||||
// check if decimation has changed (needed to be done here, because to high a sample rate can clog the switch)
|
|
||||||
if(m_settings.isModifiedDecimation()) {
|
|
||||||
m_sampleSource->setDecimation(m_settings.decimation());
|
|
||||||
m_sampleRate = 4000000 / (1 << m_settings.decimation());
|
|
||||||
qDebug("New rate: %d", m_sampleRate);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DSPEngine::State DSPEngine::gotoIdle()
|
DSPEngine::State DSPEngine::gotoIdle()
|
||||||
|
Loading…
Reference in New Issue
Block a user