mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-08-22 23:12:27 -04:00
attempt to fix waterfall stutter working parts
This commit is contained in:
parent
7288912878
commit
2e6b173fb1
@ -264,6 +264,7 @@ SET (cubicsdr_sources
|
|||||||
src/process/ScopeVisualProcessor.cpp
|
src/process/ScopeVisualProcessor.cpp
|
||||||
src/process/SpectrumVisualProcessor.cpp
|
src/process/SpectrumVisualProcessor.cpp
|
||||||
src/process/FFTVisualDataThread.cpp
|
src/process/FFTVisualDataThread.cpp
|
||||||
|
src/process/FFTDataDistributor.cpp
|
||||||
src/process/SpectrumVisualDataThread.cpp
|
src/process/SpectrumVisualDataThread.cpp
|
||||||
src/ui/GLPanel.cpp
|
src/ui/GLPanel.cpp
|
||||||
external/rtaudio/RtAudio.cpp
|
external/rtaudio/RtAudio.cpp
|
||||||
@ -319,6 +320,7 @@ SET (cubicsdr_headers
|
|||||||
src/process/ScopeVisualProcessor.h
|
src/process/ScopeVisualProcessor.h
|
||||||
src/process/SpectrumVisualProcessor.h
|
src/process/SpectrumVisualProcessor.h
|
||||||
src/process/FFTVisualDataThread.h
|
src/process/FFTVisualDataThread.h
|
||||||
|
src/process/FFTDataDistributor.h
|
||||||
src/process/SpectrumVisualDataThread.h
|
src/process/SpectrumVisualDataThread.h
|
||||||
src/ui/GLPanel.h
|
src/ui/GLPanel.h
|
||||||
src/ui/UITestCanvas.cpp
|
src/ui/UITestCanvas.cpp
|
||||||
|
81
src/process/FFTDataDistributor.cpp
Normal file
81
src/process/FFTDataDistributor.cpp
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
22
src/process/FFTDataDistributor.h
Normal file
22
src/process/FFTDataDistributor.h
Normal file
@ -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) {
|
while(!terminated) {
|
||||||
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(12));
|
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||||
|
|
||||||
int fftSize = wproc.getDesiredInputSize();
|
int fftSize = wproc.getDesiredInputSize();
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "IOThread.h"
|
#include "IOThread.h"
|
||||||
#include "SpectrumVisualProcessor.h"
|
#include "SpectrumVisualProcessor.h"
|
||||||
|
#include "FFTDataDistributor.h"
|
||||||
|
|
||||||
class FFTVisualDataThread : public IOThread {
|
class FFTVisualDataThread : public IOThread {
|
||||||
public:
|
public:
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include <deque>
|
#include <deque>
|
||||||
|
|
||||||
SDRPostThread::SDRPostThread() : IOThread(),
|
SDRPostThread::SDRPostThread() : IOThread(),
|
||||||
iqDataInQueue(NULL), iqDataOutQueue(NULL), iqVisualQueue(NULL), dcFilter(NULL), num_vis_samples(16384*2) {
|
iqDataInQueue(NULL), iqDataOutQueue(NULL), iqVisualQueue(NULL), dcFilter(NULL){
|
||||||
|
|
||||||
swapIQ.store(false);
|
swapIQ.store(false);
|
||||||
|
|
||||||
@ -50,14 +50,6 @@ void SDRPostThread::removeDemodulator(DemodulatorInstance *demod) {
|
|||||||
busy_demod.unlock();
|
busy_demod.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRPostThread::setNumVisSamples(int num_vis_samples_in) {
|
|
||||||
num_vis_samples = num_vis_samples_in;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SDRPostThread::getNumVisSamples() {
|
|
||||||
return num_vis_samples;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SDRPostThread::setSwapIQ(bool swapIQ) {
|
void SDRPostThread::setSwapIQ(bool swapIQ) {
|
||||||
this->swapIQ.store(swapIQ);
|
this->swapIQ.store(swapIQ);
|
||||||
}
|
}
|
||||||
@ -93,7 +85,6 @@ void SDRPostThread::run() {
|
|||||||
|
|
||||||
iqDataInQueue->pop(data_in);
|
iqDataInQueue->pop(data_in);
|
||||||
// std::lock_guard < std::mutex > lock(data_in->m_mutex);
|
// std::lock_guard < std::mutex > lock(data_in->m_mutex);
|
||||||
int num_vis_samples = this->num_vis_samples;
|
|
||||||
|
|
||||||
if (data_in && data_in->data.size()) {
|
if (data_in && data_in->data.size()) {
|
||||||
int dataSize = data_in->data.size()/2;
|
int dataSize = data_in->data.size()/2;
|
||||||
@ -118,21 +109,19 @@ void SDRPostThread::run() {
|
|||||||
|
|
||||||
iirfilt_crcf_execute_block(dcFilter, &fpData[0], dataSize, &dataOut[0]);
|
iirfilt_crcf_execute_block(dcFilter, &fpData[0], dataSize, &dataOut[0]);
|
||||||
|
|
||||||
if (iqVisualQueue != NULL && iqVisualQueue->empty()) {
|
if (iqVisualQueue != NULL && !iqVisualQueue->full()) {
|
||||||
DemodulatorThreadIQData *visualDataOut = visualDataBuffers.getBuffer();
|
DemodulatorThreadIQData *visualDataOut = visualDataBuffers.getBuffer();
|
||||||
visualDataOut->setRefCount(1);
|
visualDataOut->setRefCount(1);
|
||||||
|
|
||||||
if (num_vis_samples > dataOut.size()) {
|
int num_vis_samples = dataOut.size();
|
||||||
num_vis_samples = dataOut.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (visualDataOut->data.size() < num_vis_samples) {
|
// if (visualDataOut->data.size() < num_vis_samples) {
|
||||||
if (visualDataOut->data.capacity() < num_vis_samples) {
|
// if (visualDataOut->data.capacity() < num_vis_samples) {
|
||||||
visualDataOut->data.reserve(num_vis_samples);
|
// visualDataOut->data.reserve(num_vis_samples);
|
||||||
}
|
// }
|
||||||
visualDataOut->data.resize(num_vis_samples);
|
// visualDataOut->data.resize(num_vis_samples);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
visualDataOut->frequency = data_in->frequency;
|
visualDataOut->frequency = data_in->frequency;
|
||||||
visualDataOut->sampleRate = data_in->sampleRate;
|
visualDataOut->sampleRate = data_in->sampleRate;
|
||||||
visualDataOut->data.assign(dataOut.begin(), dataOut.begin() + num_vis_samples);
|
visualDataOut->data.assign(dataOut.begin(), dataOut.begin() + num_vis_samples);
|
||||||
|
@ -11,9 +11,6 @@ public:
|
|||||||
void bindDemodulator(DemodulatorInstance *demod);
|
void bindDemodulator(DemodulatorInstance *demod);
|
||||||
void removeDemodulator(DemodulatorInstance *demod);
|
void removeDemodulator(DemodulatorInstance *demod);
|
||||||
|
|
||||||
void setNumVisSamples(int num_vis_samples_in);
|
|
||||||
int getNumVisSamples();
|
|
||||||
|
|
||||||
void setSwapIQ(bool swapIQ);
|
void setSwapIQ(bool swapIQ);
|
||||||
bool getSwapIQ();
|
bool getSwapIQ();
|
||||||
|
|
||||||
@ -28,7 +25,6 @@ protected:
|
|||||||
std::mutex busy_demod;
|
std::mutex busy_demod;
|
||||||
std::vector<DemodulatorInstance *> demodulators;
|
std::vector<DemodulatorInstance *> demodulators;
|
||||||
iirfilt_crcf dcFilter;
|
iirfilt_crcf dcFilter;
|
||||||
int num_vis_samples;
|
|
||||||
std::atomic_bool swapIQ;
|
std::atomic_bool swapIQ;
|
||||||
ReBuffer<DemodulatorThreadIQData> visualDataBuffers;
|
ReBuffer<DemodulatorThreadIQData> visualDataBuffers;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user