diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 9bc7183..abc07dc 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -719,7 +719,7 @@ void AppFrame::OnTimer(wxTimerEvent& event) { } else { fftDistrib.setFFTSize(DEFAULT_FFT_SIZE); } - + fftDistrib.setLinesPerSecond(15); fftDistrib.run(); wproc->setView(waterfallCanvas->getViewState()); diff --git a/src/process/SpectrumVisualProcessor.h b/src/process/SpectrumVisualProcessor.h index cfbd7dd..a757a88 100644 --- a/src/process/SpectrumVisualProcessor.h +++ b/src/process/SpectrumVisualProcessor.h @@ -3,6 +3,7 @@ #include "VisualProcessor.h" #include "DemodDefs.h" #include "fftw3.h" +#include class SpectrumVisualData : public ReferenceCounter { public: @@ -67,10 +68,17 @@ private: class FFTDataDistributor : public VisualProcessor { public: + FFTDataDistributor() : linesPerSecond(30) { + } + void setFFTSize(int fftSize) { this->fftSize = fftSize; } + void setLinesPerSecond(int lines) { + this->linesPerSecond = lines; + } + protected: void process() { while (!input->empty()) { @@ -79,14 +87,31 @@ protected: } DemodulatorThreadIQData *inp; input->pop(inp); + + // number of milliseconds contained in input + double inputTime = (double)inp->data.size() / (double)inp->sampleRate; + // number of lines in input + int inputLines = floor((double)inp->data.size()/(double)fftSize); + + // ratio required to achieve the desired rate + double lineRateStep = ((double)linesPerSecond * inputTime)/(double)inputLines; + if (inp) { if (inp->data.size() >= fftSize) { for (int i = 0, iMax = inp->data.size()-fftSize; i < iMax; i += fftSize) { - DemodulatorThreadIQData *outp = outputBuffers.getBuffer(); - outp->frequency = inp->frequency; - outp->sampleRate = inp->sampleRate; - outp->data.assign(inp->data.begin()+i,inp->data.begin()+i+fftSize); - distribute(outp); + lineRateAccum += lineRateStep; + + if (lineRateAccum >= 1.0) { + DemodulatorThreadIQData *outp = outputBuffers.getBuffer(); + outp->frequency = inp->frequency; + outp->sampleRate = inp->sampleRate; + outp->data.assign(inp->data.begin()+i,inp->data.begin()+i+fftSize); + distribute(outp); + + while (lineRateAccum > 1.0) { + lineRateAccum -= 1.0; + } + } } } inp->decRefCount(); @@ -96,4 +121,6 @@ protected: ReBuffer outputBuffers; int fftSize; + int linesPerSecond; + double lineRateAccum; };