Move waterfall FFT processing to it's own thread.

This commit is contained in:
Charles J. Cliffe
2015-08-14 19:17:43 -04:00
parent b73f264d6b
commit 8dc2e6cacc
10 changed files with 121 additions and 52 deletions
+68
View File
@@ -0,0 +1,68 @@
#include "FFTVisualDataThread.h"
#include "CubicSDR.h"
FFTVisualDataThread::FFTVisualDataThread() : linesPerSecond(DEFAULT_WATERFALL_LPS) {
lpsChanged.store(true);
}
FFTVisualDataThread::~FFTVisualDataThread() {
}
void FFTVisualDataThread::setLinesPerSecond(int lps) {
linesPerSecond.store(lps);
lpsChanged.store(true);
}
int FFTVisualDataThread::getLinesPerSecond() {
return linesPerSecond.load();
}
SpectrumVisualProcessor *FFTVisualDataThread::getProcessor() {
return &wproc;
}
void FFTVisualDataThread::run() {
DemodulatorThreadInputQueue *pipeIQDataIn = (DemodulatorThreadInputQueue *)getInputQueue("IQDataInput");
SpectrumVisualDataQueue *pipeFFTDataOut = (SpectrumVisualDataQueue *)getOutputQueue("FFTDataOutput");
fftDistrib.setInput(pipeIQDataIn);
fftDistrib.attachOutput(&fftQueue);
wproc.setInput(&fftQueue);
wproc.attachOutput(pipeFFTDataOut);
wproc.setup(2048);
std::cout << "FFT visual data thread started." << std::endl;
while(!terminated) {
#ifndef _WIN32
usleep(15000);
#else
Sleep(15);
#endif
int fftSize = wproc.getDesiredInputSize();
if (fftSize) {
fftDistrib.setFFTSize(fftSize);
} else {
fftDistrib.setFFTSize(DEFAULT_FFT_SIZE);
}
if (lpsChanged.load()) {
fftDistrib.setLinesPerSecond(linesPerSecond.load());
pipeIQDataIn->set_max_num_items(linesPerSecond.load());
lpsChanged.store(false);
}
fftDistrib.run();
while (!wproc.isInputEmpty()) {
wproc.run();
}
}
std::cout << "FFT visual data thread terminated." << std::endl;
}
+24
View File
@@ -0,0 +1,24 @@
#pragma once
#include "IOThread.h"
#include "SpectrumVisualProcessor.h"
class FFTVisualDataThread : public IOThread {
public:
FFTVisualDataThread();
~FFTVisualDataThread();
void setLinesPerSecond(int lps);
int getLinesPerSecond();
SpectrumVisualProcessor *getProcessor();
void run();
protected:
FFTDataDistributor fftDistrib;
DemodulatorThreadInputQueue fftQueue;
SpectrumVisualProcessor wproc;
std::atomic_int linesPerSecond;
std::atomic_bool lpsChanged;
};
+4 -1
View File
@@ -111,7 +111,10 @@ protected:
if (inp) {
if (inp->data.size() >= fftSize) {
for (int i = 0, iMax = inp->data.size()-fftSize; i <= iMax; i += fftSize) {
if (lineRateAccum + (lineRateStep * floor((double)inp->data.size()/(double)fftSize)) < 1.0) {
// move along, nothing to see here..
lineRateAccum += (lineRateStep * inp->data.size()/fftSize);
} else for (int i = 0, iMax = inp->data.size()-fftSize; i <= iMax; i += fftSize) {
lineRateAccum += lineRateStep;
if (lineRateAccum >= 1.0) {