mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-02-03 09:44:26 -05:00
Experimental zoomed FFT resolution improvements
This commit is contained in:
parent
19829b6ceb
commit
27b890c882
@ -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;
|
||||
|
@ -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__
|
||||
|
@ -6,7 +6,7 @@
|
||||
#include <deque>
|
||||
|
||||
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() {
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user