diff --git a/core/src/core.cpp b/core/src/core.cpp index 07d13488..8d601657 100644 --- a/core/src/core.cpp +++ b/core/src/core.cpp @@ -120,6 +120,7 @@ int sdrpp_main(int argc, char *argv[]) { defConfig["colorMap"] = "Classic"; defConfig["fastFFT"] = false; defConfig["fftHeight"] = 300; + defConfig["fftRate"] = 20; defConfig["fftSize"] = 65536; defConfig["fftWindow"] = 1; defConfig["frequency"] = 100000000.0; diff --git a/core/src/gui/menus/display.cpp b/core/src/gui/menus/display.cpp index 62e9049f..e42cd5b0 100644 --- a/core/src/gui/menus/display.cpp +++ b/core/src/gui/menus/display.cpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace displaymenu { bool showWaterfall; @@ -15,6 +16,7 @@ namespace displaymenu { std::string colorMapNamesTxt = ""; std::string colorMapAuthor = ""; int selectedWindow = 0; + int fftRate = 20; const int FFTSizes[] = { 65536, @@ -71,6 +73,9 @@ namespace displaymenu { } gui::mainWindow.setFFTSize(FFTSizes[fftSizeId]); + fftRate = core::configManager.conf["fftRate"]; + sigpath::signalPath.setFFTRate(fftRate); + selectedWindow = std::clamp((int)core::configManager.conf["fftWindow"], 0, _FFT_WINDOW_COUNT-1); gui::mainWindow.setFFTWindow(selectedWindow); } @@ -99,6 +104,17 @@ namespace displaymenu { core::configManager.release(true); } + ImGui::Text("FFT Framerate"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(menuWidth - ImGui::GetCursorPosX()); + if (ImGui::InputInt("##sdrpp_fft_rate", &fftRate, 1, 10)) { + std::clamp(fftRate, 1, 200); + sigpath::signalPath.setFFTRate(fftRate); + core::configManager.acquire(); + core::configManager.conf["fftRate"] = fftRate; + core::configManager.release(true); + } + ImGui::Text("FFT Size"); ImGui::SameLine(); ImGui::SetNextItemWidth(menuWidth - ImGui::GetCursorPosX()); diff --git a/core/src/signal_path/dsp.cpp b/core/src/signal_path/dsp.cpp index 6dfa553b..37f385e0 100644 --- a/core/src/signal_path/dsp.cpp +++ b/core/src/signal_path/dsp.cpp @@ -119,6 +119,15 @@ void SignalPath::setFFTSize(int size) { reshape.start(); } +void SignalPath::setFFTRate(double rate) { + fftRate = rate; + int skip = (sampleRate / fftRate) - fftSize; + reshape.stop(); + reshape.setSkip(skip); + reshape.setKeep(fftSize); + reshape.start(); +} + void SignalPath::startFFT() { reshape.start(); fftHandlerSink.start(); @@ -160,7 +169,6 @@ void SignalPath::setDecimation(int dec) { for (int i = 0; i < dec; i++) { dsp::HalfDecimator* decimator = new dsp::HalfDecimator((i == 0) ? &inputBuffer.out : &decimators[i-1]->out, &halfBandWindow); if (running) { decimator->start(); } - // TODO: ONLY start if running decimators.push_back(decimator); } split.setInput(&decimators[decimators.size()-1]->out); diff --git a/core/src/signal_path/dsp.h b/core/src/signal_path/dsp.h index 1d3b6ed1..a644850c 100644 --- a/core/src/signal_path/dsp.h +++ b/core/src/signal_path/dsp.h @@ -19,6 +19,7 @@ public: void bindIQStream(dsp::stream* stream); void unbindIQStream(dsp::stream* stream); void setFFTSize(int size); + void setFFTRate(double rate); void startFFT(); void stopFFT(); void setBuffering(bool enabled); diff --git a/radio/src/raw_demod.h b/radio/src/raw_demod.h index 5761d2ae..a39de794 100644 --- a/radio/src/raw_demod.h +++ b/radio/src/raw_demod.h @@ -40,19 +40,15 @@ public: _config->release(true); squelch.init(_vfo->output, squelchLevel); - - c2s.init(&squelch.out); } void start() { squelch.start(); - c2s.start(); running = true; } void stop() { squelch.stop(); - c2s.stop(); running = false; } @@ -88,7 +84,7 @@ public: } dsp::stream* getOutput() { - return &c2s.out; + return (dsp::stream*)&squelch.out; } void showMenu() { @@ -137,7 +133,6 @@ private: VFOManager::VFO* _vfo; dsp::Squelch squelch; - dsp::ComplexToStereo c2s; ConfigManager* _config;