From 0f8065f48a85c5df54eb5f2a1dc5c87f1ab1a9de Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 1 Dec 2015 00:59:11 -0500 Subject: [PATCH] FSK tweaks, minimum bandwidth adjust --- src/AppFrame.cpp | 1 + src/demod/DemodulatorMgr.cpp | 4 +-- src/modules/modem/Modem.h | 2 ++ src/modules/modem/ModemAnalog.cpp | 4 +-- src/modules/modem/ModemDigital.cpp | 4 +-- src/modules/modem/analog/ModemLSB.cpp | 4 +-- src/modules/modem/analog/ModemUSB.cpp | 4 +-- src/modules/modem/digital/ModemFSK.cpp | 33 +++++++++++++++---------- src/modules/modem/digital/ModemFSK.h | 5 ++-- src/modules/modem/digital/ModemGMSK.cpp | 4 +-- src/visual/WaterfallCanvas.cpp | 11 +++++---- src/visual/WaterfallCanvas.h | 2 ++ 12 files changed, 46 insertions(+), 32 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 82deeac..69cf74e 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -120,6 +120,7 @@ AppFrame::AppFrame() : demodWaterfallCanvas->setup(1024, 128); demodWaterfallCanvas->setView(wxGetApp().getConfig()->getCenterFreq(), 300000); demodWaterfallCanvas->attachSpectrumCanvas(demodSpectrumCanvas); + demodWaterfallCanvas->setMinBandwidth(8000); demodSpectrumCanvas->attachWaterfallCanvas(demodWaterfallCanvas); demodVisuals->Add(demodWaterfallCanvas, 6, wxEXPAND | wxALL, 0); wxGetApp().getDemodSpectrumProcessor()->attachOutput(demodWaterfallCanvas->getVisualDataQueue()); diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index 618c5d0..106d31a 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -173,8 +173,8 @@ int DemodulatorMgr::getLastBandwidth() const { } void DemodulatorMgr::setLastBandwidth(int lastBandwidth) { - if (lastBandwidth < 1500) { - lastBandwidth = 1500; + if (lastBandwidth < MIN_BANDWIDTH) { + lastBandwidth = MIN_BANDWIDTH; } else if (lastBandwidth > wxGetApp().getSampleRate()) { lastBandwidth = wxGetApp().getSampleRate(); } diff --git a/src/modules/modem/Modem.h b/src/modules/modem/Modem.h index d9ffb4c..0ce8d46 100644 --- a/src/modules/modem/Modem.h +++ b/src/modules/modem/Modem.h @@ -6,6 +6,8 @@ #include #include +#define MIN_BANDWIDTH 500 + class ModemKit { public: ModemKit() : sampleRate(0), audioSampleRate(0) { diff --git a/src/modules/modem/ModemAnalog.cpp b/src/modules/modem/ModemAnalog.cpp index 77e1957..fc98ad8 100644 --- a/src/modules/modem/ModemAnalog.cpp +++ b/src/modules/modem/ModemAnalog.cpp @@ -9,8 +9,8 @@ std::string ModemAnalog::getType() { } int ModemAnalog::checkSampleRate(long long sampleRate, int audioSampleRate) { - if (sampleRate < 1500) { - return 1500; + if (sampleRate < MIN_BANDWIDTH) { + return MIN_BANDWIDTH; } return sampleRate; } diff --git a/src/modules/modem/ModemDigital.cpp b/src/modules/modem/ModemDigital.cpp index aa8e123..a5ec509 100644 --- a/src/modules/modem/ModemDigital.cpp +++ b/src/modules/modem/ModemDigital.cpp @@ -20,8 +20,8 @@ std::string ModemDigital::getType() { } int ModemDigital::checkSampleRate(long long sampleRate, int audioSampleRate) { - if (sampleRate < 1500) { - return 1500; + if (sampleRate < MIN_BANDWIDTH) { + return MIN_BANDWIDTH; } return sampleRate; } diff --git a/src/modules/modem/analog/ModemLSB.cpp b/src/modules/modem/analog/ModemLSB.cpp index 7e38f15..31d86a3 100644 --- a/src/modules/modem/analog/ModemLSB.cpp +++ b/src/modules/modem/analog/ModemLSB.cpp @@ -20,8 +20,8 @@ ModemLSB::~ModemLSB() { } int ModemLSB::checkSampleRate(long long sampleRate, int audioSampleRate) { - if (sampleRate < 1500) { - return 1500; + if (sampleRate < MIN_BANDWIDTH) { + return MIN_BANDWIDTH; } if (sampleRate % 2 == 0) { return sampleRate; diff --git a/src/modules/modem/analog/ModemUSB.cpp b/src/modules/modem/analog/ModemUSB.cpp index be1c9bd..8f3202b 100644 --- a/src/modules/modem/analog/ModemUSB.cpp +++ b/src/modules/modem/analog/ModemUSB.cpp @@ -20,8 +20,8 @@ ModemUSB::~ModemUSB() { } int ModemUSB::checkSampleRate(long long sampleRate, int audioSampleRate) { - if (sampleRate < 1500) { - return 1500; + if (sampleRate < MIN_BANDWIDTH) { + return MIN_BANDWIDTH; } if (sampleRate % 2 == 0) { return sampleRate; diff --git a/src/modules/modem/digital/ModemFSK.cpp b/src/modules/modem/digital/ModemFSK.cpp index f7f856e..9aef453 100644 --- a/src/modules/modem/digital/ModemFSK.cpp +++ b/src/modules/modem/digital/ModemFSK.cpp @@ -5,6 +5,7 @@ ModemFSK::ModemFSK() : ModemDigital() { // DMR defaults? bps = 1; sps = 9600; + bw = 0.45; outStream << std::hex; } @@ -35,6 +36,7 @@ ModemArgInfoList ModemFSK::getSettings() { bpsArg.value = std::to_string(bps); bpsArg.description = "Modem bits-per-symbol"; bpsArg.type = ModemArgInfo::STRING; + bpsArg.units = "bits"; std::vector bpsOpts; bpsOpts.push_back("1"); @@ -51,21 +53,20 @@ ModemArgInfoList ModemFSK::getSettings() { spsArg.name = "Symbols/second"; spsArg.value = std::to_string(sps); spsArg.description = "Modem symbols-per-second"; - spsArg.type = ModemArgInfo::STRING; - + spsArg.type = ModemArgInfo::INT; + spsArg.range = ModemRange(10,115200); std::vector spsOpts; - // some common modem rates ..? - spsOpts.push_back("300"); - spsOpts.push_back("600"); - spsOpts.push_back("1200"); - spsOpts.push_back("2400"); - spsOpts.push_back("4800"); - spsOpts.push_back("9600"); - spsOpts.push_back("19200"); - spsOpts.push_back("38400"); - spsArg.options = spsOpts; args.push_back(spsArg); + + ModemArgInfo bwArg; + bwArg.key = "bw"; + bwArg.name = "Signal bandwidth"; + bwArg.value = std::to_string(bw); + bwArg.description = "Total signal bandwidth"; + bwArg.type = ModemArgInfo::FLOAT; + bwArg.range = ModemRange(0.1,0.49); + args.push_back(bwArg); return args; } @@ -77,6 +78,9 @@ void ModemFSK::writeSetting(std::string setting, std::string value) { } else if (setting == "sps") { sps = std::stoi(value); rebuildKit(); + } else if (setting == "bw") { + bw = std::stof(value); + rebuildKit(); } } @@ -85,6 +89,8 @@ std::string ModemFSK::readSetting(std::string setting) { return std::to_string(bps); } else if (setting == "sps") { return std::to_string(sps); + } else if (setting == "bw") { + return std::to_string(bw); } return ""; } @@ -93,8 +99,9 @@ ModemKit *ModemFSK::buildKit(long long sampleRate, int audioSampleRate) { ModemKitFSK *dkit = new ModemKitFSK; dkit->m = bps; dkit->k = sampleRate / sps; + dkit->bw = bw; - dkit->demodFSK = fskdem_create(dkit->m, dkit->k, 0.45); + dkit->demodFSK = fskdem_create(dkit->m, dkit->k, dkit->bw); dkit->sampleRate = sampleRate; dkit->audioSampleRate = audioSampleRate; diff --git a/src/modules/modem/digital/ModemFSK.h b/src/modules/modem/digital/ModemFSK.h index 03c1d24..332681f 100644 --- a/src/modules/modem/digital/ModemFSK.h +++ b/src/modules/modem/digital/ModemFSK.h @@ -5,6 +5,7 @@ class ModemKitFSK : public ModemKitDigital { public: unsigned int m, k; + float bw; fskdem demodFSK; std::vector inputBuffer; @@ -33,7 +34,7 @@ public: void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); private: - int sps; - int bps; + int sps, bps; + float bw; }; diff --git a/src/modules/modem/digital/ModemGMSK.cpp b/src/modules/modem/digital/ModemGMSK.cpp index 166641d..9786103 100644 --- a/src/modules/modem/digital/ModemGMSK.cpp +++ b/src/modules/modem/digital/ModemGMSK.cpp @@ -21,8 +21,8 @@ Modem *ModemGMSK::factory() { } int ModemGMSK::checkSampleRate(long long sampleRate, int audioSampleRate) { - if (sampleRate < 1500) { - return 1500; + if (sampleRate < MIN_BANDWIDTH) { + return MIN_BANDWIDTH; } return sampleRate; } diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index 3594900..6f4ed05 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -17,8 +17,6 @@ #include -#define MIN_BANDWIDTH 1500 - wxBEGIN_EVENT_TABLE(WaterfallCanvas, wxGLCanvas) EVT_PAINT(WaterfallCanvas::OnPaint) EVT_KEY_DOWN(WaterfallCanvas::OnKeyDown) @@ -44,6 +42,7 @@ WaterfallCanvas::WaterfallCanvas(wxWindow *parent, int *attribList) : preBuf = false; SetCursor(wxCURSOR_CROSS); scaleMove = 0; + minBandwidth = 30000; } WaterfallCanvas::~WaterfallCanvas() { @@ -179,8 +178,8 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { if (currentZoom < 1) { bw = (long long) ceil((long double) bw * currentZoom); - if (bw < 30000) { - bw = 30000; + if (bw < minBandwidth) { + bw = minBandwidth; } if (mouseInView) { long long mfreqA = getFrequencyAt(mpos); @@ -852,4 +851,6 @@ void WaterfallCanvas::setLinesPerSecond(int lps) { tex_update.unlock(); } - +void WaterfallCanvas::setMinBandwidth(int min) { + minBandwidth = min; +} diff --git a/src/visual/WaterfallCanvas.h b/src/visual/WaterfallCanvas.h index 093036d..89333f0 100644 --- a/src/visual/WaterfallCanvas.h +++ b/src/visual/WaterfallCanvas.h @@ -30,6 +30,7 @@ public: SpectrumVisualDataQueue *getVisualDataQueue(); void setLinesPerSecond(int lps); + void setMinBandwidth(int min); private: void OnPaint(wxPaintEvent& event); @@ -75,6 +76,7 @@ private: double lpsIndex; bool preBuf; std::mutex tex_update; + int minBandwidth; // event table wxDECLARE_EVENT_TABLE(); };