Deep redesign: use references for the iterator parameters of the sample sinks feed method

This commit is contained in:
f4exb 2015-08-25 08:24:23 +02:00
parent fb2e601a03
commit 005eae774e
25 changed files with 59 additions and 37 deletions

View File

@ -38,7 +38,7 @@ public:
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
virtual bool handleMessage(const Message& cmd); virtual bool handleMessage(const Message& cmd);
protected: protected:

View File

@ -28,7 +28,7 @@ public:
void configure(MessageQueue* msgQueue, const std::string& filename); void configure(MessageQueue* msgQueue, const std::string& filename);
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual bool handleMessage(const Message& message); virtual bool handleMessage(const Message& message);

View File

@ -35,7 +35,7 @@ public:
uint traceSize); uint traceSize);
void setOneShot(bool oneShot); void setOneShot(bool oneShot);
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual bool handleMessage(const Message& message); virtual bool handleMessage(const Message& message);

View File

@ -14,7 +14,7 @@ public:
SpectrumScopeComboVis(SpectrumVis* spectrumVis, ScopeVis* scopeVis); SpectrumScopeComboVis(SpectrumVis* spectrumVis, ScopeVis* scopeVis);
virtual ~SpectrumScopeComboVis(); virtual ~SpectrumScopeComboVis();
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual bool handleMessage(const Message& message); virtual bool handleMessage(const Message& message);

View File

@ -39,8 +39,8 @@ public:
void configure(MessageQueue* msgQueue, int fftSize, int overlapPercent, FFTWindow::Function window); void configure(MessageQueue* msgQueue, int fftSize, int overlapPercent, FFTWindow::Function window);
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
void feedTriggered(SampleVector::const_iterator triggerPoint, SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly); void feedTriggered(const SampleVector::const_iterator& triggerPoint, const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual bool handleMessage(const Message& message); virtual bool handleMessage(const Message& message);

View File

@ -16,7 +16,7 @@ public:
virtual void start() = 0; virtual void start() = 0;
virtual void stop() = 0; virtual void stop() = 0;
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly) = 0; virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly) = 0;
virtual bool handleMessage(const Message& cmd) = 0; //!< Processing of a message. Returns true if message has actually been processed virtual bool handleMessage(const Message& cmd) = 0; //!< Processing of a message. Returns true if message has actually been processed
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication

View File

@ -63,7 +63,7 @@ void AMDemod::configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBan
messageQueue->push(cmd); messageQueue->push(cmd);
} }
void AMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst) void AMDemod::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst)
{ {
Complex ci; Complex ci;

View File

@ -36,7 +36,7 @@ public:
void configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBandwidth, Real volume, Real squelch); void configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBandwidth, Real volume, Real squelch);
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool po); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po);
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual bool handleMessage(const Message& cmd); virtual bool handleMessage(const Message& cmd);

View File

@ -60,7 +60,7 @@ void ChannelAnalyzer::configure(MessageQueue* messageQueue,
messageQueue->push(cmd); messageQueue->push(cmd);
} }
void ChannelAnalyzer::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly) void ChannelAnalyzer::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly)
{ {
fftfilt::cmplx *sideband, sum; fftfilt::cmplx *sideband, sum;
int n_out; int n_out;

View File

@ -43,7 +43,7 @@ public:
return m_sampleRate; return m_sampleRate;
} }
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual bool handleMessage(const Message& cmd); virtual bool handleMessage(const Message& cmd);

View File

@ -236,7 +236,7 @@ int LoRaDemod::detect(Complex c, Complex a)
return m_result; return m_result;
} }
void LoRaDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool pO) void LoRaDemod::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool pO)
{ {
int newangle; int newangle;
Complex ci; Complex ci;

View File

@ -39,7 +39,7 @@ public:
void configure(MessageQueue* messageQueue, Real Bandwidth); void configure(MessageQueue* messageQueue, Real Bandwidth);
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool pO); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool pO);
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual bool handleMessage(const Message& cmd); virtual bool handleMessage(const Message& cmd);

View File

@ -106,7 +106,7 @@ Real angleDist(Real a, Real b)
return dist; return dist;
} }
void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst) void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst)
{ {
Complex ci; Complex ci;

View File

@ -41,7 +41,7 @@ public:
void configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBandwidth, Real volume, Real squelch); void configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBandwidth, Real volume, Real squelch);
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool po); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po);
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual bool handleMessage(const Message& cmd); virtual bool handleMessage(const Message& cmd);

