mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2026-06-02 22:14:47 -04:00
attempt to fix waterfall stutter working parts
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
#include "FFTDataDistributor.h"
|
||||
|
||||
FFTDataDistributor::FFTDataDistributor() : linesPerSecond(DEFAULT_WATERFALL_LPS), lineRateAccum(0.0), fftSize(DEFAULT_FFT_SIZE) {
|
||||
}
|
||||
|
||||
void FFTDataDistributor::setFFTSize(int fftSize) {
|
||||
this->fftSize = fftSize;
|
||||
}
|
||||
|
||||
void FFTDataDistributor::setLinesPerSecond(int lines) {
|
||||
this->linesPerSecond = lines;
|
||||
}
|
||||
|
||||
int FFTDataDistributor::getLinesPerSecond() {
|
||||
return this->linesPerSecond;
|
||||
}
|
||||
|
||||
void FFTDataDistributor::process() {
|
||||
while (!input->empty()) {
|
||||
if (!isAnyOutputEmpty()) {
|
||||
return;
|
||||
}
|
||||
DemodulatorThreadIQData *inp;
|
||||
input->pop(inp);
|
||||
|
||||
if (inp) {
|
||||
if (inputBuffer.sampleRate != inp->sampleRate || inputBuffer.frequency != inp->frequency) {
|
||||
inputBuffer.sampleRate = inp->sampleRate;
|
||||
inputBuffer.frequency = inp->frequency;
|
||||
inputBuffer.data.assign(inp->data.begin(), inp->data.end());
|
||||
} else {
|
||||
inputBuffer.data.insert(inputBuffer.data.end(), inp->data.begin(), inp->data.end());
|
||||
}
|
||||
inp->decRefCount();
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
// number of seconds contained in input
|
||||
double inputTime = (double)inputBuffer.data.size() / (double)inputBuffer.sampleRate;
|
||||
// number of lines in input
|
||||
double inputLines = (double)inputBuffer.data.size()/(double)fftSize;
|
||||
|
||||
// ratio required to achieve the desired rate
|
||||
double lineRateStep = ((double)linesPerSecond * inputTime)/(double)inputLines;
|
||||
|
||||
if (inputBuffer.data.size() >= fftSize) {
|
||||
int numProcessed = 0;
|
||||
|
||||
// if (lineRateAccum + (lineRateStep * floor((double)inputBuffer.data.size()/(double)fftSize)) < 1.0) {
|
||||
// // move along, nothing to see here..
|
||||
// lineRateAccum += (lineRateStep * inputBuffer.data.size()/fftSize);
|
||||
// numProcessed = inputBuffer.data.size()/fftSize;
|
||||
// } else {
|
||||
for (int i = 0, iMax = inputBuffer.data.size(); i < iMax; i += fftSize) {
|
||||
if ((i + fftSize) > iMax) {
|
||||
break;
|
||||
}
|
||||
lineRateAccum += lineRateStep;
|
||||
|
||||
if (lineRateAccum >= 1.0) {
|
||||
DemodulatorThreadIQData *outp = outputBuffers.getBuffer();
|
||||
outp->frequency = inputBuffer.frequency;
|
||||
outp->sampleRate = inputBuffer.sampleRate;
|
||||
outp->data.assign(inputBuffer.data.begin()+i,inputBuffer.data.begin()+i+fftSize);
|
||||
distribute(outp);
|
||||
|
||||
while (lineRateAccum >= 1.0) {
|
||||
lineRateAccum -= 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
numProcessed += fftSize;
|
||||
}
|
||||
// }
|
||||
if (numProcessed) {
|
||||
inputBuffer.data.erase(inputBuffer.data.begin(), inputBuffer.data.begin() + numProcessed);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include "VisualProcessor.h"
|
||||
#include "DemodDefs.h"
|
||||
#include <cmath>
|
||||
|
||||
class FFTDataDistributor : public VisualProcessor<DemodulatorThreadIQData, DemodulatorThreadIQData> {
|
||||
public:
|
||||
FFTDataDistributor();
|
||||
void setFFTSize(int fftSize);
|
||||
void setLinesPerSecond(int lines);
|
||||
int getLinesPerSecond();
|
||||
|
||||
protected:
|
||||
void process();
|
||||
|
||||
DemodulatorThreadIQData inputBuffer, tempBuffer;
|
||||
ReBuffer<DemodulatorThreadIQData> outputBuffers;
|
||||
int fftSize;
|
||||
int linesPerSecond;
|
||||
double lineRateAccum;
|
||||
};
|
||||
@@ -37,7 +37,7 @@ void FFTVisualDataThread::run() {
|
||||
|
||||
while(!terminated) {
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(12));
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||
|
||||
int fftSize = wproc.getDesiredInputSize();
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "IOThread.h"
|
||||
#include "SpectrumVisualProcessor.h"
|
||||
#include "FFTDataDistributor.h"
|
||||
|
||||
class FFTVisualDataThread : public IOThread {
|
||||
public:
|
||||
|
||||
Reference in New Issue
Block a user