mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2024-09-20 12:26:57 -04: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);
|
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;
|
||||||
|
@ -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__
|
||||||
|
@ -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() {
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user