mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-09-05 14:47:52 -04:00
FSK tweaks, minimum bandwidth adjust
This commit is contained in:
parent
76d69ffd78
commit
0f8065f48a
@ -120,6 +120,7 @@ AppFrame::AppFrame() :
|
|||||||
demodWaterfallCanvas->setup(1024, 128);
|
demodWaterfallCanvas->setup(1024, 128);
|
||||||
demodWaterfallCanvas->setView(wxGetApp().getConfig()->getCenterFreq(), 300000);
|
demodWaterfallCanvas->setView(wxGetApp().getConfig()->getCenterFreq(), 300000);
|
||||||
demodWaterfallCanvas->attachSpectrumCanvas(demodSpectrumCanvas);
|
demodWaterfallCanvas->attachSpectrumCanvas(demodSpectrumCanvas);
|
||||||
|
demodWaterfallCanvas->setMinBandwidth(8000);
|
||||||
demodSpectrumCanvas->attachWaterfallCanvas(demodWaterfallCanvas);
|
demodSpectrumCanvas->attachWaterfallCanvas(demodWaterfallCanvas);
|
||||||
demodVisuals->Add(demodWaterfallCanvas, 6, wxEXPAND | wxALL, 0);
|
demodVisuals->Add(demodWaterfallCanvas, 6, wxEXPAND | wxALL, 0);
|
||||||
wxGetApp().getDemodSpectrumProcessor()->attachOutput(demodWaterfallCanvas->getVisualDataQueue());
|
wxGetApp().getDemodSpectrumProcessor()->attachOutput(demodWaterfallCanvas->getVisualDataQueue());
|
||||||
|
@ -173,8 +173,8 @@ int DemodulatorMgr::getLastBandwidth() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DemodulatorMgr::setLastBandwidth(int lastBandwidth) {
|
void DemodulatorMgr::setLastBandwidth(int lastBandwidth) {
|
||||||
if (lastBandwidth < 1500) {
|
if (lastBandwidth < MIN_BANDWIDTH) {
|
||||||
lastBandwidth = 1500;
|
lastBandwidth = MIN_BANDWIDTH;
|
||||||
} else if (lastBandwidth > wxGetApp().getSampleRate()) {
|
} else if (lastBandwidth > wxGetApp().getSampleRate()) {
|
||||||
lastBandwidth = wxGetApp().getSampleRate();
|
lastBandwidth = wxGetApp().getSampleRate();
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
|
||||||
|
#define MIN_BANDWIDTH 500
|
||||||
|
|
||||||
class ModemKit {
|
class ModemKit {
|
||||||
public:
|
public:
|
||||||
ModemKit() : sampleRate(0), audioSampleRate(0) {
|
ModemKit() : sampleRate(0), audioSampleRate(0) {
|
||||||
|
@ -9,8 +9,8 @@ std::string ModemAnalog::getType() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ModemAnalog::checkSampleRate(long long sampleRate, int audioSampleRate) {
|
int ModemAnalog::checkSampleRate(long long sampleRate, int audioSampleRate) {
|
||||||
if (sampleRate < 1500) {
|
if (sampleRate < MIN_BANDWIDTH) {
|
||||||
return 1500;
|
return MIN_BANDWIDTH;
|
||||||
}
|
}
|
||||||
return sampleRate;
|
return sampleRate;
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,8 @@ std::string ModemDigital::getType() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ModemDigital::checkSampleRate(long long sampleRate, int audioSampleRate) {
|
int ModemDigital::checkSampleRate(long long sampleRate, int audioSampleRate) {
|
||||||
if (sampleRate < 1500) {
|
if (sampleRate < MIN_BANDWIDTH) {
|
||||||
return 1500;
|
return MIN_BANDWIDTH;
|
||||||
}
|
}
|
||||||
return sampleRate;
|
return sampleRate;
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,8 @@ ModemLSB::~ModemLSB() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ModemLSB::checkSampleRate(long long sampleRate, int audioSampleRate) {
|
int ModemLSB::checkSampleRate(long long sampleRate, int audioSampleRate) {
|
||||||
if (sampleRate < 1500) {
|
if (sampleRate < MIN_BANDWIDTH) {
|
||||||
return 1500;
|
return MIN_BANDWIDTH;
|
||||||
}
|
}
|
||||||
if (sampleRate % 2 == 0) {
|
if (sampleRate % 2 == 0) {
|
||||||
return sampleRate;
|
return sampleRate;
|
||||||
|
@ -20,8 +20,8 @@ ModemUSB::~ModemUSB() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ModemUSB::checkSampleRate(long long sampleRate, int audioSampleRate) {
|
int ModemUSB::checkSampleRate(long long sampleRate, int audioSampleRate) {
|
||||||
if (sampleRate < 1500) {
|
if (sampleRate < MIN_BANDWIDTH) {
|
||||||
return 1500;
|
return MIN_BANDWIDTH;
|
||||||
}
|
}
|
||||||
if (sampleRate % 2 == 0) {
|
if (sampleRate % 2 == 0) {
|
||||||
return sampleRate;
|
return sampleRate;
|
||||||
|
@ -5,6 +5,7 @@ ModemFSK::ModemFSK() : ModemDigital() {
|
|||||||
// DMR defaults?
|
// DMR defaults?
|
||||||
bps = 1;
|
bps = 1;
|
||||||
sps = 9600;
|
sps = 9600;
|
||||||
|
bw = 0.45;
|
||||||
outStream << std::hex;
|
outStream << std::hex;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,6 +36,7 @@ ModemArgInfoList ModemFSK::getSettings() {
|
|||||||
bpsArg.value = std::to_string(bps);
|
bpsArg.value = std::to_string(bps);
|
||||||
bpsArg.description = "Modem bits-per-symbol";
|
bpsArg.description = "Modem bits-per-symbol";
|
||||||
bpsArg.type = ModemArgInfo::STRING;
|
bpsArg.type = ModemArgInfo::STRING;
|
||||||
|
bpsArg.units = "bits";
|
||||||
|
|
||||||
std::vector<std::string> bpsOpts;
|
std::vector<std::string> bpsOpts;
|
||||||
bpsOpts.push_back("1");
|
bpsOpts.push_back("1");
|
||||||
@ -51,22 +53,21 @@ ModemArgInfoList ModemFSK::getSettings() {
|
|||||||
spsArg.name = "Symbols/second";
|
spsArg.name = "Symbols/second";
|
||||||
spsArg.value = std::to_string(sps);
|
spsArg.value = std::to_string(sps);
|
||||||
spsArg.description = "Modem symbols-per-second";
|
spsArg.description = "Modem symbols-per-second";
|
||||||
spsArg.type = ModemArgInfo::STRING;
|
spsArg.type = ModemArgInfo::INT;
|
||||||
|
spsArg.range = ModemRange(10,115200);
|
||||||
std::vector<std::string> spsOpts;
|
std::vector<std::string> 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);
|
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;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,6 +78,9 @@ void ModemFSK::writeSetting(std::string setting, std::string value) {
|
|||||||
} else if (setting == "sps") {
|
} else if (setting == "sps") {
|
||||||
sps = std::stoi(value);
|
sps = std::stoi(value);
|
||||||
rebuildKit();
|
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);
|
return std::to_string(bps);
|
||||||
} else if (setting == "sps") {
|
} else if (setting == "sps") {
|
||||||
return std::to_string(sps);
|
return std::to_string(sps);
|
||||||
|
} else if (setting == "bw") {
|
||||||
|
return std::to_string(bw);
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@ -93,8 +99,9 @@ ModemKit *ModemFSK::buildKit(long long sampleRate, int audioSampleRate) {
|
|||||||
ModemKitFSK *dkit = new ModemKitFSK;
|
ModemKitFSK *dkit = new ModemKitFSK;
|
||||||
dkit->m = bps;
|
dkit->m = bps;
|
||||||
dkit->k = sampleRate / sps;
|
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->sampleRate = sampleRate;
|
||||||
dkit->audioSampleRate = audioSampleRate;
|
dkit->audioSampleRate = audioSampleRate;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
class ModemKitFSK : public ModemKitDigital {
|
class ModemKitFSK : public ModemKitDigital {
|
||||||
public:
|
public:
|
||||||
unsigned int m, k;
|
unsigned int m, k;
|
||||||
|
float bw;
|
||||||
|
|
||||||
fskdem demodFSK;
|
fskdem demodFSK;
|
||||||
std::vector<liquid_float_complex> inputBuffer;
|
std::vector<liquid_float_complex> inputBuffer;
|
||||||
@ -33,7 +34,7 @@ public:
|
|||||||
void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut);
|
void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int sps;
|
int sps, bps;
|
||||||
int bps;
|
float bw;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -21,8 +21,8 @@ Modem *ModemGMSK::factory() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ModemGMSK::checkSampleRate(long long sampleRate, int audioSampleRate) {
|
int ModemGMSK::checkSampleRate(long long sampleRate, int audioSampleRate) {
|
||||||
if (sampleRate < 1500) {
|
if (sampleRate < MIN_BANDWIDTH) {
|
||||||
return 1500;
|
return MIN_BANDWIDTH;
|
||||||
}
|
}
|
||||||
return sampleRate;
|
return sampleRate;
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
|
|
||||||
#include <wx/numformatter.h>
|
#include <wx/numformatter.h>
|
||||||
|
|
||||||
#define MIN_BANDWIDTH 1500
|
|
||||||
|
|
||||||
wxBEGIN_EVENT_TABLE(WaterfallCanvas, wxGLCanvas)
|
wxBEGIN_EVENT_TABLE(WaterfallCanvas, wxGLCanvas)
|
||||||
EVT_PAINT(WaterfallCanvas::OnPaint)
|
EVT_PAINT(WaterfallCanvas::OnPaint)
|
||||||
EVT_KEY_DOWN(WaterfallCanvas::OnKeyDown)
|
EVT_KEY_DOWN(WaterfallCanvas::OnKeyDown)
|
||||||
@ -44,6 +42,7 @@ WaterfallCanvas::WaterfallCanvas(wxWindow *parent, int *attribList) :
|
|||||||
preBuf = false;
|
preBuf = false;
|
||||||
SetCursor(wxCURSOR_CROSS);
|
SetCursor(wxCURSOR_CROSS);
|
||||||
scaleMove = 0;
|
scaleMove = 0;
|
||||||
|
minBandwidth = 30000;
|
||||||
}
|
}
|
||||||
|
|
||||||
WaterfallCanvas::~WaterfallCanvas() {
|
WaterfallCanvas::~WaterfallCanvas() {
|
||||||
@ -179,8 +178,8 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
|
|||||||
|
|
||||||
if (currentZoom < 1) {
|
if (currentZoom < 1) {
|
||||||
bw = (long long) ceil((long double) bw * currentZoom);
|
bw = (long long) ceil((long double) bw * currentZoom);
|
||||||
if (bw < 30000) {
|
if (bw < minBandwidth) {
|
||||||
bw = 30000;
|
bw = minBandwidth;
|
||||||
}
|
}
|
||||||
if (mouseInView) {
|
if (mouseInView) {
|
||||||
long long mfreqA = getFrequencyAt(mpos);
|
long long mfreqA = getFrequencyAt(mpos);
|
||||||
@ -852,4 +851,6 @@ void WaterfallCanvas::setLinesPerSecond(int lps) {
|
|||||||
tex_update.unlock();
|
tex_update.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WaterfallCanvas::setMinBandwidth(int min) {
|
||||||
|
minBandwidth = min;
|
||||||
|
}
|
||||||
|
@ -30,6 +30,7 @@ public:
|
|||||||
SpectrumVisualDataQueue *getVisualDataQueue();
|
SpectrumVisualDataQueue *getVisualDataQueue();
|
||||||
|
|
||||||
void setLinesPerSecond(int lps);
|
void setLinesPerSecond(int lps);
|
||||||
|
void setMinBandwidth(int min);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void OnPaint(wxPaintEvent& event);
|
void OnPaint(wxPaintEvent& event);
|
||||||
@ -75,6 +76,7 @@ private:
|
|||||||
double lpsIndex;
|
double lpsIndex;
|
||||||
bool preBuf;
|
bool preBuf;
|
||||||
std::mutex tex_update;
|
std::mutex tex_update;
|
||||||
|
int minBandwidth;
|
||||||
// event table
|
// event table
|
||||||
wxDECLARE_EVENT_TABLE();
|
wxDECLARE_EVENT_TABLE();
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user