From 27b890c8825bb9724c1dd3d558aafc0e390a03b9 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sat, 31 Jan 2015 22:27:11 -0500 Subject: [PATCH] Experimental zoomed FFT resolution improvements --- src/CubicSDR.cpp | 2 +- src/CubicSDRDefs.h | 2 +- src/sdr/SDRPostThread.cpp | 2 +- src/visual/WaterfallCanvas.cpp | 29 +++++++++++++++++++---------- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 4f428ca..3ae5cfa 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -29,7 +29,7 @@ bool CubicSDR::OnInit() { sdrThread = new SDRThread(threadCmdQueueSDR); sdrPostThread = new SDRPostThread(); - sdrPostThread->setNumVisSamples(2048); + sdrPostThread->setNumVisSamples(16384); iqPostDataQueue = new SDRThreadIQDataQueue; iqVisualQueue = new DemodulatorThreadInputQueue; diff --git a/src/CubicSDRDefs.h b/src/CubicSDRDefs.h index 296bf2d..88b5cbe 100644 --- a/src/CubicSDRDefs.h +++ b/src/CubicSDRDefs.h @@ -11,7 +11,7 @@ const char filePathSeparator = #endif #ifdef __APPLE__ -#define BUF_SIZE (16384*2) +#define BUF_SIZE (16384*6) #define DEFAULT_SAMPLE_RATE 2000000 #endif #ifdef __linux__ diff --git a/src/sdr/SDRPostThread.cpp b/src/sdr/SDRPostThread.cpp index 6951d61..2b3b76a 100644 --- a/src/sdr/SDRPostThread.cpp +++ b/src/sdr/SDRPostThread.cpp @@ -6,7 +6,7 @@ #include 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() { diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index ab5fb01..ae63f3b 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -409,6 +409,15 @@ void WaterfallCanvas::setData(DemodulatorThreadIQData *input) { 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) != shiftFrequency || lastInputBandwidth != input->sampleRate) { 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.capacity() < input->data.size()) { - shiftBuffer.reserve(input->data.size()); + if (shiftBuffer.size() != desired_input_size) { + if (shiftBuffer.capacity() < desired_input_size) { + shiftBuffer.reserve(desired_input_size); } - shiftBuffer.resize(input->data.size()); + shiftBuffer.resize(desired_input_size); } 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 { - 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 { shiftBuffer.assign(input->data.begin(), input->data.end()); } if (!resampler || bandwidth != lastBandwidth || lastInputBandwidth != input->sampleRate) { - resamplerRatio = (double) (bandwidth) / (double) input->sampleRate; - float As = 120.0f; if (resampler) { @@ -448,7 +455,8 @@ void WaterfallCanvas::setData(DemodulatorThreadIQData *input) { 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.capacity() < out_size) { @@ -457,7 +465,8 @@ void WaterfallCanvas::setData(DemodulatorThreadIQData *input) { 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);