View File

@ -71,7 +71,7 @@ void SSBDemod::configure(MessageQueue* messageQueue, Real Bandwidth, Real LowCut
messageQueue->push(cmd); messageQueue->push(cmd);
} }
void SSBDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly) void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly)
{ {
Complex ci; Complex ci;
fftfilt::cmplx *sideband, sum; fftfilt::cmplx *sideband, sum;

View File

@ -36,7 +36,7 @@ public:
void configure(MessageQueue* messageQueue, Real Bandwidth, Real LowCutoff, Real volume, int spanLog2); void configure(MessageQueue* messageQueue, Real Bandwidth, Real LowCutoff, Real volume, int spanLog2);
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual bool handleMessage(const Message& cmd); virtual bool handleMessage(const Message& cmd);

View File

@ -71,7 +71,7 @@ void TCPSrc::setSpectrum(MessageQueue* messageQueue, bool enabled)
messageQueue->push(cmd); messageQueue->push(cmd);
} }
void TCPSrc::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly) void TCPSrc::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly)
{ {
Complex ci; Complex ci;
fftfilt::cmplx* sideband; fftfilt::cmplx* sideband;

View File

@ -32,7 +32,7 @@ public:
void configure(MessageQueue* messageQueue, SampleFormat sampleFormat, Real outputSampleRate, Real rfBandwidth, int tcpPort, int boost); void configure(MessageQueue* messageQueue, SampleFormat sampleFormat, Real outputSampleRate, Real rfBandwidth, int tcpPort, int boost);
void setSpectrum(MessageQueue* messageQueue, bool enabled); void setSpectrum(MessageQueue* messageQueue, bool enabled);
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual bool handleMessage(const Message& cmd); virtual bool handleMessage(const Message& cmd);

View File

@ -69,7 +69,7 @@ void WFMDemod::configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBa
messageQueue->push(cmd); messageQueue->push(cmd);
} }
void WFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst) void WFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst)
{ {
Complex ci; Complex ci;
fftfilt::cmplx *rf; fftfilt::cmplx *rf;

View File

@ -38,7 +38,7 @@ public:
void configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBandwidth, Real volume, Real squelch); void configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBandwidth, Real volume, Real squelch);
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool po); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po);
virtual void start(); virtual void start();
virtual void stop(); virtual void stop();
virtual bool handleMessage(const Message& cmd); virtual bool handleMessage(const Message& cmd);

View File

