mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2026-06-01 21:54:39 -04:00
Move waterfall FFT processing to it's own thread.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user