Experimental zoomed FFT resolution improvements

This commit is contained in:
Charles J. Cliffe 2015-01-31 22:27:11 -05:00
parent 19829b6ceb
commit 27b890c882
4 changed files with 22 additions and 13 deletions

View File

@ -29,7 +29,7 @@ bool CubicSDR::OnInit() {
sdrThread = new SDRThread(threadCmdQueueSDR); sdrThread = new SDRThread(threadCmdQueueSDR);
sdrPostThread = new SDRPostThread(); sdrPostThread = new SDRPostThread();
sdrPostThread->setNumVisSamples(2048); sdrPostThread->setNumVisSamples(16384);
iqPostDataQueue = new SDRThreadIQDataQueue; iqPostDataQueue = new SDRThreadIQDataQueue;
iqVisualQueue = new DemodulatorThreadInputQueue; iqVisualQueue = new DemodulatorThreadInputQueue;

View File

@ -11,7 +11,7 @@ const char filePathSeparator =
#endif #endif
#ifdef __APPLE__ #ifdef __APPLE__
#define BUF_SIZE (16384*2) #define BUF_SIZE (16384*6)
#define DEFAULT_SAMPLE_RATE 2000000 #define DEFAULT_SAMPLE_RATE 2000000
#endif #endif
#ifdef __linux__ #ifdef __linux__

View File

@ -6,7 +6,7 @@
#include <deque> #include <deque>
SDRPostThread::SDRPostThread() : SDRPostThread::SDRPostThread() :
iqDataOutQueue(NULL), iqDataInQueue(NULL), iqVisualQueue(NULL), terminated(false), dcFilter(NULL), num_vis_samples(2048) { iqDataOutQueue(NULL), iqDataInQueue(NULL), iqVisualQueue(NULL), terminated(false), dcFilter(NULL), num_vis_samples(16384) {
} }
SDRPostThread::~SDRPostThread() { SDRPostThread::~SDRPostThread() {

View File

@ -409,6 +409,15 @@ void WaterfallCanvas::setData(DemodulatorThreadIQData *input) {
return; return;
} }
resamplerRatio = (double) (bandwidth) / (double) input->sampleRate;
int desired_input_size = fft_size / resamplerRatio;
if (input->data.size() < desired_input_size) {
std::cout << "fft underflow, desired: " << desired_input_size << " actual:" << input->data.size() << std::endl;
desired_input_size = input->data.size();
}
if (centerFreq != input->frequency) { if (centerFreq != input->frequency) {
if ((centerFreq - input->frequency) != shiftFrequency || lastInputBandwidth != input->sampleRate) { if ((centerFreq - input->frequency) != shiftFrequency || lastInputBandwidth != input->sampleRate) {
if (abs(input->frequency - centerFreq) < (wxGetApp().getSampleRate() / 2)) { if (abs(input->frequency - centerFreq) < (wxGetApp().getSampleRate() / 2)) {
@ -418,25 +427,23 @@ void WaterfallCanvas::setData(DemodulatorThreadIQData *input) {
} }
} }
if (shiftBuffer.size() != input->data.size()) { if (shiftBuffer.size() != desired_input_size) {
if (shiftBuffer.capacity() < input->data.size()) { if (shiftBuffer.capacity() < desired_input_size) {
shiftBuffer.reserve(input->data.size()); shiftBuffer.reserve(desired_input_size);
} }
shiftBuffer.resize(input->data.size()); shiftBuffer.resize(desired_input_size);
} }
if (shiftFrequency < 0) { if (shiftFrequency < 0) {
nco_crcf_mix_block_up(freqShifter, &input->data[0], &shiftBuffer[0], input->data.size()); nco_crcf_mix_block_up(freqShifter, &input->data[0], &shiftBuffer[0], desired_input_size);
} else { } else {
nco_crcf_mix_block_down(freqShifter, &input->data[0], &shiftBuffer[0], input->data.size()); nco_crcf_mix_block_down(freqShifter, &input->data[0], &shiftBuffer[0], desired_input_size);
} }
} else { } else {
shiftBuffer.assign(input->data.begin(), input->data.end()); shiftBuffer.assign(input->data.begin(), input->data.end());
} }
if (!resampler || bandwidth != lastBandwidth || lastInputBandwidth != input->sampleRate) { if (!resampler || bandwidth != lastBandwidth || lastInputBandwidth != input->sampleRate) {
resamplerRatio = (double) (bandwidth) / (double) input->sampleRate;
float As = 120.0f; float As = 120.0f;
if (resampler) { if (resampler) {
@ -448,7 +455,8 @@ void WaterfallCanvas::setData(DemodulatorThreadIQData *input) {
lastInputBandwidth = input->sampleRate; lastInputBandwidth = input->sampleRate;
} }
int out_size = ceil((double) (input->data.size()) * resamplerRatio) + 512;
int out_size = ceil((double) (desired_input_size) * resamplerRatio) + 512;
if (resampleBuffer.size() != out_size) { if (resampleBuffer.size() != out_size) {
if (resampleBuffer.capacity() < out_size) { if (resampleBuffer.capacity() < out_size) {
@ -457,7 +465,8 @@ void WaterfallCanvas::setData(DemodulatorThreadIQData *input) {
resampleBuffer.resize(out_size); resampleBuffer.resize(out_size);
} }
msresamp_crcf_execute(resampler, &shiftBuffer[0], input->data.size(), &resampleBuffer[0], &num_written);
msresamp_crcf_execute(resampler, &shiftBuffer[0], desired_input_size, &resampleBuffer[0], &num_written);
resampleBuffer.resize(fft_size); resampleBuffer.resize(fft_size);