@ -30,7 +30,7 @@ void Channelizer::configure(MessageQueue* messageQueue, int sampleRate, int cent
messageQueue->push(cmd); messageQueue->push(cmd);
} }
void Channelizer::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly) void Channelizer::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly)
{ {
if(m_sampleSink == 0) { if(m_sampleSink == 0) {
m_sampleBuffer.clear(); m_sampleBuffer.clear();

View File

@ -30,7 +30,7 @@ void FileSink::configure(MessageQueue* msgQueue, const std::string& filename)
msgQueue->push(cmd); msgQueue->push(cmd);
} }
void FileSink::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly) void FileSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly)
{ {
// if no recording is active, send the samples to /dev/null // if no recording is active, send the samples to /dev/null
if(!m_recordOn) if(!m_recordOn)

View File

@ -55,8 +55,10 @@ void ScopeVis::configure(MessageQueue* msgQueue,
msgQueue->push(cmd); msgQueue->push(cmd);
} }
void ScopeVis::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly) void ScopeVis::feed(const SampleVector::const_iterator& cbegin, const SampleVector::const_iterator& end, bool positiveOnly)
{ {
SampleVector::const_iterator begin(cbegin);
if (m_triggerChannel == TriggerFreeRun) { if (m_triggerChannel == TriggerFreeRun) {
m_triggerPoint = begin; m_triggerPoint = begin;
} }

View File

@ -13,7 +13,7 @@ SpectrumScopeComboVis::~SpectrumScopeComboVis()
{ {
} }
void SpectrumScopeComboVis::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly) void SpectrumScopeComboVis::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly)
{ {
m_scopeVis->feed(begin, end, false); m_scopeVis->feed(begin, end, false);
SampleVector::const_iterator triggerPoint = m_scopeVis->getTriggerPoint(); SampleVector::const_iterator triggerPoint = m_scopeVis->getTriggerPoint();

View File

@ -38,7 +38,7 @@ void SpectrumVis::configure(MessageQueue* msgQueue, int fftSize, int overlapPerc
msgQueue->push(cmd); msgQueue->push(cmd);
} }
void SpectrumVis::feedTriggered(SampleVector::const_iterator triggerPoint, SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly) void SpectrumVis::feedTriggered(const SampleVector::const_iterator& triggerPoint, const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly)
{ {
feed(triggerPoint, end, positiveOnly); // normal feed from trigger point feed(triggerPoint, end, positiveOnly); // normal feed from trigger point
/* /*
@ -59,21 +59,31 @@ void SpectrumVis::feedTriggered(SampleVector::const_iterator triggerPoint, Sampl
}*/ }*/
} }
void SpectrumVis::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly) void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleVector::const_iterator& end, bool positiveOnly)
{ {
// if no visualisation is set, send the samples to /dev/null // if no visualisation is set, send the samples to /dev/null
if(m_glSpectrum == NULL)
return;
while(begin < end) { if(m_glSpectrum == 0)
{
return;
}
SampleVector::const_iterator begin(cbegin);
while (begin < end)
{
std::size_t todo = end - begin; std::size_t todo = end - begin;
std::size_t samplesNeeded = m_refillSize - m_fftBufferFill; std::size_t samplesNeeded = m_refillSize - m_fftBufferFill;
if(todo >= samplesNeeded) { if (todo >= samplesNeeded)
{
// fill up the buffer // fill up the buffer
std::vector<Complex>::iterator it = m_fftBuffer.begin() + m_fftBufferFill; std::vector<Complex>::iterator it = m_fftBuffer.begin() + m_fftBufferFill;
for(std::size_t i = 0; i < samplesNeeded; ++i, ++begin)
for (std::size_t i = 0; i < samplesNeeded; ++i, ++begin)
{
*it++ = Complex(begin->real() / 32768.0, begin->imag() / 32768.0); *it++ = Complex(begin->real() / 32768.0, begin->imag() / 32768.0);
}
// apply fft window (and copy from m_fftBuffer to m_fftIn) // apply fft window (and copy from m_fftBuffer to m_fftIn)
m_window.apply(&m_fftBuffer[0], m_fft->in()); m_window.apply(&m_fftBuffer[0], m_fft->in());
@ -89,16 +99,21 @@ void SpectrumVis::feed(SampleVector::const_iterator begin, SampleVector::const_i
Real v; Real v;
std::size_t halfSize = m_fftSize / 2; std::size_t halfSize = m_fftSize / 2;
if ( positiveOnly ) { if ( positiveOnly )
for(std::size_t i = 0; i < halfSize; i++) { {
for (std::size_t i = 0; i < halfSize; i++)
{
c = fftOut[i]; c = fftOut[i];
v = c.real() * c.real() + c.imag() * c.imag(); v = c.real() * c.real() + c.imag() * c.imag();
v = mult * log2f(v) + ofs; v = mult * log2f(v) + ofs;
m_logPowerSpectrum[i * 2] = v; m_logPowerSpectrum[i * 2] = v;
m_logPowerSpectrum[i * 2 + 1] = v; m_logPowerSpectrum[i * 2 + 1] = v;
} }
} else { }
for(std::size_t i = 0; i < halfSize; i++) { else
{
for (std::size_t i = 0; i < halfSize; i++)
{
c = fftOut[i + halfSize]; c = fftOut[i + halfSize];
v = c.real() * c.real() + c.imag() * c.imag(); v = c.real() * c.real() + c.imag() * c.imag();
v = mult * log2f(v) + ofs; v = mult * log2f(v) + ofs;
@ -120,10 +135,15 @@ void SpectrumVis::feed(SampleVector::const_iterator begin, SampleVector::const_i
// start over // start over
m_fftBufferFill = m_overlapSize; m_fftBufferFill = m_overlapSize;
m_needMoreSamples = false; m_needMoreSamples = false;
} else { }
else
{
// not enough samples for FFT - just fill in new data and return // not enough samples for FFT - just fill in new data and return
for(std::vector<Complex>::iterator it = m_fftBuffer.begin() + m_fftBufferFill; begin < end; ++begin) for(std::vector<Complex>::iterator it = m_fftBuffer.begin() + m_fftBufferFill; begin < end; ++begin)
{
*it++ = Complex(begin->real() / 32768.0, begin->imag() / 32768.0); *it++ = Complex(begin->real() / 32768.0, begin->imag() / 32768.0);
}
m_fftBufferFill += todo; m_fftBufferFill += todo;
m_needMoreSamples = true; m_needMoreSamples = true;
} }