From a1a6a467e897ebda192cfad38a0b1c40ede553d8 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 16 Nov 2015 23:49:54 -0500 Subject: [PATCH 01/28] Modem, ModemKit and initial ModemAnalog refactor --- CMakeLists.txt | 45 +++++ src/demod/DemodDefs.h | 12 +- src/demod/DemodulatorInstance.cpp | 2 +- src/demod/DemodulatorPreThread.cpp | 77 ++++--- src/demod/DemodulatorThread.cpp | 224 +++++++++++---------- src/demod/DemodulatorThread.h | 42 ++-- src/demod/DemodulatorWorkerThread.cpp | 12 +- src/demod/DemodulatorWorkerThread.h | 2 + src/modules/modem/Modem.cpp | 27 +++ src/modules/modem/Modem.h | 48 +++++ src/modules/modem/ModemAnalog.cpp | 78 +++++++ src/modules/modem/ModemAnalog.h | 30 +++ src/modules/modem/analog/ModemAM.cpp | 24 +++ src/modules/modem/analog/ModemAM.h | 13 ++ src/modules/modem/analog/ModemDSB.cpp | 24 +++ src/modules/modem/analog/ModemDSB.h | 13 ++ src/modules/modem/analog/ModemFM.cpp | 24 +++ src/modules/modem/analog/ModemFM.h | 14 ++ src/modules/modem/analog/ModemFMStereo.cpp | 176 ++++++++++++++++ src/modules/modem/analog/ModemFMStereo.h | 39 ++++ src/modules/modem/analog/ModemIQ.cpp | 38 ++++ src/modules/modem/analog/ModemIQ.h | 14 ++ src/modules/modem/analog/ModemLSB.cpp | 35 ++++ src/modules/modem/analog/ModemLSB.h | 15 ++ src/modules/modem/analog/ModemUSB.cpp | 36 ++++ src/modules/modem/analog/ModemUSB.h | 14 ++ src/modules/modem/digital/ModemAPSK.cpp | 1 + src/modules/modem/digital/ModemAPSK.h | 3 + src/modules/modem/digital/ModemASK.cpp | 1 + src/modules/modem/digital/ModemASK.h | 3 + src/modules/modem/digital/ModemBPSK.cpp | 1 + src/modules/modem/digital/ModemBPSK.h | 3 + src/modules/modem/digital/ModemDPSK.cpp | 1 + src/modules/modem/digital/ModemDPSK.h | 3 + src/modules/modem/digital/ModemOOK.cpp | 1 + src/modules/modem/digital/ModemOOK.h | 3 + src/modules/modem/digital/ModemPSK.cpp | 1 + src/modules/modem/digital/ModemPSK.h | 3 + src/modules/modem/digital/ModemQAM.cpp | 1 + src/modules/modem/digital/ModemQAM.h | 3 + src/modules/modem/digital/ModemQPSK.cpp | 1 + src/modules/modem/digital/ModemQPSK.h | 3 + src/modules/modem/digital/ModemSQAM.cpp | 1 + src/modules/modem/digital/ModemSQAM.h | 3 + src/modules/modem/digital/ModemST.cpp | 2 + src/modules/modem/digital/ModemST.h | 2 + 46 files changed, 932 insertions(+), 186 deletions(-) create mode 100644 src/modules/modem/Modem.cpp create mode 100644 src/modules/modem/Modem.h create mode 100644 src/modules/modem/ModemAnalog.cpp create mode 100644 src/modules/modem/ModemAnalog.h create mode 100644 src/modules/modem/analog/ModemAM.cpp create mode 100644 src/modules/modem/analog/ModemAM.h create mode 100644 src/modules/modem/analog/ModemDSB.cpp create mode 100644 src/modules/modem/analog/ModemDSB.h create mode 100644 src/modules/modem/analog/ModemFM.cpp create mode 100644 src/modules/modem/analog/ModemFM.h create mode 100644 src/modules/modem/analog/ModemFMStereo.cpp create mode 100644 src/modules/modem/analog/ModemFMStereo.h create mode 100644 src/modules/modem/analog/ModemIQ.cpp create mode 100644 src/modules/modem/analog/ModemIQ.h create mode 100644 src/modules/modem/analog/ModemLSB.cpp create mode 100644 src/modules/modem/analog/ModemLSB.h create mode 100644 src/modules/modem/analog/ModemUSB.cpp create mode 100644 src/modules/modem/analog/ModemUSB.h create mode 100644 src/modules/modem/digital/ModemAPSK.cpp create mode 100644 src/modules/modem/digital/ModemAPSK.h create mode 100644 src/modules/modem/digital/ModemASK.cpp create mode 100644 src/modules/modem/digital/ModemASK.h create mode 100644 src/modules/modem/digital/ModemBPSK.cpp create mode 100644 src/modules/modem/digital/ModemBPSK.h create mode 100644 src/modules/modem/digital/ModemDPSK.cpp create mode 100644 src/modules/modem/digital/ModemDPSK.h create mode 100644 src/modules/modem/digital/ModemOOK.cpp create mode 100644 src/modules/modem/digital/ModemOOK.h create mode 100644 src/modules/modem/digital/ModemPSK.cpp create mode 100644 src/modules/modem/digital/ModemPSK.h create mode 100644 src/modules/modem/digital/ModemQAM.cpp create mode 100644 src/modules/modem/digital/ModemQAM.h create mode 100644 src/modules/modem/digital/ModemQPSK.cpp create mode 100644 src/modules/modem/digital/ModemQPSK.h create mode 100644 src/modules/modem/digital/ModemSQAM.cpp create mode 100644 src/modules/modem/digital/ModemSQAM.h create mode 100644 src/modules/modem/digital/ModemST.cpp create mode 100644 src/modules/modem/digital/ModemST.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 18d7fea..0178a2a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -234,6 +234,25 @@ SET (cubicsdr_sources src/demod/DemodulatorWorkerThread.cpp src/demod/DemodulatorInstance.cpp src/demod/DemodulatorMgr.cpp + src/modules/modem/Modem.cpp + src/modules/modem/ModemAnalog.cpp + src/modules/modem/digital/ModemASK.cpp + src/modules/modem/digital/ModemAPSK.cpp + src/modules/modem/digital/ModemBPSK.cpp + src/modules/modem/digital/ModemDPSK.cpp + src/modules/modem/digital/ModemPSK.cpp + src/modules/modem/digital/ModemOOK.cpp + src/modules/modem/digital/ModemST.cpp + src/modules/modem/digital/ModemSQAM.cpp + src/modules/modem/digital/ModemQAM.cpp + src/modules/modem/digital/ModemQPSK.cpp + src/modules/modem/analog/ModemAM.cpp + src/modules/modem/analog/ModemDSB.cpp + src/modules/modem/analog/ModemFM.cpp + src/modules/modem/analog/ModemFMStereo.cpp + src/modules/modem/analog/ModemIQ.cpp + src/modules/modem/analog/ModemLSB.cpp + src/modules/modem/analog/ModemUSB.cpp src/audio/AudioThread.cpp src/util/Gradient.cpp src/util/Timer.cpp @@ -293,6 +312,25 @@ SET (cubicsdr_headers src/demod/DemodulatorInstance.h src/demod/DemodulatorMgr.h src/demod/DemodDefs.h + src/modules/modem/Modem.h + src/modules/modem/ModemAnalog.h + src/modules/modem/digital/ModemASK.h + src/modules/modem/digital/ModemAPSK.h + src/modules/modem/digital/ModemBPSK.h + src/modules/modem/digital/ModemDPSK.h + src/modules/modem/digital/ModemPSK.h + src/modules/modem/digital/ModemOOK.h + src/modules/modem/digital/ModemST.h + src/modules/modem/digital/ModemSQAM.h + src/modules/modem/digital/ModemQAM.h + src/modules/modem/digital/ModemQPSK.h + src/modules/modem/analog/ModemAM.h + src/modules/modem/analog/ModemDSB.h + src/modules/modem/analog/ModemFM.h + src/modules/modem/analog/ModemFMStereo.h + src/modules/modem/analog/ModemIQ.h + src/modules/modem/analog/ModemLSB.h + src/modules/modem/analog/ModemUSB.h src/audio/AudioThread.h src/util/Gradient.h src/util/Timer.h @@ -372,6 +410,9 @@ SOURCE_GROUP("Base" REGULAR_EXPRESSION "src/${REG_EXT}") SOURCE_GROUP("Forms\\SDRDevices" REGULAR_EXPRESSION "src/forms/SDRDevices/${REG_EXT}") SOURCE_GROUP("SDR" REGULAR_EXPRESSION "src/sdr/${REG_EXT}") SOURCE_GROUP("Demodulator" REGULAR_EXPRESSION "src/demod/${REG_EXT}") +SOURCE_GROUP("Modem" REGULAR_EXPRESSION "src/modules/modem/${REG_EXT}") +SOURCE_GROUP("Modem-Analog" REGULAR_EXPRESSION "src/modules/modem/analog/${REG_EXT}") +SOURCE_GROUP("Modem-Digital" REGULAR_EXPRESSION "src/modules/modem/digital/${REG_EXT}") SOURCE_GROUP("Audio" REGULAR_EXPRESSION "src/audio/${REG_EXT}") SOURCE_GROUP("Utility" REGULAR_EXPRESSION "src/util/${REG_EXT}") SOURCE_GROUP("Visual" REGULAR_EXPRESSION "src/visual/${REG_EXT}") @@ -387,6 +428,10 @@ include_directories ( ${PROJECT_SOURCE_DIR}/src/forms/SDRDevices ${PROJECT_SOURCE_DIR}/src/sdr ${PROJECT_SOURCE_DIR}/src/demod + ${PROJECT_SOURCE_DIR}/src/modules + ${PROJECT_SOURCE_DIR}/src/modules/modem + ${PROJECT_SOURCE_DIR}/src/modules/modem/digital + ${PROJECT_SOURCE_DIR}/src/modules/modem/analog ${PROJECT_SOURCE_DIR}/src/audio ${PROJECT_SOURCE_DIR}/src/util ${PROJECT_SOURCE_DIR}/src/panel diff --git a/src/demod/DemodDefs.h b/src/demod/DemodDefs.h index a9a0d48..ce6e36b 100644 --- a/src/demod/DemodDefs.h +++ b/src/demod/DemodDefs.h @@ -93,21 +93,14 @@ public: } }; + class DemodulatorThreadPostIQData: public ReferenceCounter { public: std::vector data; long long sampleRate; - msresamp_rrrf audioResampler; - msresamp_rrrf stereoResampler; - double audioResampleRatio; - int audioSampleRate; - - firfilt_rrrf firStereoLeft; - firfilt_rrrf firStereoRight; - iirfilt_crcf iirStereoPilot; DemodulatorThreadPostIQData() : - sampleRate(0), audioResampler(NULL), stereoResampler(NULL), audioResampleRatio(0), audioSampleRate(0), firStereoLeft(NULL), firStereoRight(NULL), iirStereoPilot(NULL) { + sampleRate(0) { } @@ -116,6 +109,7 @@ public: } }; + class DemodulatorThreadAudioData: public ReferenceCounter { public: long long frequency; diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index f5d285a..0cd93aa 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -202,7 +202,7 @@ bool DemodulatorInstance::isStereo() { void DemodulatorInstance::setStereo(bool state) { stereo = state; - demodulatorThread->setStereo(state); +// demodulatorThread->setStereo(state); } void DemodulatorInstance::squelchAuto() { diff --git a/src/demod/DemodulatorPreThread.cpp b/src/demod/DemodulatorPreThread.cpp index f96dc2c..32d235b 100644 --- a/src/demod/DemodulatorPreThread.cpp +++ b/src/demod/DemodulatorPreThread.cpp @@ -27,45 +27,45 @@ void DemodulatorPreThread::initialize() { initialized = false; iqResampleRatio = (double) (params.bandwidth) / (double) params.sampleRate; - audioResampleRatio = (double) (params.audioSampleRate) / (double) params.bandwidth; +// audioResampleRatio = (double) (params.audioSampleRate) / (double) params.bandwidth; - float As = 120.0f; // stop-band attenuation [dB] + float As = 60.0f; // stop-band attenuation [dB] iqResampler = msresamp_crcf_create(iqResampleRatio, As); - audioResampler = msresamp_rrrf_create(audioResampleRatio, As); - stereoResampler = msresamp_rrrf_create(audioResampleRatio, As); +// audioResampler = msresamp_rrrf_create(audioResampleRatio, As); +// stereoResampler = msresamp_rrrf_create(audioResampleRatio, As); // Stereo filters / shifters - double firStereoCutoff = ((double) 16000 / (double) params.audioSampleRate); - float ft = ((double) 1000 / (double) params.audioSampleRate); // filter transition - float mu = 0.0f; // fractional timing offset +// double firStereoCutoff = ((double) 16000 / (double) params.audioSampleRate); +// float ft = ((double) 1000 / (double) params.audioSampleRate); // filter transition +// float mu = 0.0f; // fractional timing offset +// +// if (firStereoCutoff < 0) { +// firStereoCutoff = 0; +// } +// +// if (firStereoCutoff > 0.5) { +// firStereoCutoff = 0.5; +// } - if (firStereoCutoff < 0) { - firStereoCutoff = 0; - } - - if (firStereoCutoff > 0.5) { - firStereoCutoff = 0.5; - } - - unsigned int h_len = estimate_req_filter_len(ft, As); - float *h = new float[h_len]; - liquid_firdes_kaiser(h_len, firStereoCutoff, As, mu, h); - - firStereoLeft = firfilt_rrrf_create(h, h_len); - firStereoRight = firfilt_rrrf_create(h, h_len); +// unsigned int h_len = estimate_req_filter_len(ft, As); +// float *h = new float[h_len]; +// liquid_firdes_kaiser(h_len, firStereoCutoff, As, mu, h); +// +// firStereoLeft = firfilt_rrrf_create(h, h_len); +// firStereoRight = firfilt_rrrf_create(h, h_len); // stereo pilot filter - float bw = params.bandwidth; - if (bw < 100000.0) { - bw = 100000.0; - } - unsigned int order = 5; // filter order - float f0 = ((double) 19000 / bw); - float fc = ((double) 19500 / bw); - float Ap = 1.0f; - As = 60.0f; - iirStereoPilot = iirfilt_crcf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_BANDPASS, LIQUID_IIRDES_SOS, order, fc, f0, Ap, As); +// float bw = params.bandwidth; +// if (bw < 100000.0) { +// bw = 100000.0; +// } +// unsigned int order = 5; // filter order +// float f0 = ((double) 19000 / bw); +// float fc = ((double) 19500 / bw); +// float Ap = 1.0f; +// As = 60.0f; +// iirStereoPilot = iirfilt_crcf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_BANDPASS, LIQUID_IIRDES_SOS, order, fc, f0, Ap, As); initialized = true; lastParams = params; @@ -218,7 +218,6 @@ void DemodulatorPreThread::run() { msresamp_crcf_execute(iqResampler, in_buf, bufSize, &resampledData[0], &numWritten); resamp->setRefCount(1); - resamp->data.assign(resampledData.begin(), resampledData.begin() + numWritten); // bool uneven = (numWritten % 2 != 0); @@ -245,13 +244,13 @@ void DemodulatorPreThread::run() { - resamp->audioResampleRatio = audioResampleRatio; - resamp->audioResampler = audioResampler; - resamp->audioSampleRate = params.audioSampleRate; - resamp->stereoResampler = stereoResampler; - resamp->firStereoLeft = firStereoLeft; - resamp->firStereoRight = firStereoRight; - resamp->iirStereoPilot = iirStereoPilot; +// resamp->audioResampleRatio = audioResampleRatio; +// resamp->audioResampler = audioResampler; +// resamp->audioSampleRate = params.audioSampleRate; +// resamp->stereoResampler = stereoResampler; +// resamp->firStereoLeft = firStereoLeft; +// resamp->firStereoRight = firStereoRight; +// resamp->iirStereoPilot = iirStereoPilot; resamp->sampleRate = params.bandwidth; iqOutputQueue->push(resamp); diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index b46ff03..3f9d4a7 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -13,21 +13,21 @@ DemodulatorThread::DemodulatorThread() : IOThread(), iqAutoGain(NULL), amOutputCeil(1), amOutputCeilMA(1), amOutputCeilMAA(1), audioSampleRate(0), squelchLevel(0), signalLevel(0), squelchEnabled(false), iqInputQueue(NULL), audioOutputQueue(NULL), audioVisOutputQueue(NULL), threadQueueControl(NULL), threadQueueNotify(NULL) { - stereo.store(false); +// stereo.store(false); muted.store(false); agcEnabled.store(false); demodulatorType.store(DEMOD_TYPE_FM); - demodFM = freqdem_create(0.5); - demodAM_USB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_USB, 1); - demodAM_LSB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_LSB, 1); - demodAM_DSB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_DSB, 1); - demodAM_DSB_CSP = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_DSB, 0); - demodAM = demodAM_DSB_CSP; +// demodFM = freqdem_create(0.5); +// demodAM_USB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_USB, 1); +// demodAM_LSB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_LSB, 1); +// demodAM_DSB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_DSB, 1); +// demodAM_DSB_CSP = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_DSB, 0); +// demodAM = demodAM_DSB_CSP; // advanced demodulators - demodulatorCons.store(2); +/* demodulatorCons.store(2); currentDemodCons = 0; demodASK = demodASK2; @@ -90,7 +90,7 @@ DemodulatorThread::DemodulatorThread() : IOThread(), iqAutoGain(NULL), amOutputC demodQPSK = modem_create(LIQUID_MODEM_QPSK); - currentDemodLock = false; + currentDemodLock = false; */ } DemodulatorThread::~DemodulatorThread() { @@ -110,23 +110,23 @@ void DemodulatorThread::run() { pthread_setschedparam(tID, SCHED_FIFO, &prio); #endif - msresamp_rrrf audioResampler = NULL; - msresamp_rrrf stereoResampler = NULL; - firfilt_rrrf firStereoLeft = NULL; - firfilt_rrrf firStereoRight = NULL; - iirfilt_crcf iirStereoPilot = NULL; +// msresamp_rrrf audioResampler = NULL; +// msresamp_rrrf stereoResampler = NULL; +// firfilt_rrrf firStereoLeft = NULL; +// firfilt_rrrf firStereoRight = NULL; +// iirfilt_crcf iirStereoPilot = NULL; - liquid_float_complex u, v, w, x, y; +// liquid_float_complex u, v, w, x, y; - firhilbf firStereoR2C = firhilbf_create(5, 60.0f); - firhilbf firStereoC2R = firhilbf_create(5, 60.0f); +// firhilbf firStereoR2C = firhilbf_create(5, 60.0f); +// firhilbf firStereoC2R = firhilbf_create(5, 60.0f); - nco_crcf stereoPilot = nco_crcf_create(LIQUID_VCO); - nco_crcf_reset(stereoPilot); - nco_crcf_pll_set_bandwidth(stereoPilot, 0.25f); +// nco_crcf stereoPilot = nco_crcf_create(LIQUID_VCO); +// nco_crcf_reset(stereoPilot); +// nco_crcf_pll_set_bandwidth(stereoPilot, 0.25f); // half band filter used for side-band elimination - resamp2_crcf ssbFilt = resamp2_crcf_create(12,-0.25f,60.0f); +// resamp2_crcf ssbFilt = resamp2_crcf_create(12,-0.25f,60.0f); // Automatic IQ gain iqAutoGain = agc_crcf_create(); @@ -141,22 +141,22 @@ void DemodulatorThread::run() { threadQueueControl = (DemodulatorThreadControlCommandQueue *)getInputQueue("ControlQueue"); threadQueueNotify = (DemodulatorThreadCommandQueue*)getOutputQueue("NotifyQueue"); - switch (demodulatorType.load()) { - case DEMOD_TYPE_FM: - break; - case DEMOD_TYPE_LSB: - demodAM = demodAM_LSB; - break; - case DEMOD_TYPE_USB: - demodAM = demodAM_USB; - break; - case DEMOD_TYPE_DSB: - demodAM = demodAM_DSB; - break; - case DEMOD_TYPE_AM: - demodAM = demodAM_DSB_CSP; - break; - } +// switch (demodulatorType.load()) { +// case DEMOD_TYPE_FM: +// break; +// case DEMOD_TYPE_LSB: +// demodAM = demodAM_LSB; +// break; +// case DEMOD_TYPE_USB: +// demodAM = demodAM_USB; +// break; +// case DEMOD_TYPE_DSB: +// demodAM = demodAM_DSB; +// break; +// case DEMOD_TYPE_AM: +// demodAM = demodAM_DSB_CSP; +// break; +// } while (!terminated) { DemodulatorThreadPostIQData *inp; @@ -170,47 +170,47 @@ void DemodulatorThread::run() { continue; } - if (audioResampler == NULL) { - audioResampler = inp->audioResampler; - stereoResampler = inp->stereoResampler; - firStereoLeft = inp->firStereoLeft; - firStereoRight = inp->firStereoRight; - iirStereoPilot = inp->iirStereoPilot; - audioSampleRate = inp->audioSampleRate; - } else if (audioResampler != inp->audioResampler) { - msresamp_rrrf_destroy(audioResampler); - msresamp_rrrf_destroy(stereoResampler); - audioResampler = inp->audioResampler; - stereoResampler = inp->stereoResampler; - audioSampleRate = inp->audioSampleRate; - - if (demodAM) { - ampmodem_reset(demodAM); - } - freqdem_reset(demodFM); - nco_crcf_reset(stereoPilot); - } - - if (firStereoLeft != inp->firStereoLeft) { - if (firStereoLeft != NULL) { - firfilt_rrrf_destroy(firStereoLeft); - } - firStereoLeft = inp->firStereoLeft; - } - - if (firStereoRight != inp->firStereoRight) { - if (firStereoRight != NULL) { - firfilt_rrrf_destroy(firStereoRight); - } - firStereoRight = inp->firStereoRight; - } - - if (iirStereoPilot != inp->iirStereoPilot) { - if (iirStereoPilot != NULL) { - iirfilt_crcf_destroy(iirStereoPilot); - } - iirStereoPilot = inp->iirStereoPilot; - } +// if (audioResampler == NULL) { +// audioResampler = inp->audioResampler; +// stereoResampler = inp->stereoResampler; +// firStereoLeft = inp->firStereoLeft; +// firStereoRight = inp->firStereoRight; +// iirStereoPilot = inp->iirStereoPilot; +// audioSampleRate = inp->audioSampleRate; +// } else if (audioResampler != inp->audioResampler) { +// msresamp_rrrf_destroy(audioResampler); +// msresamp_rrrf_destroy(stereoResampler); +// audioResampler = inp->audioResampler; +// stereoResampler = inp->stereoResampler; +// audioSampleRate = inp->audioSampleRate; +// +// if (demodAM) { +// ampmodem_reset(demodAM); +// } +// freqdem_reset(demodFM); +// nco_crcf_reset(stereoPilot); +// } +// +// if (firStereoLeft != inp->firStereoLeft) { +// if (firStereoLeft != NULL) { +// firfilt_rrrf_destroy(firStereoLeft); +// } +// firStereoLeft = inp->firStereoLeft; +// } +// +// if (firStereoRight != inp->firStereoRight) { +// if (firStereoRight != NULL) { +// firfilt_rrrf_destroy(firStereoRight); +// } +// firStereoRight = inp->firStereoRight; +// } +// +// if (iirStereoPilot != inp->iirStereoPilot) { +// if (iirStereoPilot != NULL) { +// iirfilt_crcf_destroy(iirStereoPilot); +// } +// iirStereoPilot = inp->iirStereoPilot; +// } if (agcData.size() != bufSize) { if (agcData.capacity() < bufSize) { @@ -221,23 +221,24 @@ void DemodulatorThread::run() { agcAMData.resize(bufSize); } - double audio_resample_ratio = inp->audioResampleRatio; +// double audio_resample_ratio = inp->audioResampleRatio; - if (demodOutputData.size() != bufSize) { - if (demodOutputData.capacity() < bufSize) { - demodOutputData.reserve(bufSize); - } - demodOutputData.resize(bufSize); - } +// if (demodOutputData.size() != bufSize) { +// if (demodOutputData.capacity() < bufSize) { +// demodOutputData.reserve(bufSize); +// } +// demodOutputData.resize(bufSize); +// } +/* if (demodOutputDataDigital.size() != bufSize) { if (demodOutputDataDigital.capacity() < bufSize) { demodOutputDataDigital.reserve(bufSize); } demodOutputDataDigital.resize(bufSize); } - - int audio_out_size = ceil((double) (bufSize) * audio_resample_ratio) + 512; +*/ +// int audio_out_size = ceil((double) (bufSize) * audio_resample_ratio) + 512; agc_crcf_execute_block(iqAutoGain, &(inp->data[0]), bufSize, &agcData[0]); @@ -258,8 +259,8 @@ void DemodulatorThread::run() { } // Reset demodulator Constellations & Lock - updateDemodulatorCons(0); - +// updateDemodulatorCons(0); +/* if (demodulatorType == DEMOD_TYPE_FM) { currentDemodLock = false; freqdem_demodulate_block(demodFM, &(*inputData)[0], bufSize, &demodOutputData[0]); @@ -669,7 +670,7 @@ void DemodulatorThread::run() { msresamp_rrrf_execute(stereoResampler, &demodStereoData[0], bufSize, &resampledStereoData[0], &numAudioWritten); } - } + }*/ if (currentSignalLevel > signalLevel) { signalLevel = signalLevel + (currentSignalLevel - signalLevel) * 0.5; @@ -681,13 +682,14 @@ void DemodulatorThread::run() { if (audioOutputQueue != NULL) { if (!squelchEnabled || (signalLevel >= squelchLevel)) { - ati = outputBuffers.getBuffer(); ati->sampleRate = audioSampleRate; ati->inputRate = inp->sampleRate; ati->setRefCount(1); + /* + if (demodulatorType == DEMOD_TYPE_RAW) { ati->channels = 2; if (ati->data.capacity() < (numAudioWritten * 2)) { @@ -720,7 +722,7 @@ void DemodulatorThread::run() { ati->channels = 1; ati->data.assign(resampledOutputData.begin(), resampledOutputData.begin() + numAudioWritten); } - +*/ std::vector::iterator data_i; ati->peak = 0; for (data_i = ati->data.begin(); data_i != ati->data.end(); data_i++) { @@ -731,7 +733,7 @@ void DemodulatorThread::run() { } } } - +/* if (ati && audioVisOutputQueue != NULL && audioVisOutputQueue->empty()) { AudioThreadInput *ati_vis = audioVisBuffers.getBuffer(); ati_vis->setRefCount(1); @@ -762,6 +764,7 @@ void DemodulatorThread::run() { } } } else { + int numAudioWritten = ati->data.size(); ati_vis->channels = 1; if (numAudioWritten > bufSize) { ati_vis->inputRate = audioSampleRate; @@ -781,7 +784,8 @@ void DemodulatorThread::run() { audioVisOutputQueue->push(ati_vis); } - +*/ + if (ati != NULL) { if (!muted.load()) { audioOutputQueue->push(ati); @@ -791,7 +795,7 @@ void DemodulatorThread::run() { } if (!threadQueueControl->empty()) { - int newDemodType = DEMOD_TYPE_NULL; +// int newDemodType = DEMOD_TYPE_NULL; while (!threadQueueControl->empty()) { DemodulatorThreadControlCommand command; @@ -804,14 +808,14 @@ void DemodulatorThread::run() { case DemodulatorThreadControlCommand::DEMOD_THREAD_CMD_CTL_SQUELCH_OFF: squelchEnabled = false; break; - case DemodulatorThreadControlCommand::DEMOD_THREAD_CMD_CTL_TYPE: - newDemodType = command.demodType; - break; +// case DemodulatorThreadControlCommand::DEMOD_THREAD_CMD_CTL_TYPE: +// newDemodType = command.demodType; +// break; default: break; } } - +/* if (newDemodType != DEMOD_TYPE_NULL) { switch (newDemodType) { case DEMOD_TYPE_FM: @@ -868,15 +872,15 @@ void DemodulatorThread::run() { break; } demodulatorType = newDemodType; - } + }*/ } - demodOutputDataDigital.empty(); +// demodOutputDataDigital.empty(); inp->decRefCount(); } // end while !terminated - +/* if (audioResampler != NULL) { msresamp_rrrf_destroy(audioResampler); } @@ -898,7 +902,7 @@ void DemodulatorThread::run() { firhilbf_destroy(firStereoC2R); nco_crcf_destroy(stereoPilot); resamp2_crcf_destroy(ssbFilt); - +*/ outputBuffers.purge(); if (audioVisOutputQueue && !audioVisOutputQueue->empty()) { @@ -920,14 +924,14 @@ void DemodulatorThread::terminate() { iqInputQueue->push(inp); } -void DemodulatorThread::setStereo(bool state) { - stereo.store(state); - std::cout << "Stereo " << (state ? "Enabled" : "Disabled") << std::endl; -} +//void DemodulatorThread::setStereo(bool state) { +// stereo.store(state); +// std::cout << "Stereo " << (state ? "Enabled" : "Disabled") << std::endl; +//} -bool DemodulatorThread::isStereo() { - return stereo.load(); -} +//bool DemodulatorThread::isStereo() { +// return stereo.load(); +//} bool DemodulatorThread::isMuted() { return muted.load(); diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index 891849f..216996c 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -21,8 +21,8 @@ public: void run(); void terminate(); - void setStereo(bool state); - bool isStereo(); +// void setStereo(bool state); +// bool isStereo(); void setAGC(bool state); bool getAGC(); @@ -42,35 +42,35 @@ public: void setDemodulatorCons(int demod_cons_in); int getDemodulatorCons(); - -#ifdef __APPLE__ - static void *pthread_helper(void *context) { - return ((DemodulatorThread *) context)->threadMain(); - } -#endif +// +//#ifdef __APPLE__ +// static void *pthread_helper(void *context) { +// return ((DemodulatorThread *) context)->threadMain(); +// } +//#endif protected: ReBuffer outputBuffers; std::vector agcData; std::vector agcAMData; - std::vector demodOutputData; - std::vector demodStereoData; - std::vector resampledOutputData; - std::vector resampledStereoData; +// std::vector demodOutputData; +// std::vector demodStereoData; +// std::vector resampledOutputData; +// std::vector resampledStereoData; std::vector demodOutputDataDigital; //std::vector demodOutputDataDigitalTest; //std::vector demodOutputSoftbits; //std::vector demodOutputSoftbitsTest; - freqdem demodFM; - ampmodem demodAM; - ampmodem demodAM_DSB_CSP; - ampmodem demodAM_DSB; - ampmodem demodAM_LSB; - ampmodem demodAM_USB; - +// freqdem demodFM; +// ampmodem demodAM; +// ampmodem demodAM_DSB_CSP; +// ampmodem demodAM_DSB; +// ampmodem demodAM_LSB; +// ampmodem demodAM_USB; +/* modem demodASK; modem demodASK2; modem demodASK4; @@ -130,14 +130,14 @@ protected: modem demodQAM256; modem demodQPSK; - +*/ agc_crcf iqAutoGain; float amOutputCeil; float amOutputCeilMA; float amOutputCeilMAA; - std::atomic_bool stereo; +// std::atomic_bool stereo; std::atomic_bool muted; std::atomic_bool agcEnabled; std::atomic_int demodulatorType; diff --git a/src/demod/DemodulatorWorkerThread.cpp b/src/demod/DemodulatorWorkerThread.cpp index c9c5761..e3dc0bf 100644 --- a/src/demod/DemodulatorWorkerThread.cpp +++ b/src/demod/DemodulatorWorkerThread.cpp @@ -47,12 +47,12 @@ void DemodulatorWorkerThread::run() { } if (filterCommand.bandwidth && filterCommand.audioSampleRate) { - result.audioResamplerRatio = (double) (filterCommand.audioSampleRate) / (double) filterCommand.bandwidth; - result.audioResampler = msresamp_rrrf_create(result.audioResamplerRatio, As); - result.stereoResampler = msresamp_rrrf_create(result.audioResamplerRatio, As); - result.audioSampleRate = filterCommand.audioSampleRate; +// result.audioResamplerRatio = (double) (filterCommand.audioSampleRate) / (double) filterCommand.bandwidth; +// result.audioResampler = msresamp_rrrf_create(result.audioResamplerRatio, As); +// result.stereoResampler = msresamp_rrrf_create(result.audioResamplerRatio, As); +// result.audioSampleRate = filterCommand.audioSampleRate; - // Stereo filters / shifters +/* // Stereo filters / shifters double firStereoCutoff = ((double) 16000 / (double) filterCommand.audioSampleRate); float ft = ((double) 1000 / (double) filterCommand.audioSampleRate); // filter transition float mu = 0.0f; // fractional timing offset @@ -83,7 +83,7 @@ void DemodulatorWorkerThread::run() { float Ap = 1.0f; As = 60.0f; - result.iirStereoPilot = iirfilt_crcf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_BANDPASS, LIQUID_IIRDES_SOS, order, fc, f0, Ap, As); + result.iirStereoPilot = iirfilt_crcf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_BANDPASS, LIQUID_IIRDES_SOS, order, fc, f0, Ap, As); */ } if (filterCommand.bandwidth) { diff --git a/src/demod/DemodulatorWorkerThread.h b/src/demod/DemodulatorWorkerThread.h index 490ed5d..4a202c9 100644 --- a/src/demod/DemodulatorWorkerThread.h +++ b/src/demod/DemodulatorWorkerThread.h @@ -36,6 +36,8 @@ public: firfilt_rrrf firStereoLeft; firfilt_rrrf firStereoRight; iirfilt_crcf iirStereoPilot; + + DemodulatorThread *demodThread; long long sampleRate; unsigned int bandwidth; diff --git a/src/modules/modem/Modem.cpp b/src/modules/modem/Modem.cpp new file mode 100644 index 0000000..2502ef3 --- /dev/null +++ b/src/modules/modem/Modem.cpp @@ -0,0 +1,27 @@ +#include "Modem.h" + +ModemFactoryList Modem::modemFactories; + +void Modem::addModemFactory(std::string modemName, ModemFactoryFunc *factoryFunc) { + modemFactories[modemName] = factoryFunc; +} + +ModemFactoryList Modem::getFactories() { + return modemFactories; +} + +Modem *Modem::factory() { + return nullptr; +} + +ModemKit *Modem::buildKit(long long sampleRate, int audioSampleRate) { + return nullptr; +} + +void Modem::disposeKit(ModemKit *kit) { + return; +} + +void Modem::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + return; +} diff --git a/src/modules/modem/Modem.h b/src/modules/modem/Modem.h new file mode 100644 index 0000000..66c4060 --- /dev/null +++ b/src/modules/modem/Modem.h @@ -0,0 +1,48 @@ +#pragma once + +#include "liquid/liquid.h" +#include "IOThread.h" +#include "AudioThread.h" + +class ModemKit { +public: + ModemKit() : sampleRate(0), audioSampleRate(0) { + + } + + long long sampleRate; + int audioSampleRate; +}; + + +class ModemIQData: public ReferenceCounter { +public: + std::vector data; + long long sampleRate; + + ModemIQData() : sampleRate(0) { + + } + + ~ModemIQData() { + std::lock_guard < std::mutex > lock(m_mutex); + } +}; + +class Modem; +typedef Modem *(Modem::*ModemFactoryFunc)(); +typedef std::map ModemFactoryList; + +class Modem { +public: + static void addModemFactory(std::string modemName, ModemFactoryFunc *factoryFunc); + static ModemFactoryList getFactories(); + + virtual Modem *factory(); + + virtual ModemKit *buildKit(long long sampleRate, int audioSampleRate); + virtual void disposeKit(ModemKit *kit); + virtual void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); +private: + static ModemFactoryList modemFactories; +}; \ No newline at end of file diff --git a/src/modules/modem/ModemAnalog.cpp b/src/modules/modem/ModemAnalog.cpp new file mode 100644 index 0000000..183a700 --- /dev/null +++ b/src/modules/modem/ModemAnalog.cpp @@ -0,0 +1,78 @@ +#include "ModemAnalog.h" + +ModemAnalog::ModemAnalog() : aOutputCeil(1), aOutputCeilMA(1), aOutputCeilMAA(1) { + +} + +ModemKit *ModemAnalog::buildKit(long long sampleRate, int audioSampleRate) { + ModemKitAnalog *akit = new ModemKitAnalog; + + // stop-band attenuation [dB] + float As = 60.0f; + + akit->sampleRate = sampleRate; + akit->audioSampleRate = audioSampleRate; + akit->audioResampleRatio = double(audioSampleRate) / double(sampleRate); + akit->audioResampler = msresamp_rrrf_create(akit->audioResampleRatio, As); + + return akit; +} + +void ModemAnalog::disposeKit(ModemKit *kit) { + ModemKitAnalog *akit = (ModemKitAnalog *)kit; + + msresamp_rrrf_destroy(akit->audioResampler); + delete kit; +} + +void ModemAnalog::initOutputBuffers(ModemKitAnalog *akit, ModemIQData *input) { + bufSize = input->data.size(); + + if (!bufSize) { + return; + } + + double audio_resample_ratio = akit->audioResampleRatio; + + int audio_out_size = ceil((double) (bufSize) * audio_resample_ratio) + 512; + + if (demodOutputData.size() != bufSize) { + if (demodOutputData.capacity() < bufSize) { + demodOutputData.reserve(bufSize); + } + demodOutputData.resize(bufSize); + } + if (resampledOutputData.size() != audio_out_size) { + if (resampledOutputData.capacity() < audio_out_size) { + resampledOutputData.reserve(audio_out_size); + } + resampledOutputData.resize(audio_out_size); + } +} + +void ModemAnalog::buildAudioOutput(ModemKitAnalog *akit, AudioThreadInput *audioOut, bool autoGain) { + unsigned int numAudioWritten; + + if (autoGain) { + aOutputCeilMA = aOutputCeilMA + (aOutputCeil - aOutputCeilMA) * 0.025; + aOutputCeilMAA = aOutputCeilMAA + (aOutputCeilMA - aOutputCeilMAA) * 0.025; + aOutputCeil = 0; + + for (int i = 0; i < bufSize; i++) { + if (demodOutputData[i] > aOutputCeil) { + aOutputCeil = demodOutputData[i]; + } + } + + float gain = 0.5 / aOutputCeilMAA; + + for (int i = 0; i < bufSize; i++) { + demodOutputData[i] *= gain; + } + } + + msresamp_rrrf_execute(akit->audioResampler, &demodOutputData[0], demodOutputData.size(), &resampledOutputData[0], &numAudioWritten); + + audioOut->channels = 1; + audioOut->data.assign(resampledOutputData.begin(), resampledOutputData.begin() + numAudioWritten); +} diff --git a/src/modules/modem/ModemAnalog.h b/src/modules/modem/ModemAnalog.h new file mode 100644 index 0000000..0a64151 --- /dev/null +++ b/src/modules/modem/ModemAnalog.h @@ -0,0 +1,30 @@ +#pragma once +#include "Modem.h" + +class ModemKitAnalog : public ModemKit { +public: + ModemKitAnalog() : ModemKit(), audioResampler(nullptr), audioResampleRatio(0) { + + }; + + msresamp_rrrf audioResampler; + double audioResampleRatio; +}; + + +class ModemAnalog : public Modem { +public: + ModemAnalog(); + ModemKit *buildKit(long long sampleRate, int audioSampleRate); + void disposeKit(ModemKit *kit); + void initOutputBuffers(ModemKitAnalog *akit, ModemIQData *input); + void buildAudioOutput(ModemKitAnalog *akit, AudioThreadInput *audioOut, bool autoGain); +protected: + int bufSize; + std::vector demodOutputData; + std::vector resampledOutputData; + + float aOutputCeil; + float aOutputCeilMA; + float aOutputCeilMAA; +}; \ No newline at end of file diff --git a/src/modules/modem/analog/ModemAM.cpp b/src/modules/modem/analog/ModemAM.cpp new file mode 100644 index 0000000..dbd6bc0 --- /dev/null +++ b/src/modules/modem/analog/ModemAM.cpp @@ -0,0 +1,24 @@ +#include "ModemAM.h" + +ModemAM::ModemAM() { + demodAM = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_DSB, 0); +} + +Modem *ModemAM::factory() { + return new ModemAM; +} + +void ModemAM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitAnalog *amkit = (ModemKitAnalog *)kit; + + initOutputBuffers(amkit,input); + + if (!bufSize) { + input->decRefCount(); + return; + } + + ampmodem_demodulate_block(demodAM, &input->data[0], bufSize, &demodOutputData[0]); + + buildAudioOutput(amkit,audioOut,true); +} diff --git a/src/modules/modem/analog/ModemAM.h b/src/modules/modem/analog/ModemAM.h new file mode 100644 index 0000000..d7d115e --- /dev/null +++ b/src/modules/modem/analog/ModemAM.h @@ -0,0 +1,13 @@ +#pragma once +#include "Modem.h" +#include "ModemAnalog.h" + +class ModemAM : public ModemAnalog { +public: + ModemAM(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + ampmodem demodAM; +}; \ No newline at end of file diff --git a/src/modules/modem/analog/ModemDSB.cpp b/src/modules/modem/analog/ModemDSB.cpp new file mode 100644 index 0000000..62c5054 --- /dev/null +++ b/src/modules/modem/analog/ModemDSB.cpp @@ -0,0 +1,24 @@ +#include "ModemDSB.h" + +ModemDSB::ModemDSB() { + demodAM_DSB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_DSB, 1); +} + +Modem *ModemDSB::factory() { + return new ModemDSB; +} + +void ModemDSB::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitAnalog *amkit = (ModemKitAnalog *)kit; + + initOutputBuffers(amkit, input); + + if (!bufSize) { + input->decRefCount(); + return; + } + + ampmodem_demodulate_block(demodAM_DSB, &input->data[0], bufSize, &demodOutputData[0]); + + buildAudioOutput(amkit, audioOut, true); +} diff --git a/src/modules/modem/analog/ModemDSB.h b/src/modules/modem/analog/ModemDSB.h new file mode 100644 index 0000000..1c94e7a --- /dev/null +++ b/src/modules/modem/analog/ModemDSB.h @@ -0,0 +1,13 @@ +#pragma once +#include "Modem.h" +#include "ModemAnalog.h" + +class ModemDSB : public ModemAnalog { +public: + ModemDSB(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + ampmodem demodAM_DSB; +}; \ No newline at end of file diff --git a/src/modules/modem/analog/ModemFM.cpp b/src/modules/modem/analog/ModemFM.cpp new file mode 100644 index 0000000..ee28692 --- /dev/null +++ b/src/modules/modem/analog/ModemFM.cpp @@ -0,0 +1,24 @@ +#include "ModemFM.h" + +ModemFM::ModemFM() { + demodFM = freqdem_create(0.5); +} + +Modem *ModemFM::factory() { + return new ModemFM; +} + +void ModemFM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitAnalog *fmkit = (ModemKitAnalog *)kit; + + initOutputBuffers(fmkit, input); + + if (!bufSize) { + input->decRefCount(); + return; + } + + freqdem_demodulate_block(demodFM, &input->data[0], bufSize, &demodOutputData[0]); + + buildAudioOutput(fmkit, audioOut, false); +} diff --git a/src/modules/modem/analog/ModemFM.h b/src/modules/modem/analog/ModemFM.h new file mode 100644 index 0000000..c96bcdd --- /dev/null +++ b/src/modules/modem/analog/ModemFM.h @@ -0,0 +1,14 @@ +#pragma once +#include "Modem.h" +#include "ModemAnalog.h" + +class ModemFM : public ModemAnalog { +public: + ModemFM(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + + freqdem demodFM; +}; \ No newline at end of file diff --git a/src/modules/modem/analog/ModemFMStereo.cpp b/src/modules/modem/analog/ModemFMStereo.cpp new file mode 100644 index 0000000..f6f7c18 --- /dev/null +++ b/src/modules/modem/analog/ModemFMStereo.cpp @@ -0,0 +1,176 @@ +#include "ModemFMStereo.h" + +ModemFMStereo::ModemFMStereo() { + firStereoR2C = firhilbf_create(5, 60.0f); + firStereoC2R = firhilbf_create(5, 60.0f); + + stereoPilot = nco_crcf_create(LIQUID_VCO); + nco_crcf_reset(stereoPilot); + nco_crcf_pll_set_bandwidth(stereoPilot, 0.25f); +} + +ModemFMStereo::~ModemFMStereo() { + firhilbf_destroy(firStereoR2C); + firhilbf_destroy(firStereoC2R); + + nco_crcf_destroy(stereoPilot); +} + +Modem *ModemFMStereo::factory() { + return new ModemFMStereo; +} + +ModemKit *ModemFMStereo::buildKit(long long sampleRate, int audioSampleRate) { + ModemKitFMStereo *kit = new ModemKitFMStereo; + + kit->audioResampleRatio = double(audioSampleRate) / double(sampleRate); + + float As = 60.0f; // stop-band attenuation [dB] + + kit->audioResampler = msresamp_rrrf_create(kit->audioResampleRatio, As); + kit->stereoResampler = msresamp_rrrf_create(kit->audioResampleRatio, As); + + // Stereo filters / shifters + double firStereoCutoff = 16000.0 / double(audioSampleRate); + // filter transition + float ft = 1000.0 / double(audioSampleRate); + // fractional timing offset + float mu = 0.0f; + + if (firStereoCutoff < 0) { + firStereoCutoff = 0; + } + + if (firStereoCutoff > 0.5) { + firStereoCutoff = 0.5; + } + + unsigned int h_len = estimate_req_filter_len(ft, As); + float *h = new float[h_len]; + liquid_firdes_kaiser(h_len, firStereoCutoff, As, mu, h); + + kit->firStereoLeft = firfilt_rrrf_create(h, h_len); + kit->firStereoRight = firfilt_rrrf_create(h, h_len); + + // stereo pilot filter + float bw = sampleRate; + if (bw < 100000.0) { + bw = 100000.0; + } + unsigned int order = 5; // filter order + float f0 = ((double) 19000 / bw); + float fc = ((double) 19500 / bw); + float Ap = 1.0f; + + kit->iirStereoPilot = iirfilt_crcf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_BANDPASS, LIQUID_IIRDES_SOS, order, fc, f0, Ap, As); + + return kit; +} + +void ModemFMStereo::disposeKit(ModemKit *kit) { + ModemKitFMStereo *fmkit = (ModemKitFMStereo *)kit; + + msresamp_rrrf_destroy(fmkit->audioResampler); + msresamp_rrrf_destroy(fmkit->stereoResampler); + firfilt_rrrf_destroy(fmkit->firStereoLeft); + firfilt_rrrf_destroy(fmkit->firStereoRight); +} + + +void ModemFMStereo::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitFMStereo *fmkit = (ModemKitFMStereo *)kit; + int bufSize = input->data.size(); + liquid_float_complex u, v, w, x, y; + + double audio_resample_ratio = fmkit->audioResampleRatio; + + if (demodOutputData.size() != bufSize) { + if (demodOutputData.capacity() < bufSize) { + demodOutputData.reserve(bufSize); + } + demodOutputData.resize(bufSize); + } + + int audio_out_size = ceil((double) (bufSize) * audio_resample_ratio) + 512; + + freqdem_demodulate_block(demodFM, &input->data[0], bufSize, &demodOutputData[0]); + + if (resampledOutputData.size() != audio_out_size) { + if (resampledOutputData.capacity() < audio_out_size) { + resampledOutputData.reserve(audio_out_size); + } + resampledOutputData.resize(audio_out_size); + } + + unsigned int numAudioWritten; + + msresamp_rrrf_execute(fmkit->audioResampler, &demodOutputData[0], bufSize, &resampledOutputData[0], &numAudioWritten); + + if (demodStereoData.size() != bufSize) { + if (demodStereoData.capacity() < bufSize) { + demodStereoData.reserve(bufSize); + } + demodStereoData.resize(bufSize); + } + + float phase_error = 0; + + for (int i = 0; i < bufSize; i++) { + // real -> complex + firhilbf_r2c_execute(firStereoR2C, demodOutputData[i], &x); + + // 19khz pilot band-pass + iirfilt_crcf_execute(fmkit->iirStereoPilot, x, &v); + nco_crcf_cexpf(stereoPilot, &w); + + w.imag = -w.imag; // conjf(w) + + // multiply u = v * conjf(w) + u.real = v.real * w.real - v.imag * w.imag; + u.imag = v.real * w.imag + v.imag * w.real; + + // cargf(u) + phase_error = atan2f(u.imag,u.real); + + // step pll + nco_crcf_pll_step(stereoPilot, phase_error); + nco_crcf_step(stereoPilot); + + // 38khz down-mix + nco_crcf_mix_down(stereoPilot, x, &y); + nco_crcf_mix_down(stereoPilot, y, &x); + + // complex -> real + firhilbf_c2r_execute(firStereoC2R, x, &demodStereoData[i]); + } + + // std::cout << "[PLL] phase error: " << phase_error; + // std::cout << " freq:" << (((nco_crcf_get_frequency(stereoPilot) / (2.0 * M_PI)) * inp->sampleRate)) << std::endl; + + if (audio_out_size != resampledStereoData.size()) { + if (resampledStereoData.capacity() < audio_out_size) { + resampledStereoData.reserve(audio_out_size); + } + resampledStereoData.resize(audio_out_size); + } + + msresamp_rrrf_execute(fmkit->stereoResampler, &demodStereoData[0], bufSize, &resampledStereoData[0], &numAudioWritten); + + audioOut->channels = 2; + if (audioOut->data.capacity() < (numAudioWritten * 2)) { + audioOut->data.reserve(numAudioWritten * 2); + } + audioOut->data.resize(numAudioWritten * 2); + for (int i = 0; i < numAudioWritten; i++) { + float l, r; + + firfilt_rrrf_push(fmkit->firStereoLeft, 0.568 * (resampledOutputData[i] - (resampledStereoData[i]))); + firfilt_rrrf_execute(fmkit->firStereoLeft, &l); + + firfilt_rrrf_push(fmkit->firStereoRight, 0.568 * (resampledOutputData[i] + (resampledStereoData[i]))); + firfilt_rrrf_execute(fmkit->firStereoRight, &r); + + audioOut->data[i * 2] = l; + audioOut->data[i * 2 + 1] = r; + } +} diff --git a/src/modules/modem/analog/ModemFMStereo.h b/src/modules/modem/analog/ModemFMStereo.h new file mode 100644 index 0000000..b3f116e --- /dev/null +++ b/src/modules/modem/analog/ModemFMStereo.h @@ -0,0 +1,39 @@ +#pragma once +#include "Modem.h" + +class ModemKitFMStereo: public ModemKit { +public: + ModemKitFMStereo() : audioResampler(nullptr), stereoResampler(nullptr), audioResampleRatio(0), firStereoLeft(nullptr), firStereoRight(nullptr), iirStereoPilot(nullptr) { + } + + msresamp_rrrf audioResampler; + msresamp_rrrf stereoResampler; + double audioResampleRatio; + + firfilt_rrrf firStereoLeft; + firfilt_rrrf firStereoRight; + iirfilt_crcf iirStereoPilot; +}; + + +class ModemFMStereo : public Modem { +public: + ModemFMStereo(); + ~ModemFMStereo(); + Modem *factory(); + ModemKit *buildKit(long long sampleRate, int audioSampleRate); + void disposeKit(ModemKit *kit); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + std::vector demodOutputData; + std::vector demodStereoData; + std::vector resampledOutputData; + std::vector resampledStereoData; + freqdem demodFM; + + firhilbf firStereoR2C; + firhilbf firStereoC2R; + + nco_crcf stereoPilot; +}; \ No newline at end of file diff --git a/src/modules/modem/analog/ModemIQ.cpp b/src/modules/modem/analog/ModemIQ.cpp new file mode 100644 index 0000000..055c6e8 --- /dev/null +++ b/src/modules/modem/analog/ModemIQ.cpp @@ -0,0 +1,38 @@ +#include "ModemIQ.h" + +ModemIQ::ModemIQ() { + +} + +Modem *ModemIQ::factory() { + return new ModemIQ; +} + +ModemKit *ModemIQ::buildKit(long long sampleRate, int audioSampleRate) { + ModemKit *kit = new ModemKit; + return kit; +} + +void ModemIQ::disposeKit(ModemKit *kit) { + delete kit; +} + +void ModemIQ::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + int bufSize = input->data.size(); + + if (!bufSize) { + input->decRefCount(); + return; + } + + audioOut->channels = 2; + if (audioOut->data.capacity() < (bufSize * 2)) { + audioOut->data.reserve(bufSize * 2); + } + + audioOut->data.resize(bufSize * 2); + for (int i = 0; i < bufSize; i++) { + audioOut->data[i * 2] = input->data[i].imag; + audioOut->data[i * 2 + 1] = input->data[i].real; + } +} diff --git a/src/modules/modem/analog/ModemIQ.h b/src/modules/modem/analog/ModemIQ.h new file mode 100644 index 0000000..7bda47e --- /dev/null +++ b/src/modules/modem/analog/ModemIQ.h @@ -0,0 +1,14 @@ +#pragma once +#include "Modem.h" + +class ModemIQ : public Modem { +public: + ModemIQ(); + Modem *factory(); + ModemKit *buildKit(long long sampleRate, int audioSampleRate); + void disposeKit(ModemKit *kit); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + +}; \ No newline at end of file diff --git a/src/modules/modem/analog/ModemLSB.cpp b/src/modules/modem/analog/ModemLSB.cpp new file mode 100644 index 0000000..74c3b3a --- /dev/null +++ b/src/modules/modem/analog/ModemLSB.cpp @@ -0,0 +1,35 @@ +#include "ModemLSB.h" + +ModemLSB::ModemLSB() { + // half band filter used for side-band elimination + ssbFilt = resamp2_crcf_create(12,-0.25f,60.0f); + demodAM_LSB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_LSB, 1); +} + +Modem *ModemLSB::factory() { + return new ModemLSB; +} + +ModemLSB::~ModemLSB() { + resamp2_crcf_destroy(ssbFilt); + ampmodem_destroy(demodAM_LSB); +} + +void ModemLSB::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitAnalog *akit = (ModemKitAnalog *)kit; + + initOutputBuffers(akit,input); + + if (!bufSize) { + input->decRefCount(); + return; + } + + liquid_float_complex x, y; + for (int i = 0; i < bufSize; i++) { // Reject upper band + resamp2_crcf_filter_execute(ssbFilt,input->data[i],&x,&y); + ampmodem_demodulate(demodAM_LSB, x, &demodOutputData[i]); + } + + buildAudioOutput(akit, audioOut, true); +} diff --git a/src/modules/modem/analog/ModemLSB.h b/src/modules/modem/analog/ModemLSB.h new file mode 100644 index 0000000..180928b --- /dev/null +++ b/src/modules/modem/analog/ModemLSB.h @@ -0,0 +1,15 @@ +#pragma once +#include "Modem.h" +#include "ModemAnalog.h" + +class ModemLSB : public ModemAnalog { +public: + ModemLSB(); + ~ModemLSB(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + resamp2_crcf ssbFilt; + ampmodem demodAM_LSB; +}; \ No newline at end of file diff --git a/src/modules/modem/analog/ModemUSB.cpp b/src/modules/modem/analog/ModemUSB.cpp new file mode 100644 index 0000000..2827451 --- /dev/null +++ b/src/modules/modem/analog/ModemUSB.cpp @@ -0,0 +1,36 @@ +#include "ModemUSB.h" + +ModemUSB::ModemUSB() { + // half band filter used for side-band elimination + ssbFilt = resamp2_crcf_create(12,-0.25f,60.0f); + demodAM_USB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_USB, 1); +} + +Modem *ModemUSB::factory() { + return new ModemUSB; +} + +ModemUSB::~ModemUSB() { + resamp2_crcf_destroy(ssbFilt); + ampmodem_destroy(demodAM_USB); +} + +void ModemUSB::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitAnalog *akit = (ModemKitAnalog *)kit; + + initOutputBuffers(akit,input); + + if (!bufSize) { + input->decRefCount(); + return; + } + + liquid_float_complex x, y; + for (int i = 0; i < bufSize; i++) { // Reject lower band + resamp2_crcf_filter_execute(ssbFilt,input->data[i],&x,&y); + ampmodem_demodulate(demodAM_USB, y, &demodOutputData[i]); + } + + buildAudioOutput(akit, audioOut, true); +} + diff --git a/src/modules/modem/analog/ModemUSB.h b/src/modules/modem/analog/ModemUSB.h new file mode 100644 index 0000000..8267526 --- /dev/null +++ b/src/modules/modem/analog/ModemUSB.h @@ -0,0 +1,14 @@ +#pragma once +#include "ModemAnalog.h" + +class ModemUSB : public ModemAnalog { +public: + ModemUSB(); + ~ModemUSB(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + resamp2_crcf ssbFilt; + ampmodem demodAM_USB; +}; \ No newline at end of file diff --git a/src/modules/modem/digital/ModemAPSK.cpp b/src/modules/modem/digital/ModemAPSK.cpp new file mode 100644 index 0000000..b21c7fc --- /dev/null +++ b/src/modules/modem/digital/ModemAPSK.cpp @@ -0,0 +1 @@ +#include "ModemAPSK.h" \ No newline at end of file diff --git a/src/modules/modem/digital/ModemAPSK.h b/src/modules/modem/digital/ModemAPSK.h new file mode 100644 index 0000000..d8fc4cc --- /dev/null +++ b/src/modules/modem/digital/ModemAPSK.h @@ -0,0 +1,3 @@ +#pragma once +#include "Modem.h" + diff --git a/src/modules/modem/digital/ModemASK.cpp b/src/modules/modem/digital/ModemASK.cpp new file mode 100644 index 0000000..19ba6e9 --- /dev/null +++ b/src/modules/modem/digital/ModemASK.cpp @@ -0,0 +1 @@ +#include "ModemASK.h" diff --git a/src/modules/modem/digital/ModemASK.h b/src/modules/modem/digital/ModemASK.h new file mode 100644 index 0000000..d8fc4cc --- /dev/null +++ b/src/modules/modem/digital/ModemASK.h @@ -0,0 +1,3 @@ +#pragma once +#include "Modem.h" + diff --git a/src/modules/modem/digital/ModemBPSK.cpp b/src/modules/modem/digital/ModemBPSK.cpp new file mode 100644 index 0000000..4cb3576 --- /dev/null +++ b/src/modules/modem/digital/ModemBPSK.cpp @@ -0,0 +1 @@ +#include "ModemBPSK.h" diff --git a/src/modules/modem/digital/ModemBPSK.h b/src/modules/modem/digital/ModemBPSK.h new file mode 100644 index 0000000..d8fc4cc --- /dev/null +++ b/src/modules/modem/digital/ModemBPSK.h @@ -0,0 +1,3 @@ +#pragma once +#include "Modem.h" + diff --git a/src/modules/modem/digital/ModemDPSK.cpp b/src/modules/modem/digital/ModemDPSK.cpp new file mode 100644 index 0000000..04c269d --- /dev/null +++ b/src/modules/modem/digital/ModemDPSK.cpp @@ -0,0 +1 @@ +#include "ModemDPSK.h" diff --git a/src/modules/modem/digital/ModemDPSK.h b/src/modules/modem/digital/ModemDPSK.h new file mode 100644 index 0000000..d8fc4cc --- /dev/null +++ b/src/modules/modem/digital/ModemDPSK.h @@ -0,0 +1,3 @@ +#pragma once +#include "Modem.h" + diff --git a/src/modules/modem/digital/ModemOOK.cpp b/src/modules/modem/digital/ModemOOK.cpp new file mode 100644 index 0000000..50dd454 --- /dev/null +++ b/src/modules/modem/digital/ModemOOK.cpp @@ -0,0 +1 @@ +#include "ModemOOK.h" diff --git a/src/modules/modem/digital/ModemOOK.h b/src/modules/modem/digital/ModemOOK.h new file mode 100644 index 0000000..d8fc4cc --- /dev/null +++ b/src/modules/modem/digital/ModemOOK.h @@ -0,0 +1,3 @@ +#pragma once +#include "Modem.h" + diff --git a/src/modules/modem/digital/ModemPSK.cpp b/src/modules/modem/digital/ModemPSK.cpp new file mode 100644 index 0000000..3efece7 --- /dev/null +++ b/src/modules/modem/digital/ModemPSK.cpp @@ -0,0 +1 @@ +#include "ModemPSK.h" diff --git a/src/modules/modem/digital/ModemPSK.h b/src/modules/modem/digital/ModemPSK.h new file mode 100644 index 0000000..d8fc4cc --- /dev/null +++ b/src/modules/modem/digital/ModemPSK.h @@ -0,0 +1,3 @@ +#pragma once +#include "Modem.h" + diff --git a/src/modules/modem/digital/ModemQAM.cpp b/src/modules/modem/digital/ModemQAM.cpp new file mode 100644 index 0000000..8b4b6d2 --- /dev/null +++ b/src/modules/modem/digital/ModemQAM.cpp @@ -0,0 +1 @@ +#include "ModemQAM.h" diff --git a/src/modules/modem/digital/ModemQAM.h b/src/modules/modem/digital/ModemQAM.h new file mode 100644 index 0000000..d8fc4cc --- /dev/null +++ b/src/modules/modem/digital/ModemQAM.h @@ -0,0 +1,3 @@ +#pragma once +#include "Modem.h" + diff --git a/src/modules/modem/digital/ModemQPSK.cpp b/src/modules/modem/digital/ModemQPSK.cpp new file mode 100644 index 0000000..e2dea39 --- /dev/null +++ b/src/modules/modem/digital/ModemQPSK.cpp @@ -0,0 +1 @@ +#include "ModemQPSK.h" diff --git a/src/modules/modem/digital/ModemQPSK.h b/src/modules/modem/digital/ModemQPSK.h new file mode 100644 index 0000000..d8fc4cc --- /dev/null +++ b/src/modules/modem/digital/ModemQPSK.h @@ -0,0 +1,3 @@ +#pragma once +#include "Modem.h" + diff --git a/src/modules/modem/digital/ModemSQAM.cpp b/src/modules/modem/digital/ModemSQAM.cpp new file mode 100644 index 0000000..fed6b18 --- /dev/null +++ b/src/modules/modem/digital/ModemSQAM.cpp @@ -0,0 +1 @@ +#include "ModemSQAM.h" diff --git a/src/modules/modem/digital/ModemSQAM.h b/src/modules/modem/digital/ModemSQAM.h new file mode 100644 index 0000000..d8fc4cc --- /dev/null +++ b/src/modules/modem/digital/ModemSQAM.h @@ -0,0 +1,3 @@ +#pragma once +#include "Modem.h" + diff --git a/src/modules/modem/digital/ModemST.cpp b/src/modules/modem/digital/ModemST.cpp new file mode 100644 index 0000000..81cea23 --- /dev/null +++ b/src/modules/modem/digital/ModemST.cpp @@ -0,0 +1,2 @@ +#include "ModemST.h" + diff --git a/src/modules/modem/digital/ModemST.h b/src/modules/modem/digital/ModemST.h new file mode 100644 index 0000000..ae80ca2 --- /dev/null +++ b/src/modules/modem/digital/ModemST.h @@ -0,0 +1,2 @@ +#pragma once +#include "Modem.h" \ No newline at end of file From e33b8952d4ad74ebbe097e3427e11c612cad1c7b Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 17 Nov 2015 00:21:17 -0500 Subject: [PATCH 02/28] Modem factory init --- src/CubicSDR.cpp | 8 ++++++++ src/CubicSDR.h | 8 ++++++++ src/modules/modem/Modem.cpp | 4 ++-- src/modules/modem/Modem.h | 5 ++--- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 3081026..4440072 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -164,6 +164,14 @@ bool CubicSDR::OnInit() { wxApp::SetAppName("CubicSDR"); + Modem::addModemFactory("FM", new ModemFM); + Modem::addModemFactory("WBFM", new ModemFMStereo); + Modem::addModemFactory("AM", new ModemAM); + Modem::addModemFactory("LSB", new ModemLSB); + Modem::addModemFactory("USB", new ModemUSB); + Modem::addModemFactory("DSB", new ModemDSB); + Modem::addModemFactory("I/Q", new ModemIQ); + frequency = wxGetApp().getConfig()->getCenterFreq(); offset = 0; ppm = 0; diff --git a/src/CubicSDR.h b/src/CubicSDR.h index 9cba67a..0253624 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -27,6 +27,14 @@ #include "SpectrumVisualProcessor.h" #include "SpectrumVisualDataThread.h" #include "SDRDevices.h" +#include "Modem.h" +#include "ModemFM.h" +#include "ModemFMStereo.h" +#include "ModemAM.h" +#include "ModemUSB.h" +#include "ModemLSB.h" +#include "ModemDSB.h" +#include "ModemIQ.h" #include diff --git a/src/modules/modem/Modem.cpp b/src/modules/modem/Modem.cpp index 2502ef3..058b10d 100644 --- a/src/modules/modem/Modem.cpp +++ b/src/modules/modem/Modem.cpp @@ -2,8 +2,8 @@ ModemFactoryList Modem::modemFactories; -void Modem::addModemFactory(std::string modemName, ModemFactoryFunc *factoryFunc) { - modemFactories[modemName] = factoryFunc; +void Modem::addModemFactory(std::string modemName, Modem *factorySingle) { + modemFactories[modemName] = factorySingle; } ModemFactoryList Modem::getFactories() { diff --git a/src/modules/modem/Modem.h b/src/modules/modem/Modem.h index 66c4060..52587fe 100644 --- a/src/modules/modem/Modem.h +++ b/src/modules/modem/Modem.h @@ -30,12 +30,11 @@ public: }; class Modem; -typedef Modem *(Modem::*ModemFactoryFunc)(); -typedef std::map ModemFactoryList; +typedef std::map ModemFactoryList; class Modem { public: - static void addModemFactory(std::string modemName, ModemFactoryFunc *factoryFunc); + static void addModemFactory(std::string modemName, Modem *factorySingle); static ModemFactoryList getFactories(); virtual Modem *factory(); From 73ca52aee138d68a31dcacf45bb58ba57bc58c93 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 17 Nov 2015 18:57:42 -0500 Subject: [PATCH 03/28] Convert demodulator type ids to strings for now --- src/AppFrame.cpp | 79 +++++++++++++++++---------- src/CubicSDRDefs.h | 2 +- src/demod/DemodDefs.h | 42 +++++++------- src/demod/DemodulatorInstance.cpp | 14 ++--- src/demod/DemodulatorInstance.h | 9 ++- src/demod/DemodulatorMgr.cpp | 6 +- src/demod/DemodulatorMgr.h | 6 +- src/demod/DemodulatorPreThread.cpp | 44 +++++++-------- src/demod/DemodulatorPreThread.h | 12 ++-- src/demod/DemodulatorThread.cpp | 6 +- src/demod/DemodulatorThread.h | 6 +- src/demod/DemodulatorWorkerThread.h | 14 +---- src/visual/ModeSelectorCanvas.cpp | 18 ++++++ src/visual/ModeSelectorCanvas.h | 2 + src/visual/PrimaryGLContext.cpp | 85 ++++++----------------------- src/visual/WaterfallCanvas.cpp | 18 +++--- 16 files changed, 174 insertions(+), 189 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 51f86ef..5bddf93 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -67,28 +67,28 @@ AppFrame::AppFrame() : gainSpacerItem->Show(false); demodModeSelector = new ModeSelectorCanvas(demodPanel, attribList); - demodModeSelector->addChoice(DEMOD_TYPE_FM, "FM"); - demodModeSelector->addChoice(DEMOD_TYPE_AM, "AM"); - demodModeSelector->addChoice(DEMOD_TYPE_LSB, "LSB"); - demodModeSelector->addChoice(DEMOD_TYPE_USB, "USB"); - demodModeSelector->addChoice(DEMOD_TYPE_DSB, "DSB"); - demodModeSelector->addChoice(DEMOD_TYPE_RAW, "I/Q"); - demodModeSelector->setSelection(DEMOD_TYPE_FM); + demodModeSelector->addChoice(0, "FM"); + demodModeSelector->addChoice(1, "AM"); + demodModeSelector->addChoice(2, "LSB"); + demodModeSelector->addChoice(3, "USB"); + demodModeSelector->addChoice(4, "DSB"); + demodModeSelector->addChoice(5, "I/Q"); + demodModeSelector->setSelection("FM"); demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation, Amplitude Modulation and Lower, Upper or Double Side-Band."); demodTray->Add(demodModeSelector, 2, wxEXPAND | wxALL, 0); #ifdef ENABLE_DIGITAL_LAB demodModeSelectorAdv = new ModeSelectorCanvas(this, attribList); - demodModeSelectorAdv->addChoice(DEMOD_TYPE_ASK, "ASK"); - demodModeSelectorAdv->addChoice(DEMOD_TYPE_APSK, "APSK"); - demodModeSelectorAdv->addChoice(DEMOD_TYPE_BPSK, "BPSK"); - demodModeSelectorAdv->addChoice(DEMOD_TYPE_DPSK, "DPSK"); - demodModeSelectorAdv->addChoice(DEMOD_TYPE_PSK, "PSK"); - demodModeSelectorAdv->addChoice(DEMOD_TYPE_OOK, "OOK"); - demodModeSelectorAdv->addChoice(DEMOD_TYPE_ST, "ST"); - demodModeSelectorAdv->addChoice(DEMOD_TYPE_SQAM, "SQAM"); - demodModeSelectorAdv->addChoice(DEMOD_TYPE_QAM, "QAM"); - demodModeSelectorAdv->addChoice(DEMOD_TYPE_QPSK, "QPSK"); + demodModeSelectorAdv->addChoice(0, "ASK"); + demodModeSelectorAdv->addChoice(1, "APSK"); + demodModeSelectorAdv->addChoice(2, "BPSK"); + demodModeSelectorAdv->addChoice(3, "DPSK"); + demodModeSelectorAdv->addChoice(4, "PSK"); + demodModeSelectorAdv->addChoice(5, "OOK"); + demodModeSelectorAdv->addChoice(6, "ST"); + demodModeSelectorAdv->addChoice(7, "SQAM"); + demodModeSelectorAdv->addChoice(8, "QAM"); + demodModeSelectorAdv->addChoice(9, "QPSK"); demodModeSelectorAdv->setHelpTip("Choose advanced modulation types."); demodTray->Add(demodModeSelectorAdv, 3, wxEXPAND | wxALL, 0); @@ -638,7 +638,7 @@ void AppFrame::OnMenu(wxCommandEvent& event) { } else if (event.GetId() == wxID_RESET) { wxGetApp().getDemodMgr().terminateAll(); wxGetApp().setFrequency(100000000); - wxGetApp().getDemodMgr().setLastDemodulatorType(DEMOD_TYPE_FM); + wxGetApp().getDemodMgr().setLastDemodulatorType("FM"); demodModeSelector->setSelection(1); wxGetApp().getDemodMgr().setLastMuted(false); wxGetApp().getDemodMgr().setLastStereo(false); @@ -855,7 +855,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { int outputDevice = demod->getOutputDevice(); scopeCanvas->setDeviceName(outputDevices[outputDevice].name); outputDeviceMenuItems[outputDevice]->Check(true); - int dType = demod->getDemodulatorType(); + std::string dType = demod->getDemodulatorType(); demodModeSelector->setSelection(dType); #ifdef ENABLE_DIGITAL_LAB int dCons = demod->getDemodulatorCons(); @@ -868,12 +868,12 @@ void AppFrame::OnIdle(wxIdleEvent& event) { long long centerFreq = demod->getFrequency(); unsigned int demodBw = (unsigned int) ceil((float) demod->getBandwidth() * 2.25); - if (demod->getDemodulatorType() == DEMOD_TYPE_USB) { + if (demod->getDemodulatorType() == "USB") { demodBw /= 2; centerFreq += demod->getBandwidth() / 4; } - if (demod->getDemodulatorType() == DEMOD_TYPE_LSB) { + if (demod->getDemodulatorType() == "LSB") { demodBw /= 2; centerFreq -= demod->getBandwidth() / 4; } @@ -889,18 +889,18 @@ void AppFrame::OnIdle(wxIdleEvent& event) { demodWaterfallCanvas->setCenterFrequency(centerFreq); demodSpectrumCanvas->setCenterFrequency(centerFreq); } - int dSelection = demodModeSelector->getSelection(); + std::string dSelection = demodModeSelector->getSelectionLabel(); #ifdef ENABLE_DIGITAL_LAB - int dSelectionadv = demodModeSelectorAdv->getSelection(); + std::string dSelectionadv = demodModeSelectorAdv->getSelectionLabel(); int dSelectionCons = demodModeSelectorCons->getSelection(); // basic demodulators - if (dSelection != -1 && dSelection != demod->getDemodulatorType()) { + if (dSelection != "" && dSelection != demod->getDemodulatorType()) { demod->setDemodulatorType(dSelection); demodModeSelectorAdv->setSelection(-1); } // advanced demodulators - else if (dSelectionadv != -1 && dSelectionadv != demod->getDemodulatorType()) { + else if (dSelectionadv != "" && dSelectionadv != demod->getDemodulatorType()) { demod->setDemodulatorType(dSelectionadv); demodModeSelector->setSelection(-1); } @@ -951,18 +951,18 @@ void AppFrame::OnIdle(wxIdleEvent& event) { } else { DemodulatorMgr *mgr = &wxGetApp().getDemodMgr(); - int dSelection = demodModeSelector->getSelection(); + std::string dSelection = demodModeSelector->getSelectionLabel(); #ifdef ENABLE_DIGITAL_LAB - int dSelectionadv = demodModeSelectorAdv->getSelection(); + std::string dSelectionadv = demodModeSelectorAdv->getSelectionLabel(); int dSelectionCons = demodModeSelectorCons->getSelection(); // basic demodulators - if (dSelection != -1 && dSelection != mgr->getLastDemodulatorType()) { + if (dSelection != "" && dSelection != mgr->getLastDemodulatorType()) { mgr->setLastDemodulatorType(dSelection); demodModeSelectorAdv->setSelection(-1); } // advanced demodulators - else if(dSelectionadv != -1 && dSelectionadv != mgr->getLastDemodulatorType()) { + else if(dSelectionadv != "" && dSelectionadv != mgr->getLastDemodulatorType()) { mgr->setLastDemodulatorType(dSelectionadv); demodModeSelector->setSelection(-1); } @@ -1175,7 +1175,7 @@ bool AppFrame::loadSession(std::string fileName) { long bandwidth = *demod->getNext("bandwidth"); long long freq = *demod->getNext("frequency"); - int type = demod->hasAnother("type") ? *demod->getNext("type") : DEMOD_TYPE_FM; + std::string type = demod->hasAnother("type") ? string(*demod->getNext("type")) : "FM"; float squelch_level = demod->hasAnother("squelch_level") ? (float) *demod->getNext("squelch_level") : 0; int squelch_enabled = demod->hasAnother("squelch_enabled") ? (int) *demod->getNext("squelch_enabled") : 0; int stereo = demod->hasAnother("stereo") ? (int) *demod->getNext("stereo") : 0; @@ -1183,6 +1183,25 @@ bool AppFrame::loadSession(std::string fileName) { std::string output_device = demod->hasAnother("output_device") ? string(*(demod->getNext("output_device"))) : ""; float gain = demod->hasAnother("gain") ? (float) *demod->getNext("gain") : 1.0; + // TODO: Check if "type" is numeric and perform update to new values + //#define DEMOD_TYPE_NULL 0 + //#define DEMOD_TYPE_FM 1 + //#define DEMOD_TYPE_AM 2 + //#define DEMOD_TYPE_LSB 3 + //#define DEMOD_TYPE_USB 4 + //#define DEMOD_TYPE_DSB 5 + //#define DEMOD_TYPE_ASK 6 + //#define DEMOD_TYPE_APSK 7 + //#define DEMOD_TYPE_BPSK 8 + //#define DEMOD_TYPE_DPSK 9 + //#define DEMOD_TYPE_PSK 10 + //#define DEMOD_TYPE_OOK 11 + //#define DEMOD_TYPE_ST 12 + //#define DEMOD_TYPE_SQAM 13 + //#define DEMOD_TYPE_QAM 14 + //#define DEMOD_TYPE_QPSK 15 + //#define DEMOD_TYPE_RAW 16 + DemodulatorInstance *newDemod = wxGetApp().getDemodMgr().newThread(); loadedDemod = newDemod; numDemodulators++; diff --git a/src/CubicSDRDefs.h b/src/CubicSDRDefs.h index 07d7d02..38b2913 100644 --- a/src/CubicSDRDefs.h +++ b/src/CubicSDRDefs.h @@ -30,7 +30,7 @@ const char filePathSeparator = #define DEFAULT_SAMPLE_RATE 2500000 #define DEFAULT_FFT_SIZE 2048 -#define DEFAULT_DEMOD_TYPE 1 +#define DEFAULT_DEMOD_TYPE "FM" #define DEFAULT_DEMOD_BW 200000 #define DEFAULT_WATERFALL_LPS 30 diff --git a/src/demod/DemodDefs.h b/src/demod/DemodDefs.h index ce6e36b..ded4606 100644 --- a/src/demod/DemodDefs.h +++ b/src/demod/DemodDefs.h @@ -7,23 +7,23 @@ #include #include -#define DEMOD_TYPE_NULL 0 -#define DEMOD_TYPE_FM 1 -#define DEMOD_TYPE_AM 2 -#define DEMOD_TYPE_LSB 3 -#define DEMOD_TYPE_USB 4 -#define DEMOD_TYPE_DSB 5 -#define DEMOD_TYPE_ASK 6 -#define DEMOD_TYPE_APSK 7 -#define DEMOD_TYPE_BPSK 8 -#define DEMOD_TYPE_DPSK 9 -#define DEMOD_TYPE_PSK 10 -#define DEMOD_TYPE_OOK 11 -#define DEMOD_TYPE_ST 12 -#define DEMOD_TYPE_SQAM 13 -#define DEMOD_TYPE_QAM 14 -#define DEMOD_TYPE_QPSK 15 -#define DEMOD_TYPE_RAW 16 +//#define DEMOD_TYPE_NULL 0 +//#define DEMOD_TYPE_FM 1 +//#define DEMOD_TYPE_AM 2 +//#define DEMOD_TYPE_LSB 3 +//#define DEMOD_TYPE_USB 4 +//#define DEMOD_TYPE_DSB 5 +//#define DEMOD_TYPE_ASK 6 +//#define DEMOD_TYPE_APSK 7 +//#define DEMOD_TYPE_BPSK 8 +//#define DEMOD_TYPE_DPSK 9 +//#define DEMOD_TYPE_PSK 10 +//#define DEMOD_TYPE_OOK 11 +//#define DEMOD_TYPE_ST 12 +//#define DEMOD_TYPE_SQAM 13 +//#define DEMOD_TYPE_QAM 14 +//#define DEMOD_TYPE_QPSK 15 +//#define DEMOD_TYPE_RAW 16 #include "IOThread.h" @@ -62,11 +62,11 @@ public: }; DemodulatorThreadControlCommand() : - cmd(DEMOD_THREAD_CMD_CTL_NULL), demodType(DEMOD_TYPE_NULL) { + cmd(DEMOD_THREAD_CMD_CTL_NULL), demodType("") { } DemodulatorThreadControlCommandEnum cmd; - int demodType; + std::string demodType; }; class DemodulatorThreadIQData: public ReferenceCounter { @@ -145,11 +145,11 @@ public: unsigned int bandwidth; // set equal to disable second stage re-sampling? unsigned int audioSampleRate; - int demodType; + std::string demodType; DemodulatorThreadParameters() : frequency(0), sampleRate(DEFAULT_SAMPLE_RATE), bandwidth(200000), audioSampleRate(0), - demodType(DEMOD_TYPE_FM) { + demodType("FM") { } diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index 0cd93aa..1405ef4 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -271,16 +271,16 @@ void DemodulatorInstance::checkBandwidth() { // } } -void DemodulatorInstance::setDemodulatorType(int demod_type_in) { +void DemodulatorInstance::setDemodulatorType(std::string demod_type_in) { currentDemodType = demod_type_in; - if (currentDemodType == DEMOD_TYPE_RAW) { + if (currentDemodType == "I/Q") { if (currentAudioSampleRate) { setBandwidth(currentAudioSampleRate); } else { setBandwidth(AudioThread::deviceSampleRate[getOutputDevice()]); } - } else if (currentDemodType == DEMOD_TYPE_USB || currentDemodType == DEMOD_TYPE_LSB || currentDemodType == DEMOD_TYPE_DSB || currentDemodType == DEMOD_TYPE_AM) { + } else if (currentDemodType == "USB" || currentDemodType == "LSB" || currentDemodType == "DSB" || currentDemodType == "AM") { demodulatorThread->setAGC(false); } else { demodulatorThread->setAGC(true); @@ -300,7 +300,7 @@ void DemodulatorInstance::setDemodulatorType(int demod_type_in) { } } -int DemodulatorInstance::getDemodulatorType() { +std::string DemodulatorInstance::getDemodulatorType() { return currentDemodType; } @@ -321,7 +321,7 @@ int DemodulatorInstance::getDemodulatorCons() { } void DemodulatorInstance::setBandwidth(int bw) { - if (currentDemodType == DEMOD_TYPE_RAW) { + if (currentDemodType == "I/Q") { if (currentAudioSampleRate) { bw = currentAudioSampleRate; } else { @@ -384,7 +384,7 @@ void DemodulatorInstance::setAudioSampleRate(int sampleRate) { command.llong_value = sampleRate; pipeDemodCommand->push(command); } - if (currentDemodType == DEMOD_TYPE_RAW) { + if (currentDemodType == "I/Q") { setBandwidth(currentAudioSampleRate); } } @@ -400,7 +400,7 @@ int DemodulatorInstance::getAudioSampleRate() { void DemodulatorInstance::setGain(float gain_in) { currentAudioGain = gain_in; - if (currentDemodType == DEMOD_TYPE_RAW) { + if (currentDemodType == "I/Q") { if (gain_in < 0.25) { audioThread->setGain(1.0); demodulatorThread->setAGC(false); diff --git a/src/demod/DemodulatorInstance.h b/src/demod/DemodulatorInstance.h index 19d3fb6..60cd25c 100644 --- a/src/demod/DemodulatorInstance.h +++ b/src/demod/DemodulatorInstance.h @@ -53,8 +53,8 @@ public: void setOutputDevice(int device_id); int getOutputDevice(); - void setDemodulatorType(int demod_type_in); - int getDemodulatorType(); + void setDemodulatorType(std::string demod_type_in); + std::string getDemodulatorType(); void setDemodulatorLock(bool demod_lock_in); int getDemodulatorLock(); @@ -99,6 +99,9 @@ private: void checkBandwidth(); + Modem *currentModem; + ModemKit *currentModemKit; + std::atomic label; // std::atomic_bool terminated; // std::atomic_bool demodTerminated; // @@ -111,7 +114,7 @@ private: std::atomic_llong currentFrequency; std::atomic_int currentBandwidth; - std::atomic_int currentDemodType; + std::string currentDemodType; std::atomic_int currentDemodCons; std::atomic_int currentOutputDevice; std::atomic_int currentAudioSampleRate; diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index fcc2c1b..bfb100e 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -76,7 +76,7 @@ std::vector *DemodulatorMgr::getDemodulatorsAt(long long long long halfBuffer = bandwidth / 2; - if ((freq <= (freqTest + ((testDemod->getDemodulatorType() != DEMOD_TYPE_LSB)?halfBandwidthTest:0) + halfBuffer)) && (freq >= (freqTest - ((testDemod->getDemodulatorType() != DEMOD_TYPE_USB)?halfBandwidthTest:0) - halfBuffer))) { + if ((freq <= (freqTest + ((testDemod->getDemodulatorType() != "LSB")?halfBandwidthTest:0) + halfBuffer)) && (freq >= (freqTest - ((testDemod->getDemodulatorType() != "USB")?halfBandwidthTest:0) - halfBuffer))) { foundDemods->push_back(testDemod); } } @@ -184,11 +184,11 @@ void DemodulatorMgr::setLastBandwidth(int lastBandwidth) { this->lastBandwidth = lastBandwidth; } -int DemodulatorMgr::getLastDemodulatorType() const { +std::string DemodulatorMgr::getLastDemodulatorType() const { return lastDemodType; } -void DemodulatorMgr::setLastDemodulatorType(int lastDemodType) { +void DemodulatorMgr::setLastDemodulatorType(std::string lastDemodType) { this->lastDemodType = lastDemodType; } diff --git a/src/demod/DemodulatorMgr.h b/src/demod/DemodulatorMgr.h index 0cfb4ed..739c1c5 100644 --- a/src/demod/DemodulatorMgr.h +++ b/src/demod/DemodulatorMgr.h @@ -25,8 +25,8 @@ public: int getLastBandwidth() const; void setLastBandwidth(int lastBandwidth); - int getLastDemodulatorType() const; - void setLastDemodulatorType(int lastDemodType); + std::string getLastDemodulatorType() const; + void setLastDemodulatorType(std::string lastDemodType); int getLastDemodulatorCons() const; void setLastDemodulatorCons(int lastDemodCons); @@ -57,7 +57,7 @@ private: DemodulatorInstance *activeVisualDemodulator; int lastBandwidth; - int lastDemodType; + std::string lastDemodType; bool lastDemodLock; int lastDemodCons; bool lastSquelchEnabled; diff --git a/src/demod/DemodulatorPreThread.cpp b/src/demod/DemodulatorPreThread.cpp index 32d235b..35f69d4 100644 --- a/src/demod/DemodulatorPreThread.cpp +++ b/src/demod/DemodulatorPreThread.cpp @@ -8,7 +8,7 @@ #include "DemodulatorPreThread.h" #include "CubicSDR.h" -DemodulatorPreThread::DemodulatorPreThread() : IOThread(), iqResampler(NULL), iqResampleRatio(1), audioResampler(NULL), stereoResampler(NULL), audioResampleRatio(1), firStereoLeft(NULL), firStereoRight(NULL), iirStereoPilot(NULL), iqInputQueue(NULL), iqOutputQueue(NULL), threadQueueNotify(NULL), commandQueue(NULL) +DemodulatorPreThread::DemodulatorPreThread() : IOThread(), iqResampler(NULL), iqResampleRatio(1), iqInputQueue(NULL), iqOutputQueue(NULL), threadQueueNotify(NULL), commandQueue(NULL) { initialized.store(false); @@ -272,27 +272,27 @@ void DemodulatorPreThread::run() { iqResampleRatio = result.iqResampleRatio; } - if (result.firStereoLeft) { - firStereoLeft = result.firStereoLeft; - } - - if (result.firStereoRight) { - firStereoRight = result.firStereoRight; - } - - if (result.iirStereoPilot) { - iirStereoPilot = result.iirStereoPilot; - } - - if (result.audioResampler) { - audioResampler = result.audioResampler; - audioResampleRatio = result.audioResamplerRatio; - stereoResampler = result.stereoResampler; - } - - if (result.audioSampleRate) { - params.audioSampleRate = result.audioSampleRate; - } +// if (result.firStereoLeft) { +// firStereoLeft = result.firStereoLeft; +// } +// +// if (result.firStereoRight) { +// firStereoRight = result.firStereoRight; +// } +// +// if (result.iirStereoPilot) { +// iirStereoPilot = result.iirStereoPilot; +// } +// +// if (result.audioResampler) { +// audioResampler = result.audioResampler; +// audioResampleRatio = result.audioResamplerRatio; +// stereoResampler = result.stereoResampler; +// } +// +// if (result.audioSampleRate) { +// params.audioSampleRate = result.audioSampleRate; +// } if (result.bandwidth) { params.bandwidth = result.bandwidth; diff --git a/src/demod/DemodulatorPreThread.h b/src/demod/DemodulatorPreThread.h index f3edc41..3875858 100644 --- a/src/demod/DemodulatorPreThread.h +++ b/src/demod/DemodulatorPreThread.h @@ -37,13 +37,13 @@ protected: double iqResampleRatio; std::vector resampledData; - msresamp_rrrf audioResampler; - msresamp_rrrf stereoResampler; - double audioResampleRatio; +// msresamp_rrrf audioResampler; +// msresamp_rrrf stereoResampler; +// double audioResampleRatio; - firfilt_rrrf firStereoLeft; - firfilt_rrrf firStereoRight; - iirfilt_crcf iirStereoPilot; +// firfilt_rrrf firStereoLeft; +// firfilt_rrrf firStereoRight; +// iirfilt_crcf iirStereoPilot; DemodulatorThreadParameters params; DemodulatorThreadParameters lastParams; diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index 3f9d4a7..8c9f2d5 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -16,7 +16,7 @@ DemodulatorThread::DemodulatorThread() : IOThread(), iqAutoGain(NULL), amOutputC // stereo.store(false); muted.store(false); agcEnabled.store(false); - demodulatorType.store(DEMOD_TYPE_FM); + demodulatorType = "FM"; // demodFM = freqdem_create(0.5); // demodAM_USB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_USB, 1); @@ -965,11 +965,11 @@ float DemodulatorThread::getSquelchLevel() { return squelchLevel; } -void DemodulatorThread::setDemodulatorType(int demod_type_in) { +void DemodulatorThread::setDemodulatorType(std::string demod_type_in) { demodulatorType = demod_type_in; } -int DemodulatorThread::getDemodulatorType() { +std::string DemodulatorThread::getDemodulatorType() { return demodulatorType; } diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index 216996c..7e92ba7 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -34,8 +34,8 @@ public: void setSquelchLevel(float signal_level_in); float getSquelchLevel(); - void setDemodulatorType(int demod_type_in); - int getDemodulatorType(); + void setDemodulatorType(std::string demod_type_in); + std::string getDemodulatorType(); void setDemodulatorLock(bool demod_lock_in); int getDemodulatorLock(); @@ -140,7 +140,7 @@ protected: // std::atomic_bool stereo; std::atomic_bool muted; std::atomic_bool agcEnabled; - std::atomic_int demodulatorType; + std::string demodulatorType; std::atomic_int demodulatorCons; int audioSampleRate; diff --git a/src/demod/DemodulatorWorkerThread.h b/src/demod/DemodulatorWorkerThread.h index 4a202c9..633ef5f 100644 --- a/src/demod/DemodulatorWorkerThread.h +++ b/src/demod/DemodulatorWorkerThread.h @@ -7,6 +7,7 @@ #include "AudioThread.h" #include "ThreadQueue.h" #include "CubicSDRDefs.h" +#include "Modem.h" class DemodulatorWorkerThreadResult { public: @@ -15,8 +16,7 @@ public: }; DemodulatorWorkerThreadResult() : - cmd(DEMOD_WORKER_THREAD_RESULT_NULL), iqResampler(NULL), iqResampleRatio(0), audioResampler(NULL), stereoResampler(NULL), audioResamplerRatio( - 0), firStereoLeft(NULL), firStereoRight(NULL), iirStereoPilot(NULL), sampleRate(0), bandwidth(0), audioSampleRate(0) { + cmd(DEMOD_WORKER_THREAD_RESULT_NULL), iqResampler(nullptr), iqResampleRatio(0), sampleRate(0), bandwidth(0), modemKit(nullptr) { } @@ -29,20 +29,12 @@ public: msresamp_crcf iqResampler; double iqResampleRatio; - msresamp_rrrf audioResampler; - msresamp_rrrf stereoResampler; - double audioResamplerRatio; - - firfilt_rrrf firStereoLeft; - firfilt_rrrf firStereoRight; - iirfilt_crcf iirStereoPilot; DemodulatorThread *demodThread; long long sampleRate; unsigned int bandwidth; - unsigned int audioSampleRate; - + ModemKit *modemKit; }; class DemodulatorWorkerThreadCommand { diff --git a/src/visual/ModeSelectorCanvas.cpp b/src/visual/ModeSelectorCanvas.cpp index f52f533..d89be48 100644 --- a/src/visual/ModeSelectorCanvas.cpp +++ b/src/visual/ModeSelectorCanvas.cpp @@ -155,6 +155,24 @@ void ModeSelectorCanvas::addChoice(int value, std::string label) { numChoices = selections.size(); } +void ModeSelectorCanvas::setSelection(std::string label) { + for (int i = 0; i < numChoices; i++) { + if (selections[i].label == label) { + currentSelection = i; + return; + } + } + currentSelection = -1; + Refresh(); +} + +std::string ModeSelectorCanvas::getSelectionLabel() { + if (currentSelection == -1) { + return ""; + } + return selections[currentSelection].label; +} + void ModeSelectorCanvas::setSelection(int value) { for (int i = 0; i < numChoices; i++) { if (selections[i].value == value) { diff --git a/src/visual/ModeSelectorCanvas.h b/src/visual/ModeSelectorCanvas.h index 2c76294..ca2a524 100644 --- a/src/visual/ModeSelectorCanvas.h +++ b/src/visual/ModeSelectorCanvas.h @@ -32,6 +32,8 @@ public: void setHelpTip(std::string tip); void addChoice(int value, std::string label); + void setSelection(std::string label); + std::string getSelectionLabel(); void setSelection(int value); int getSelection(); diff --git a/src/visual/PrimaryGLContext.cpp b/src/visual/PrimaryGLContext.cpp index f11fdac..7aea40a 100644 --- a/src/visual/PrimaryGLContext.cpp +++ b/src/visual/PrimaryGLContext.cpp @@ -87,7 +87,7 @@ void PrimaryGLContext::DrawDemodInfo(DemodulatorInstance *demod, RGBA4f color, l glColor4f(color.r, color.g, color.b, 0.6); float ofs = ((float) demod->getBandwidth()) / (float) srate; - float ofsLeft = (demod->getDemodulatorType()!=DEMOD_TYPE_USB)?ofs:0, ofsRight = (demod->getDemodulatorType()!=DEMOD_TYPE_LSB)?ofs:0; + float ofsLeft = (demod->getDemodulatorType()!="USB")?ofs:0, ofsRight = (demod->getDemodulatorType()!="LSB")?ofs:0; float labelHeight = 20.0 / viewHeight; float hPos = -1.0 + labelHeight; @@ -139,9 +139,9 @@ void PrimaryGLContext::DrawDemodInfo(DemodulatorInstance *demod, RGBA4f color, l demodLabel = std::string("[M] ") + demodLabel; } - if (demod->getDemodulatorType() == DEMOD_TYPE_USB) { + if (demod->getDemodulatorType() == "USB") { GLFont::getFont(GLFont::GLFONT_SIZE16).drawString(demodLabel, uxPos, hPos, 16, GLFont::GLFONT_ALIGN_LEFT, GLFont::GLFONT_ALIGN_CENTER); - } else if (demod->getDemodulatorType() == DEMOD_TYPE_LSB) { + } else if (demod->getDemodulatorType() == "LSB") { GLFont::getFont(GLFont::GLFONT_SIZE16).drawString(demodLabel, uxPos, hPos, 16, GLFont::GLFONT_ALIGN_RIGHT, GLFont::GLFONT_ALIGN_CENTER); } else { GLFont::getFont(GLFont::GLFONT_SIZE16).drawString(demodLabel, uxPos, hPos, 16, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER); @@ -172,7 +172,7 @@ void PrimaryGLContext::DrawDemod(DemodulatorInstance *demod, RGBA4f color, long glColor4f(color.r, color.g, color.b, 0.6); float ofs = ((float) demod->getBandwidth()) / (float) srate; - float ofsLeft = (demod->getDemodulatorType()!=DEMOD_TYPE_USB)?ofs:0, ofsRight = (demod->getDemodulatorType()!=DEMOD_TYPE_LSB)?ofs:0; + float ofsLeft = (demod->getDemodulatorType()!="USB")?ofs:0, ofsRight = (demod->getDemodulatorType()!="LSB")?ofs:0; glBegin(GL_LINES); glVertex3f((uxPos - 0.5) * 2.0, 1.0, 0.0); @@ -217,69 +217,20 @@ void PrimaryGLContext::DrawDemod(DemodulatorInstance *demod, RGBA4f color, long std::string demodStr = ""; GLFont::Align demodAlign = GLFont::GLFONT_ALIGN_CENTER; - switch (demod->getDemodulatorType()) { - case DEMOD_TYPE_FM: - demodStr = "FM"; - demodAlign = GLFont::GLFONT_ALIGN_CENTER; - break; - case DEMOD_TYPE_AM: - demodStr = "AM"; - demodAlign = GLFont::GLFONT_ALIGN_CENTER; - break; - case DEMOD_TYPE_LSB: - demodStr = "LSB"; + demodStr = demod->getDemodulatorType(); + + demodAlign = GLFont::GLFONT_ALIGN_CENTER; + + if (demodStr == "LSB") { demodAlign = GLFont::GLFONT_ALIGN_RIGHT; uxPos -= xOfs; - break; - case DEMOD_TYPE_USB: - demodStr = "USB"; + } else if (demodStr == "USB") { demodAlign = GLFont::GLFONT_ALIGN_LEFT; uxPos += xOfs; - break; - // advanced demodulators start here - case DEMOD_TYPE_ASK: - demodStr = "ASK"; - demodAlign = GLFont::GLFONT_ALIGN_CENTER; - break; - case DEMOD_TYPE_APSK: - demodStr = "APSK"; - demodAlign = GLFont::GLFONT_ALIGN_CENTER; - break; - case DEMOD_TYPE_BPSK: - demodStr = "BPSK"; - demodAlign = GLFont::GLFONT_ALIGN_CENTER; - break; - case DEMOD_TYPE_DPSK: - demodStr = "DPSK"; - demodAlign = GLFont::GLFONT_ALIGN_CENTER; - break; - case DEMOD_TYPE_PSK: - demodStr = "PSK"; - demodAlign = GLFont::GLFONT_ALIGN_CENTER; - break; - case DEMOD_TYPE_OOK: - demodStr = "OOK"; - demodAlign = GLFont::GLFONT_ALIGN_CENTER; - break; - case DEMOD_TYPE_SQAM: - demodStr = "SQAM"; - demodAlign = GLFont::GLFONT_ALIGN_CENTER; - break; - case DEMOD_TYPE_ST: - demodStr = "ST"; - demodAlign = GLFont::GLFONT_ALIGN_CENTER; - break; - case DEMOD_TYPE_QAM: - demodStr = "QAM"; - demodAlign = GLFont::GLFONT_ALIGN_CENTER; - break; - case DEMOD_TYPE_QPSK: - demodStr = "QPSK"; - demodAlign = GLFont::GLFONT_ALIGN_CENTER; - break; } + // advanced demodulators start here - if (demod->getDemodulatorCons() != NULL && demod->getDemodulatorCons() > 0) { + if (demod->getDemodulatorCons() > 0) { demodStr = demodStr + std::to_string(demod->getDemodulatorCons()); } @@ -306,7 +257,7 @@ void PrimaryGLContext::DrawFreqSelector(float uxPos, RGBA4f color, float w, long long long bw = 0; - int last_type = wxGetApp().getDemodMgr().getLastDemodulatorType(); + std::string last_type = wxGetApp().getDemodMgr().getLastDemodulatorType(); if (!demod) { bw = wxGetApp().getDemodMgr().getLastBandwidth(); @@ -337,12 +288,12 @@ void PrimaryGLContext::DrawFreqSelector(float uxPos, RGBA4f color, float w, long ofs = ((float) bw) / (float) srate; } - if (last_type != DEMOD_TYPE_USB) { + if (last_type != "USB") { glVertex3f((uxPos - 0.5) * 2.0 - ofs, 1.0, 0.0); glVertex3f((uxPos - 0.5) * 2.0 - ofs, -1.0, 0.0); } - if (last_type != DEMOD_TYPE_LSB) { + if (last_type != "LSB") { glVertex3f((uxPos - 0.5) * 2.0 + ofs, 1.0, 0.0); glVertex3f((uxPos - 0.5) * 2.0 + ofs, -1.0, 0.0); } @@ -359,7 +310,7 @@ void PrimaryGLContext::DrawRangeSelector(float uxPos1, float uxPos2, RGBA4f colo uxPos1=temp; } - int last_type = wxGetApp().getDemodMgr().getLastDemodulatorType(); + std::string last_type = wxGetApp().getDemodMgr().getLastDemodulatorType(); glDisable(GL_TEXTURE_2D); @@ -367,14 +318,14 @@ void PrimaryGLContext::DrawRangeSelector(float uxPos1, float uxPos2, RGBA4f colo glBlendFunc(GL_SRC_ALPHA, GL_ONE); glColor4f(color.r, color.g, color.b, 0.6); - glLineWidth((last_type == DEMOD_TYPE_USB)?2.0:1.0); + glLineWidth((last_type == "USB")?2.0:1.0); glBegin(GL_LINES); glVertex3f((uxPos1 - 0.5) * 2.0, 1.0, 0.0); glVertex3f((uxPos1 - 0.5) * 2.0, -1.0, 0.0); glEnd(); - glLineWidth((last_type == DEMOD_TYPE_LSB)?2.0:1.0); + glLineWidth((last_type == "LSB")?2.0:1.0); glBegin(GL_LINES); glVertex3f((uxPos2 - 0.5) * 2.0, 1.0, 0.0); diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index 971552e..85f4fc2 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -253,7 +253,7 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { long long currentCenterFreq = getCenterFrequency(); ColorTheme *currentTheme = ThemeMgr::mgr.currentTheme; - int last_type = wxGetApp().getDemodMgr().getLastDemodulatorType(); + std::string last_type = wxGetApp().getDemodMgr().getLastDemodulatorType(); if (mouseTracker.mouseInView() || wxGetApp().getDemodMgr().getActiveDemodulator()) { hoverAlpha += (1.0f-hoverAlpha)*0.1f; @@ -277,7 +277,7 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { glContext->DrawDemod(lastActiveDemodulator, isNew?currentTheme->waterfallHighlight:currentTheme->waterfallDestroy, currentCenterFreq, currentBandwidth); - if ((last_type == DEMOD_TYPE_LSB || last_type == DEMOD_TYPE_USB) && mouseTracker.mouseDown()) { + if ((last_type == "LSB" || last_type == "USB") && mouseTracker.mouseDown()) { centerPos = mouseTracker.getMouseX(); glContext->DrawRangeSelector(centerPos, centerPos-width, isNew?currentTheme->waterfallNew:currentTheme->waterfallHover); } else { @@ -534,8 +534,8 @@ void WaterfallCanvas::OnMouseMoved(wxMouseEvent& event) { double maxDist = ((double)halfBw + bufferBw); if ((double)dist <= maxDist) { - if ((freqDiff > 0 && demod->getDemodulatorType() == DEMOD_TYPE_USB) || - (freqDiff < 0 && demod->getDemodulatorType() == DEMOD_TYPE_LSB)) { + if ((freqDiff > 0 && demod->getDemodulatorType() == "USB") || + (freqDiff < 0 && demod->getDemodulatorType() == "LSB")) { continue; } @@ -565,12 +565,12 @@ void WaterfallCanvas::OnMouseMoved(wxMouseEvent& event) { if (abs(freqDiff) > (activeDemodulator->getBandwidth() / 3)) { if (freqDiff > 0) { - if (activeDemodulator->getDemodulatorType() != DEMOD_TYPE_USB) { + if (activeDemodulator->getDemodulatorType() != "USB") { nextDragState = WF_DRAG_BANDWIDTH_LEFT; SetCursor(wxCURSOR_SIZEWE); } } else { - if (activeDemodulator->getDemodulatorType() != DEMOD_TYPE_LSB) { + if (activeDemodulator->getDemodulatorType() != "LSB") { nextDragState = WF_DRAG_BANDWIDTH_RIGHT; SetCursor(wxCURSOR_SIZEWE); } @@ -712,9 +712,9 @@ void WaterfallCanvas::OnMouseReleased(wxMouseEvent& event) { float width = mouseTracker.getOriginDeltaMouseX(); float pos; - int last_type = mgr->getLastDemodulatorType(); + std::string last_type = mgr->getLastDemodulatorType(); - if (last_type == DEMOD_TYPE_LSB || last_type == DEMOD_TYPE_USB) { + if (last_type == "LSB" || last_type == "USB") { float pos1 = mouseTracker.getOriginMouseX(); float pos2 = mouseTracker.getMouseX(); @@ -724,7 +724,7 @@ void WaterfallCanvas::OnMouseReleased(wxMouseEvent& event) { pos2 = tmp; } - pos = (last_type == DEMOD_TYPE_LSB)?pos2:pos1; + pos = (last_type == "LSB")?pos2:pos1; width *= 2; } else { pos = mouseTracker.getOriginMouseX() + width / 2.0; From 39c42c2b822fe168f45b2ecdee695ab4b3331638 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 17 Nov 2015 19:32:47 -0500 Subject: [PATCH 04/28] Add modemkit to demod chain --- src/demod/DemodDefs.h | 24 +++++------------------- src/demod/DemodulatorInstance.h | 3 --- src/demod/DemodulatorPreThread.cpp | 12 +++++++++++- src/demod/DemodulatorPreThread.h | 3 +++ src/demod/DemodulatorThread.h | 4 ++++ src/demod/DemodulatorWorkerThread.h | 1 + 6 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/demod/DemodDefs.h b/src/demod/DemodDefs.h index ded4606..ec40035 100644 --- a/src/demod/DemodDefs.h +++ b/src/demod/DemodDefs.h @@ -7,24 +7,6 @@ #include #include -//#define DEMOD_TYPE_NULL 0 -//#define DEMOD_TYPE_FM 1 -//#define DEMOD_TYPE_AM 2 -//#define DEMOD_TYPE_LSB 3 -//#define DEMOD_TYPE_USB 4 -//#define DEMOD_TYPE_DSB 5 -//#define DEMOD_TYPE_ASK 6 -//#define DEMOD_TYPE_APSK 7 -//#define DEMOD_TYPE_BPSK 8 -//#define DEMOD_TYPE_DPSK 9 -//#define DEMOD_TYPE_PSK 10 -//#define DEMOD_TYPE_OOK 11 -//#define DEMOD_TYPE_ST 12 -//#define DEMOD_TYPE_SQAM 13 -//#define DEMOD_TYPE_QAM 14 -//#define DEMOD_TYPE_QPSK 15 -//#define DEMOD_TYPE_RAW 16 - #include "IOThread.h" class DemodulatorThread; @@ -93,14 +75,18 @@ public: } }; +class Modem; +class ModemKit; class DemodulatorThreadPostIQData: public ReferenceCounter { public: std::vector data; long long sampleRate; + Modem *modem; + ModemKit *modemKit; DemodulatorThreadPostIQData() : - sampleRate(0) { + sampleRate(0), modem(nullptr), modemKit(nullptr) { } diff --git a/src/demod/DemodulatorInstance.h b/src/demod/DemodulatorInstance.h index 60cd25c..158b800 100644 --- a/src/demod/DemodulatorInstance.h +++ b/src/demod/DemodulatorInstance.h @@ -98,9 +98,6 @@ protected: private: void checkBandwidth(); - - Modem *currentModem; - ModemKit *currentModemKit; std::atomic label; // std::atomic_bool terminated; // diff --git a/src/demod/DemodulatorPreThread.cpp b/src/demod/DemodulatorPreThread.cpp index 35f69d4..e88cce8 100644 --- a/src/demod/DemodulatorPreThread.cpp +++ b/src/demod/DemodulatorPreThread.cpp @@ -8,7 +8,7 @@ #include "DemodulatorPreThread.h" #include "CubicSDR.h" -DemodulatorPreThread::DemodulatorPreThread() : IOThread(), iqResampler(NULL), iqResampleRatio(1), iqInputQueue(NULL), iqOutputQueue(NULL), threadQueueNotify(NULL), commandQueue(NULL) +DemodulatorPreThread::DemodulatorPreThread() : IOThread(), iqResampler(NULL), iqResampleRatio(1), iqInputQueue(NULL), iqOutputQueue(NULL), threadQueueNotify(NULL), commandQueue(NULL), cModem(nullptr), cModemKit(nullptr) { initialized.store(false); @@ -251,6 +251,8 @@ void DemodulatorPreThread::run() { // resamp->firStereoLeft = firStereoLeft; // resamp->firStereoRight = firStereoRight; // resamp->iirStereoPilot = iirStereoPilot; + resamp->modem = cModem; + resamp->modemKit = cModemKit; resamp->sampleRate = params.bandwidth; iqOutputQueue->push(resamp); @@ -294,6 +296,14 @@ void DemodulatorPreThread::run() { // params.audioSampleRate = result.audioSampleRate; // } + if (result.modem != nullptr) { + cModem = result.modem; + } + + if (result.modemKit != nullptr) { + cModemKit = result.modemKit; + } + if (result.bandwidth) { params.bandwidth = result.bandwidth; } diff --git a/src/demod/DemodulatorPreThread.h b/src/demod/DemodulatorPreThread.h index 3875858..0fc7154 100644 --- a/src/demod/DemodulatorPreThread.h +++ b/src/demod/DemodulatorPreThread.h @@ -37,6 +37,9 @@ protected: double iqResampleRatio; std::vector resampledData; + Modem *cModem; + ModemKit *cModemKit; + // msresamp_rrrf audioResampler; // msresamp_rrrf stereoResampler; // double audioResampleRatio; diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index 7e92ba7..4d90c0c 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -5,6 +5,7 @@ #include "DemodDefs.h" #include "AudioThread.h" +#include "Modem.h" typedef ThreadQueue DemodulatorThreadOutputQueue; @@ -154,6 +155,9 @@ protected: void updateDemodulatorCons(int Cons); void updateDemodulatorLock(modem demod, float sensitivity); + Modem *cModem; + ModemKit *cModemKit; + DemodulatorThreadPostInputQueue* iqInputQueue; AudioThreadInputQueue *audioOutputQueue; DemodulatorThreadOutputQueue* audioVisOutputQueue; diff --git a/src/demod/DemodulatorWorkerThread.h b/src/demod/DemodulatorWorkerThread.h index 633ef5f..38fb77a 100644 --- a/src/demod/DemodulatorWorkerThread.h +++ b/src/demod/DemodulatorWorkerThread.h @@ -34,6 +34,7 @@ public: long long sampleRate; unsigned int bandwidth; + Modem *modem; ModemKit *modemKit; }; From 31bf65259d6f080f315e1704832c8f9e60317a1d Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 17 Nov 2015 20:20:12 -0500 Subject: [PATCH 05/28] Worker thread demod spawn, abstract Modem --- src/demod/DemodDefs.h | 1 + src/demod/DemodulatorWorkerThread.cpp | 49 +++++++-------------------- src/demod/DemodulatorWorkerThread.h | 9 +++-- src/modules/modem/Modem.cpp | 18 +++------- src/modules/modem/Modem.h | 9 ++--- 5 files changed, 30 insertions(+), 56 deletions(-) diff --git a/src/demod/DemodDefs.h b/src/demod/DemodDefs.h index ec40035..52f1050 100644 --- a/src/demod/DemodDefs.h +++ b/src/demod/DemodDefs.h @@ -82,6 +82,7 @@ class DemodulatorThreadPostIQData: public ReferenceCounter { public: std::vector data; long long sampleRate; + std::string modemType; Modem *modem; ModemKit *modemKit; diff --git a/src/demod/DemodulatorWorkerThread.cpp b/src/demod/DemodulatorWorkerThread.cpp index e3dc0bf..0ba23f3 100644 --- a/src/demod/DemodulatorWorkerThread.cpp +++ b/src/demod/DemodulatorWorkerThread.cpp @@ -18,6 +18,7 @@ void DemodulatorWorkerThread::run() { while (!terminated) { bool filterChanged = false; + bool makeDemod = false; DemodulatorWorkerThreadCommand filterCommand; DemodulatorWorkerThreadCommand command; @@ -29,6 +30,10 @@ void DemodulatorWorkerThread::run() { filterChanged = true; filterCommand = command; break; + case DemodulatorWorkerThreadCommand::DEMOD_WORKER_THREAD_CMD_MAKE_DEMOD: + makeDemod = true; + filterCommand = command; + break; default: break; } @@ -46,44 +51,16 @@ void DemodulatorWorkerThread::run() { result.iqResampler = msresamp_crcf_create(result.iqResampleRatio, As); } + if (makeDemod) { + cModem = Modem::makeModem(filterCommand.demodType); + } + if (filterCommand.bandwidth && filterCommand.audioSampleRate) { -// result.audioResamplerRatio = (double) (filterCommand.audioSampleRate) / (double) filterCommand.bandwidth; -// result.audioResampler = msresamp_rrrf_create(result.audioResamplerRatio, As); -// result.stereoResampler = msresamp_rrrf_create(result.audioResamplerRatio, As); -// result.audioSampleRate = filterCommand.audioSampleRate; - -/* // Stereo filters / shifters - double firStereoCutoff = ((double) 16000 / (double) filterCommand.audioSampleRate); - float ft = ((double) 1000 / (double) filterCommand.audioSampleRate); // filter transition - float mu = 0.0f; // fractional timing offset - - if (firStereoCutoff < 0) { - firStereoCutoff = 0; + result.modem = cModem; + if (cModem != nullptr) { + cModemKit = cModem->buildKit(filterCommand.bandwidth, filterCommand.audioSampleRate); } - - if (firStereoCutoff > 0.5) { - firStereoCutoff = 0.5; - } - - unsigned int h_len = estimate_req_filter_len(ft, As); - float *h = new float[h_len]; - liquid_firdes_kaiser(h_len, firStereoCutoff, As, mu, h); - - result.firStereoLeft = firfilt_rrrf_create(h, h_len); - result.firStereoRight = firfilt_rrrf_create(h, h_len); - - float bw = filterCommand.bandwidth; - if (bw < 100000.0) { - bw = 100000.0; - } - // stereo pilot filter - unsigned int order = 5; // filter order - float f0 = ((double) 19000 / bw); - float fc = ((double) 19500 / bw); - float Ap = 1.0f; - As = 60.0f; - - result.iirStereoPilot = iirfilt_crcf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_BANDPASS, LIQUID_IIRDES_SOS, order, fc, f0, Ap, As); */ + result.modemKit = cModemKit; } if (filterCommand.bandwidth) { diff --git a/src/demod/DemodulatorWorkerThread.h b/src/demod/DemodulatorWorkerThread.h index 38fb77a..2a47ce4 100644 --- a/src/demod/DemodulatorWorkerThread.h +++ b/src/demod/DemodulatorWorkerThread.h @@ -41,16 +41,16 @@ public: class DemodulatorWorkerThreadCommand { public: enum DemodulatorThreadCommandEnum { - DEMOD_WORKER_THREAD_CMD_NULL, DEMOD_WORKER_THREAD_CMD_BUILD_FILTERS + DEMOD_WORKER_THREAD_CMD_NULL, DEMOD_WORKER_THREAD_CMD_BUILD_FILTERS, DEMOD_WORKER_THREAD_CMD_MAKE_DEMOD }; DemodulatorWorkerThreadCommand() : - cmd(DEMOD_WORKER_THREAD_CMD_NULL), frequency(0), sampleRate(0), bandwidth(0), audioSampleRate(0) { + cmd(DEMOD_WORKER_THREAD_CMD_NULL), frequency(0), sampleRate(0), bandwidth(0), audioSampleRate(0), demodType("") { } DemodulatorWorkerThreadCommand(DemodulatorThreadCommandEnum cmd) : - cmd(cmd), frequency(0), sampleRate(0), bandwidth(0), audioSampleRate(0) { + cmd(cmd), frequency(0), sampleRate(0), bandwidth(0), audioSampleRate(0), demodType("") { } @@ -60,6 +60,7 @@ public: long long sampleRate; unsigned int bandwidth; unsigned int audioSampleRate; + std::string demodType; }; typedef ThreadQueue DemodulatorThreadWorkerCommandQueue; @@ -87,4 +88,6 @@ protected: DemodulatorThreadWorkerCommandQueue *commandQueue; DemodulatorThreadWorkerResultQueue *resultQueue; + Modem *cModem; + ModemKit *cModemKit; }; diff --git a/src/modules/modem/Modem.cpp b/src/modules/modem/Modem.cpp index 058b10d..c72a6a4 100644 --- a/src/modules/modem/Modem.cpp +++ b/src/modules/modem/Modem.cpp @@ -10,18 +10,10 @@ ModemFactoryList Modem::getFactories() { return modemFactories; } -Modem *Modem::factory() { +Modem *Modem::makeModem(std::string modemType) { + if (modemFactories.find(modemType) != modemFactories.end()) { + return modemFactories[modemType]->factory(); + } + return nullptr; } - -ModemKit *Modem::buildKit(long long sampleRate, int audioSampleRate) { - return nullptr; -} - -void Modem::disposeKit(ModemKit *kit) { - return; -} - -void Modem::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - return; -} diff --git a/src/modules/modem/Modem.h b/src/modules/modem/Modem.h index 52587fe..e528b2d 100644 --- a/src/modules/modem/Modem.h +++ b/src/modules/modem/Modem.h @@ -36,12 +36,13 @@ class Modem { public: static void addModemFactory(std::string modemName, Modem *factorySingle); static ModemFactoryList getFactories(); + static Modem *makeModem(std::string modemType); - virtual Modem *factory(); + virtual Modem *factory() = 0; - virtual ModemKit *buildKit(long long sampleRate, int audioSampleRate); - virtual void disposeKit(ModemKit *kit); - virtual void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + virtual ModemKit *buildKit(long long sampleRate, int audioSampleRate) = 0; + virtual void disposeKit(ModemKit *kit) = 0; + virtual void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) = 0; private: static ModemFactoryList modemFactories; }; \ No newline at end of file From 8ac4498db71ecae97558238ea1d929e92056da71 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 17 Nov 2015 20:47:00 -0500 Subject: [PATCH 06/28] code cleanup --- src/demod/DemodulatorPreThread.cpp | 126 ++++++----------------------- src/demod/DemodulatorPreThread.h | 22 ++--- src/demod/DemodulatorThread.cpp | 96 +--------------------- 3 files changed, 35 insertions(+), 209 deletions(-) diff --git a/src/demod/DemodulatorPreThread.cpp b/src/demod/DemodulatorPreThread.cpp index e88cce8..ec49d83 100644 --- a/src/demod/DemodulatorPreThread.cpp +++ b/src/demod/DemodulatorPreThread.cpp @@ -24,50 +24,14 @@ DemodulatorPreThread::DemodulatorPreThread() : IOThread(), iqResampler(NULL), iq } void DemodulatorPreThread::initialize() { - initialized = false; - iqResampleRatio = (double) (params.bandwidth) / (double) params.sampleRate; -// audioResampleRatio = (double) (params.audioSampleRate) / (double) params.bandwidth; float As = 60.0f; // stop-band attenuation [dB] iqResampler = msresamp_crcf_create(iqResampleRatio, As); -// audioResampler = msresamp_rrrf_create(audioResampleRatio, As); -// stereoResampler = msresamp_rrrf_create(audioResampleRatio, As); - // Stereo filters / shifters -// double firStereoCutoff = ((double) 16000 / (double) params.audioSampleRate); -// float ft = ((double) 1000 / (double) params.audioSampleRate); // filter transition -// float mu = 0.0f; // fractional timing offset -// -// if (firStereoCutoff < 0) { -// firStereoCutoff = 0; -// } -// -// if (firStereoCutoff > 0.5) { -// firStereoCutoff = 0.5; -// } - -// unsigned int h_len = estimate_req_filter_len(ft, As); -// float *h = new float[h_len]; -// liquid_firdes_kaiser(h_len, firStereoCutoff, As, mu, h); -// -// firStereoLeft = firfilt_rrrf_create(h, h_len); -// firStereoRight = firfilt_rrrf_create(h, h_len); - - // stereo pilot filter -// float bw = params.bandwidth; -// if (bw < 100000.0) { -// bw = 100000.0; -// } -// unsigned int order = 5; // filter order -// float f0 = ((double) 19000 / bw); -// float fc = ((double) 19500 / bw); -// float Ap = 1.0f; -// As = 60.0f; -// iirStereoPilot = iirfilt_crcf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_BANDPASS, LIQUID_IIRDES_SOS, order, fc, f0, Ap, As); - - initialized = true; + initialized.store(true); + lastParams = params; } @@ -99,8 +63,6 @@ void DemodulatorPreThread::run() { std::vector in_buf_data; std::vector out_buf_data; -// liquid_float_complex carrySample; // Keep the stream count even to simplify some demod operations -// bool carrySampleFlag = false; while (!terminated) { DemodulatorThreadIQData *inp; @@ -220,37 +182,6 @@ void DemodulatorPreThread::run() { resamp->setRefCount(1); resamp->data.assign(resampledData.begin(), resampledData.begin() + numWritten); -// bool uneven = (numWritten % 2 != 0); - -// if (!carrySampleFlag && !uneven) { -// resamp->data.assign(resampledData.begin(), resampledData.begin() + numWritten); -// carrySampleFlag = false; -// } else if (!carrySampleFlag && uneven) { -// resamp->data.assign(resampledData.begin(), resampledData.begin() + (numWritten-1)); -// carrySample = resampledData.back(); -// carrySampleFlag = true; -// } else if (carrySampleFlag && uneven) { -// resamp->data.resize(numWritten+1); -// resamp->data[0] = carrySample; -// memcpy(&resamp->data[1],&resampledData[0],sizeof(liquid_float_complex)*numWritten); -// carrySampleFlag = false; -// } else if (carrySampleFlag && !uneven) { -// resamp->data.resize(numWritten); -// resamp->data[0] = carrySample; -// memcpy(&resamp->data[1],&resampledData[0],sizeof(liquid_float_complex)*(numWritten-1)); -// carrySample = resampledData.back(); -// carrySampleFlag = true; -// } - - - -// resamp->audioResampleRatio = audioResampleRatio; -// resamp->audioResampler = audioResampler; -// resamp->audioSampleRate = params.audioSampleRate; -// resamp->stereoResampler = stereoResampler; -// resamp->firStereoLeft = firStereoLeft; -// resamp->firStereoRight = firStereoRight; -// resamp->iirStereoPilot = iirStereoPilot; resamp->modem = cModem; resamp->modemKit = cModemKit; resamp->sampleRate = params.bandwidth; @@ -274,35 +205,13 @@ void DemodulatorPreThread::run() { iqResampleRatio = result.iqResampleRatio; } -// if (result.firStereoLeft) { -// firStereoLeft = result.firStereoLeft; -// } -// -// if (result.firStereoRight) { -// firStereoRight = result.firStereoRight; -// } -// -// if (result.iirStereoPilot) { -// iirStereoPilot = result.iirStereoPilot; -// } -// -// if (result.audioResampler) { -// audioResampler = result.audioResampler; -// audioResampleRatio = result.audioResamplerRatio; -// stereoResampler = result.stereoResampler; -// } -// -// if (result.audioSampleRate) { -// params.audioSampleRate = result.audioSampleRate; -// } - - if (result.modem != nullptr) { - cModem = result.modem; - } - - if (result.modemKit != nullptr) { - cModemKit = result.modemKit; - } + if (result.modem != nullptr) { + cModem = result.modem; + } + + if (result.modemKit != nullptr) { + cModemKit = result.modemKit; + } if (result.bandwidth) { params.bandwidth = result.bandwidth; @@ -327,6 +236,23 @@ void DemodulatorPreThread::run() { std::cout << "Demodulator preprocessor thread done." << std::endl; } +DemodulatorThreadParameters &DemodulatorPreThread::getParams() { + return params; +} + +void DemodulatorPreThread::setParams(DemodulatorThreadParameters ¶ms_in) { + params = params_in; +} + +void DemodulatorPreThread::setDemodType(std::string demodType) { + this->demodType = demodType; + demodTypeChanged.store(true); +} + +std::string DemodulatorPreThread::getDemodType() { + return demodType; +} + void DemodulatorPreThread::terminate() { terminated = true; DemodulatorThreadIQData *inp = new DemodulatorThreadIQData; // push dummy to nudge queue diff --git a/src/demod/DemodulatorPreThread.h b/src/demod/DemodulatorPreThread.h index 0fc7154..65d69ee 100644 --- a/src/demod/DemodulatorPreThread.h +++ b/src/demod/DemodulatorPreThread.h @@ -15,13 +15,11 @@ public: void run(); - DemodulatorThreadParameters &getParams() { - return params; - } - - void setParams(DemodulatorThreadParameters ¶ms_in) { - params = params_in; - } + DemodulatorThreadParameters &getParams(); + void setParams(DemodulatorThreadParameters ¶ms_in); + + void setDemodType(std::string demodType); + std::string getDemodType(); void initialize(); void terminate(); @@ -39,14 +37,6 @@ protected: Modem *cModem; ModemKit *cModemKit; - -// msresamp_rrrf audioResampler; -// msresamp_rrrf stereoResampler; -// double audioResampleRatio; - -// firfilt_rrrf firStereoLeft; -// firfilt_rrrf firStereoRight; -// iirfilt_crcf iirStereoPilot; DemodulatorThreadParameters params; DemodulatorThreadParameters lastParams; @@ -55,6 +45,8 @@ protected: int shiftFrequency; std::atomic_bool initialized; + std::atomic_bool demodTypeChanged; + std::string demodType; DemodulatorWorkerThread *workerThread; std::thread *t_Worker; diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index 8c9f2d5..443ebad 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -170,47 +170,7 @@ void DemodulatorThread::run() { continue; } -// if (audioResampler == NULL) { -// audioResampler = inp->audioResampler; -// stereoResampler = inp->stereoResampler; -// firStereoLeft = inp->firStereoLeft; -// firStereoRight = inp->firStereoRight; -// iirStereoPilot = inp->iirStereoPilot; -// audioSampleRate = inp->audioSampleRate; -// } else if (audioResampler != inp->audioResampler) { -// msresamp_rrrf_destroy(audioResampler); -// msresamp_rrrf_destroy(stereoResampler); -// audioResampler = inp->audioResampler; -// stereoResampler = inp->stereoResampler; -// audioSampleRate = inp->audioSampleRate; -// -// if (demodAM) { -// ampmodem_reset(demodAM); -// } -// freqdem_reset(demodFM); -// nco_crcf_reset(stereoPilot); -// } -// -// if (firStereoLeft != inp->firStereoLeft) { -// if (firStereoLeft != NULL) { -// firfilt_rrrf_destroy(firStereoLeft); -// } -// firStereoLeft = inp->firStereoLeft; -// } -// -// if (firStereoRight != inp->firStereoRight) { -// if (firStereoRight != NULL) { -// firfilt_rrrf_destroy(firStereoRight); -// } -// firStereoRight = inp->firStereoRight; -// } -// -// if (iirStereoPilot != inp->iirStereoPilot) { -// if (iirStereoPilot != NULL) { -// iirfilt_crcf_destroy(iirStereoPilot); -// } -// iirStereoPilot = inp->iirStereoPilot; -// } + if (agcData.size() != bufSize) { if (agcData.capacity() < bufSize) { @@ -618,59 +578,7 @@ void DemodulatorThread::run() { } else { msresamp_rrrf_execute(audioResampler, &demodOutputData[0], bufSize, &resampledOutputData[0], &numAudioWritten); - if (stereo && inp->sampleRate >= 100000) { - if (demodStereoData.size() != bufSize) { - if (demodStereoData.capacity() < bufSize) { - demodStereoData.reserve(bufSize); - } - demodStereoData.resize(bufSize); - } - - - float phase_error = 0; - - for (int i = 0; i < bufSize; i++) { - // real -> complex - firhilbf_r2c_execute(firStereoR2C, demodOutputData[i], &x); - - // 19khz pilot band-pass - iirfilt_crcf_execute(iirStereoPilot, x, &v); - nco_crcf_cexpf(stereoPilot, &w); - - w.imag = -w.imag; // conjf(w) - - // multiply u = v * conjf(w) - u.real = v.real * w.real - v.imag * w.imag; - u.imag = v.real * w.imag + v.imag * w.real; - - // cargf(u) - phase_error = atan2f(u.imag,u.real); - - // step pll - nco_crcf_pll_step(stereoPilot, phase_error); - nco_crcf_step(stereoPilot); - - // 38khz down-mix - nco_crcf_mix_down(stereoPilot, x, &y); - nco_crcf_mix_down(stereoPilot, y, &x); - - // complex -> real - firhilbf_c2r_execute(firStereoC2R, x, &demodStereoData[i]); - } - -// std::cout << "[PLL] phase error: " << phase_error; -// std::cout << " freq:" << (((nco_crcf_get_frequency(stereoPilot) / (2.0 * M_PI)) * inp->sampleRate)) << std::endl; - - if (audio_out_size != resampledStereoData.size()) { - if (resampledStereoData.capacity() < audio_out_size) { - resampledStereoData.reserve(audio_out_size); - } - resampledStereoData.resize(audio_out_size); - } - - msresamp_rrrf_execute(stereoResampler, &demodStereoData[0], bufSize, &resampledStereoData[0], &numAudioWritten); - } - }*/ + }*/ if (currentSignalLevel > signalLevel) { signalLevel = signalLevel + (currentSignalLevel - signalLevel) * 0.5; From 62ca78141f31f7a2a53418bf0ab410697bd6aa41 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 17 Nov 2015 21:22:51 -0500 Subject: [PATCH 07/28] Analog chain mostly complete --- src/demod/DemodulatorThread.cpp | 301 +++++--------------------------- src/demod/DemodulatorThread.h | 6 +- src/modules/modem/Modem.cpp | 8 + src/modules/modem/Modem.h | 3 + 4 files changed, 54 insertions(+), 264 deletions(-) diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index 443ebad..dbf03db 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -13,17 +13,10 @@ DemodulatorThread::DemodulatorThread() : IOThread(), iqAutoGain(NULL), amOutputCeil(1), amOutputCeilMA(1), amOutputCeilMAA(1), audioSampleRate(0), squelchLevel(0), signalLevel(0), squelchEnabled(false), iqInputQueue(NULL), audioOutputQueue(NULL), audioVisOutputQueue(NULL), threadQueueControl(NULL), threadQueueNotify(NULL) { -// stereo.store(false); muted.store(false); agcEnabled.store(false); demodulatorType = "FM"; -// demodFM = freqdem_create(0.5); -// demodAM_USB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_USB, 1); -// demodAM_LSB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_LSB, 1); -// demodAM_DSB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_DSB, 1); -// demodAM_DSB_CSP = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_DSB, 0); -// demodAM = demodAM_DSB_CSP; // advanced demodulators @@ -110,24 +103,6 @@ void DemodulatorThread::run() { pthread_setschedparam(tID, SCHED_FIFO, &prio); #endif -// msresamp_rrrf audioResampler = NULL; -// msresamp_rrrf stereoResampler = NULL; -// firfilt_rrrf firStereoLeft = NULL; -// firfilt_rrrf firStereoRight = NULL; -// iirfilt_crcf iirStereoPilot = NULL; - -// liquid_float_complex u, v, w, x, y; - -// firhilbf firStereoR2C = firhilbf_create(5, 60.0f); -// firhilbf firStereoC2R = firhilbf_create(5, 60.0f); - -// nco_crcf stereoPilot = nco_crcf_create(LIQUID_VCO); -// nco_crcf_reset(stereoPilot); -// nco_crcf_pll_set_bandwidth(stereoPilot, 0.25f); - - // half band filter used for side-band elimination -// resamp2_crcf ssbFilt = resamp2_crcf_create(12,-0.25f,60.0f); - // Automatic IQ gain iqAutoGain = agc_crcf_create(); agc_crcf_set_bandwidth(iqAutoGain, 0.1); @@ -140,24 +115,9 @@ void DemodulatorThread::run() { audioOutputQueue = (AudioThreadInputQueue*)getOutputQueue("AudioDataOutput"); threadQueueControl = (DemodulatorThreadControlCommandQueue *)getInputQueue("ControlQueue"); threadQueueNotify = (DemodulatorThreadCommandQueue*)getOutputQueue("NotifyQueue"); + + ModemIQData modemData; -// switch (demodulatorType.load()) { -// case DEMOD_TYPE_FM: -// break; -// case DEMOD_TYPE_LSB: -// demodAM = demodAM_LSB; -// break; -// case DEMOD_TYPE_USB: -// demodAM = demodAM_USB; -// break; -// case DEMOD_TYPE_DSB: -// demodAM = demodAM_DSB; -// break; -// case DEMOD_TYPE_AM: -// demodAM = demodAM_DSB_CSP; -// break; -// } - while (!terminated) { DemodulatorThreadPostIQData *inp; iqInputQueue->pop(inp); @@ -171,7 +131,21 @@ void DemodulatorThread::run() { } - + if (inp->modemKit && inp->modemKit != cModemKit) { + cModem->disposeKit(cModemKit); + cModemKit = inp->modemKit; + } + + if (inp->modem && inp->modem != cModem) { + delete cModem; + cModem = inp->modem; + } + + if (!cModem || !cModemKit) { + inp->decRefCount(); + continue; + } + if (agcData.size() != bufSize) { if (agcData.capacity() < bufSize) { agcData.reserve(bufSize); @@ -181,25 +155,6 @@ void DemodulatorThread::run() { agcAMData.resize(bufSize); } -// double audio_resample_ratio = inp->audioResampleRatio; - -// if (demodOutputData.size() != bufSize) { -// if (demodOutputData.capacity() < bufSize) { -// demodOutputData.reserve(bufSize); -// } -// demodOutputData.resize(bufSize); -// } - -/* - if (demodOutputDataDigital.size() != bufSize) { - if (demodOutputDataDigital.capacity() < bufSize) { - demodOutputDataDigital.reserve(bufSize); - } - demodOutputDataDigital.resize(bufSize); - } -*/ -// int audio_out_size = ceil((double) (bufSize) * audio_resample_ratio) + 512; - agc_crcf_execute_block(iqAutoGain, &(inp->data[0]), bufSize, &agcData[0]); float currentSignalLevel = 0; @@ -217,38 +172,24 @@ void DemodulatorThread::run() { } else { inputData = &inp->data; } + + modemData.sampleRate = inp->sampleRate; + modemData.data.assign(inputData->begin(), inputData->end()); + + AudioThreadInput *ati = NULL; + ati = outputBuffers.getBuffer(); + + ati->sampleRate = audioSampleRate; + ati->inputRate = inp->sampleRate; + ati->setRefCount(1); + cModem->demodulate(cModemKit, &modemData, ati); + // Reset demodulator Constellations & Lock // updateDemodulatorCons(0); /* - if (demodulatorType == DEMOD_TYPE_FM) { - currentDemodLock = false; - freqdem_demodulate_block(demodFM, &(*inputData)[0], bufSize, &demodOutputData[0]); - } else if (demodulatorType == DEMOD_TYPE_RAW) { - // do nothing here.. - } else { + { switch (demodulatorType.load()) { - case DEMOD_TYPE_LSB: - currentDemodLock = false; - for (int i = 0; i < bufSize; i++) { // Reject upper band - resamp2_crcf_filter_execute(ssbFilt,(*inputData)[i],&x,&y); - ampmodem_demodulate(demodAM, x, &demodOutputData[i]); - } - break; - case DEMOD_TYPE_USB: - currentDemodLock = false; - for (int i = 0; i < bufSize; i++) { // Reject lower band - resamp2_crcf_filter_execute(ssbFilt,(*inputData)[i],&x,&y); - ampmodem_demodulate(demodAM, y, &demodOutputData[i]); - } - break; - case DEMOD_TYPE_AM: - case DEMOD_TYPE_DSB: - currentDemodLock = false; - for (int i = 0; i < bufSize; i++) { - ampmodem_demodulate(demodAM, (*inputData)[i], &demodOutputData[i]); - } - break; // advanced demodulators case DEMOD_TYPE_ASK: @@ -545,39 +486,8 @@ void DemodulatorThread::run() { updateDemodulatorLock(demodQPSK, 0.8f); break; } - - amOutputCeilMA = amOutputCeilMA + (amOutputCeil - amOutputCeilMA) * 0.025; - amOutputCeilMAA = amOutputCeilMAA + (amOutputCeilMA - amOutputCeilMAA) * 0.025; - - amOutputCeil = 0; - - for (int i = 0; i < bufSize; i++) { - if (demodOutputData[i] > amOutputCeil) { - amOutputCeil = demodOutputData[i]; - } - } - - float gain = 0.5 / amOutputCeilMAA; - - for (int i = 0; i < bufSize; i++) { - demodOutputData[i] *= gain; - } } - if (audio_out_size != resampledOutputData.size()) { - if (resampledOutputData.capacity() < audio_out_size) { - resampledOutputData.reserve(audio_out_size); - } - resampledOutputData.resize(audio_out_size); - } - - unsigned int numAudioWritten; - - if (demodulatorType == DEMOD_TYPE_RAW) { - numAudioWritten = bufSize; - } else { - msresamp_rrrf_execute(audioResampler, &demodOutputData[0], bufSize, &resampledOutputData[0], &numAudioWritten); - }*/ if (currentSignalLevel > signalLevel) { @@ -586,51 +496,9 @@ void DemodulatorThread::run() { signalLevel = signalLevel + (currentSignalLevel - signalLevel) * 0.05; } - AudioThreadInput *ati = NULL; if (audioOutputQueue != NULL) { - if (!squelchEnabled || (signalLevel >= squelchLevel)) { - ati = outputBuffers.getBuffer(); - - ati->sampleRate = audioSampleRate; - ati->inputRate = inp->sampleRate; - ati->setRefCount(1); - - /* - - if (demodulatorType == DEMOD_TYPE_RAW) { - ati->channels = 2; - if (ati->data.capacity() < (numAudioWritten * 2)) { - ati->data.reserve(numAudioWritten * 2); - } - ati->data.resize(numAudioWritten * 2); - for (int i = 0; i < numAudioWritten; i++) { - ati->data[i * 2] = (*inputData)[i].imag; - ati->data[i * 2 + 1] = (*inputData)[i].real; - } - } else if (stereo && inp->sampleRate >= 100000) { - ati->channels = 2; - if (ati->data.capacity() < (numAudioWritten * 2)) { - ati->data.reserve(numAudioWritten * 2); - } - ati->data.resize(numAudioWritten * 2); - for (int i = 0; i < numAudioWritten; i++) { - float l, r; - - firfilt_rrrf_push(firStereoLeft, 0.568 * (resampledOutputData[i] - (resampledStereoData[i]))); - firfilt_rrrf_execute(firStereoLeft, &l); - - firfilt_rrrf_push(firStereoRight, 0.568 * (resampledOutputData[i] + (resampledStereoData[i]))); - firfilt_rrrf_execute(firStereoRight, &r); - - ati->data[i * 2] = l; - ati->data[i * 2 + 1] = r; - } - } else { - ati->channels = 1; - ati->data.assign(resampledOutputData.begin(), resampledOutputData.begin() + numAudioWritten); - } -*/ + if (ati && (!squelchEnabled || (signalLevel >= squelchLevel))) { std::vector::iterator data_i; ati->peak = 0; for (data_i = ati->data.begin(); data_i != ati->data.end(); data_i++) { @@ -639,9 +507,13 @@ void DemodulatorThread::run() { ati->peak = p; } } + } else if (ati) { + ati->decRefCount(); } + } else if (ati) { + ati->decRefCount(); } -/* + if (ati && audioVisOutputQueue != NULL && audioVisOutputQueue->empty()) { AudioThreadInput *ati_vis = audioVisBuffers.getBuffer(); ati_vis->setRefCount(1); @@ -649,7 +521,7 @@ void DemodulatorThread::run() { ati_vis->inputRate = inp->sampleRate; int num_vis = DEMOD_VIS_SIZE; - if (demodulatorType == DEMOD_TYPE_RAW || (stereo && inp->sampleRate >= 100000)) { + if (ati->channels==2) { ati_vis->channels = 2; int stereoSize = ati->data.size(); if (stereoSize > DEMOD_VIS_SIZE * 2) { @@ -658,7 +530,7 @@ void DemodulatorThread::run() { ati_vis->data.resize(stereoSize); - if (demodulatorType == DEMOD_TYPE_RAW) { + if (demodulatorType == "I/Q") { for (int i = 0; i < stereoSize / 2; i++) { ati_vis->data[i] = agcData[i].real * 0.75; ati_vis->data[i + stereoSize / 2] = agcData[i].imag * 0.75; @@ -679,12 +551,12 @@ void DemodulatorThread::run() { if (num_vis > numAudioWritten) { num_vis = numAudioWritten; } - ati_vis->data.assign(resampledOutputData.begin(), resampledOutputData.begin() + num_vis); + ati_vis->data.assign(ati->data.begin(), ati->data.begin() + num_vis); } else { if (num_vis > bufSize) { num_vis = bufSize; } - ati_vis->data.assign(demodOutputData.begin(), demodOutputData.begin() + num_vis); + ati_vis->data.assign(ati->data.begin(), ati->data.begin() + num_vis); } // std::cout << "Signal: " << agc_crcf_get_signal_level(agc) << " -- " << agc_crcf_get_rssi(agc) << "dB " << std::endl; @@ -692,7 +564,7 @@ void DemodulatorThread::run() { audioVisOutputQueue->push(ati_vis); } -*/ + if (ati != NULL) { if (!muted.load()) { @@ -723,64 +595,6 @@ void DemodulatorThread::run() { break; } } -/* - if (newDemodType != DEMOD_TYPE_NULL) { - switch (newDemodType) { - case DEMOD_TYPE_FM: - freqdem_reset(demodFM); - break; - case DEMOD_TYPE_LSB: - demodAM = demodAM_LSB; - ampmodem_reset(demodAM); - break; - case DEMOD_TYPE_USB: - demodAM = demodAM_USB; - ampmodem_reset(demodAM); - break; - case DEMOD_TYPE_DSB: - demodAM = demodAM_DSB; - ampmodem_reset(demodAM); - break; - case DEMOD_TYPE_AM: - demodAM = demodAM_DSB_CSP; - ampmodem_reset(demodAM); - break; - case DEMOD_TYPE_ASK: - //modem_reset(demodASK); - break; - case DEMOD_TYPE_APSK: - //modem_reset(demodAPSK); - break; - case DEMOD_TYPE_BPSK: - //modem_reset(demodBPSK); - break; - case DEMOD_TYPE_DPSK: - //modem_reset(demodDPSK); - break; - case DEMOD_TYPE_PSK: - //modem_reset(demodPSK); - break; - case DEMOD_TYPE_OOK: - //modem_reset(demodOOK); - break; - case DEMOD_TYPE_SQAM: - //modem_reset(demodSQAM); - break; - case DEMOD_TYPE_ST: - //modem_reset(demodST); - break; - case DEMOD_TYPE_QAM: - //modem_reset(demodQAM); - break; - case DEMOD_TYPE_QPSK: - //modem_reset(demodQPSK); - break; - default: - // empty default to prevent exceptions - break; - } - demodulatorType = newDemodType; - }*/ } // demodOutputDataDigital.empty(); @@ -788,29 +602,7 @@ void DemodulatorThread::run() { inp->decRefCount(); } // end while !terminated -/* - if (audioResampler != NULL) { - msresamp_rrrf_destroy(audioResampler); - } - if (stereoResampler != NULL) { - msresamp_rrrf_destroy(stereoResampler); - } - if (firStereoLeft != NULL) { - firfilt_rrrf_destroy(firStereoLeft); - } - if (firStereoRight != NULL) { - firfilt_rrrf_destroy(firStereoRight); - } - if (iirStereoPilot != NULL) { - iirfilt_crcf_destroy(iirStereoPilot); - } - - agc_crcf_destroy(iqAutoGain); - firhilbf_destroy(firStereoR2C); - firhilbf_destroy(firStereoC2R); - nco_crcf_destroy(stereoPilot); - resamp2_crcf_destroy(ssbFilt); -*/ + outputBuffers.purge(); if (audioVisOutputQueue && !audioVisOutputQueue->empty()) { @@ -832,15 +624,6 @@ void DemodulatorThread::terminate() { iqInputQueue->push(inp); } -//void DemodulatorThread::setStereo(bool state) { -// stereo.store(state); -// std::cout << "Stereo " << (state ? "Enabled" : "Disabled") << std::endl; -//} - -//bool DemodulatorThread::isStereo() { -// return stereo.load(); -//} - bool DemodulatorThread::isMuted() { return muted.load(); } diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index 4d90c0c..7166fed 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -21,10 +21,7 @@ public: void run(); void terminate(); - -// void setStereo(bool state); -// bool isStereo(); - + void setAGC(bool state); bool getAGC(); @@ -138,7 +135,6 @@ protected: float amOutputCeilMA; float amOutputCeilMAA; -// std::atomic_bool stereo; std::atomic_bool muted; std::atomic_bool agcEnabled; std::string demodulatorType; diff --git a/src/modules/modem/Modem.cpp b/src/modules/modem/Modem.cpp index c72a6a4..f9acec2 100644 --- a/src/modules/modem/Modem.cpp +++ b/src/modules/modem/Modem.cpp @@ -17,3 +17,11 @@ Modem *Modem::makeModem(std::string modemType) { return nullptr; } + +Modem::Modem() { + +} + +Modem::~Modem() { + +} diff --git a/src/modules/modem/Modem.h b/src/modules/modem/Modem.h index e528b2d..be905ba 100644 --- a/src/modules/modem/Modem.h +++ b/src/modules/modem/Modem.h @@ -40,6 +40,9 @@ public: virtual Modem *factory() = 0; + Modem(); + virtual ~Modem(); + virtual ModemKit *buildKit(long long sampleRate, int audioSampleRate) = 0; virtual void disposeKit(ModemKit *kit) = 0; virtual void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) = 0; From f53e2288497048904754f4d7555d3d68bd102696 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 17 Nov 2015 21:49:02 -0500 Subject: [PATCH 08/28] Cleanup / finalize demod before initial testing --- src/demod/DemodulatorInstance.cpp | 5 ++--- src/demod/DemodulatorPreThread.cpp | 15 +++++++++++++-- src/demod/DemodulatorPreThread.h | 1 + src/demod/DemodulatorThread.cpp | 11 +---------- src/demod/DemodulatorThread.h | 4 ---- src/demod/DemodulatorWorkerThread.cpp | 3 +++ src/demod/DemodulatorWorkerThread.h | 4 +++- 7 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index 1405ef4..8dffd44 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -44,7 +44,7 @@ DemodulatorInstance::DemodulatorInstance() : audioThread->setInputQueue("AudioDataInput", pipeAudioData); audioThread->setOutputQueue("NotifyQueue", pipeDemodNotify); - currentDemodType = demodulatorThread->getDemodulatorType(); + currentDemodType = demodulatorPreThread->getParams().demodType; currentDemodCons = demodulatorThread->getDemodulatorCons(); } @@ -74,7 +74,7 @@ void DemodulatorInstance::run() { // } currentFrequency = demodulatorPreThread->getParams().frequency; - currentDemodType = demodulatorThread->getDemodulatorType(); + currentDemodType = demodulatorPreThread->getParams().demodType; currentDemodCons = demodulatorThread->getDemodulatorCons(); currentAudioSampleRate = AudioThread::deviceSampleRate[getOutputDevice()]; demodulatorPreThread->getParams().audioSampleRate = currentAudioSampleRate; @@ -290,7 +290,6 @@ void DemodulatorInstance::setDemodulatorType(std::string demod_type_in) { if (!active) { checkBandwidth(); demodulatorPreThread->getParams().demodType = currentDemodType; - demodulatorThread->setDemodulatorType(currentDemodType); } else if (demodulatorThread && threadQueueControl) { DemodulatorThreadControlCommand command; command.cmd = DemodulatorThreadControlCommand::DEMOD_THREAD_CMD_CTL_TYPE; diff --git a/src/demod/DemodulatorPreThread.cpp b/src/demod/DemodulatorPreThread.cpp index ec49d83..21cc402 100644 --- a/src/demod/DemodulatorPreThread.cpp +++ b/src/demod/DemodulatorPreThread.cpp @@ -182,6 +182,7 @@ void DemodulatorPreThread::run() { resamp->setRefCount(1); resamp->data.assign(resampledData.begin(), resampledData.begin() + numWritten); + resamp->modemType = demodType; resamp->modem = cModem; resamp->modemKit = cModemKit; resamp->sampleRate = params.bandwidth; @@ -220,6 +221,11 @@ void DemodulatorPreThread::run() { if (result.sampleRate) { params.sampleRate = result.sampleRate; } + + if (result.modemType != "") { + demodType = result.modemType; + demodTypeChanged.store(false); + } break; default: break; @@ -245,11 +251,16 @@ void DemodulatorPreThread::setParams(DemodulatorThreadParameters ¶ms_in) { } void DemodulatorPreThread::setDemodType(std::string demodType) { - this->demodType = demodType; - demodTypeChanged.store(true); + this->newDemodType = demodType; + DemodulatorWorkerThreadCommand command(DemodulatorWorkerThreadCommand::DEMOD_WORKER_THREAD_CMD_MAKE_DEMOD); + command.demodType = demodType; + workerQueue->push(command); } std::string DemodulatorPreThread::getDemodType() { + if (newDemodType != demodType) { + return newDemodType; + } return demodType; } diff --git a/src/demod/DemodulatorPreThread.h b/src/demod/DemodulatorPreThread.h index 65d69ee..28110dc 100644 --- a/src/demod/DemodulatorPreThread.h +++ b/src/demod/DemodulatorPreThread.h @@ -47,6 +47,7 @@ protected: std::atomic_bool initialized; std::atomic_bool demodTypeChanged; std::string demodType; + std::string newDemodType; DemodulatorWorkerThread *workerThread; std::thread *t_Worker; diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index dbf03db..000c52f 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -15,7 +15,6 @@ DemodulatorThread::DemodulatorThread() : IOThread(), iqAutoGain(NULL), amOutputC muted.store(false); agcEnabled.store(false); - demodulatorType = "FM"; // advanced demodulators @@ -530,7 +529,7 @@ void DemodulatorThread::run() { ati_vis->data.resize(stereoSize); - if (demodulatorType == "I/Q") { + if (inp->modemType == "I/Q") { for (int i = 0; i < stereoSize / 2; i++) { ati_vis->data[i] = agcData[i].real * 0.75; ati_vis->data[i + stereoSize / 2] = agcData[i].imag * 0.75; @@ -656,14 +655,6 @@ float DemodulatorThread::getSquelchLevel() { return squelchLevel; } -void DemodulatorThread::setDemodulatorType(std::string demod_type_in) { - demodulatorType = demod_type_in; -} - -std::string DemodulatorThread::getDemodulatorType() { - return demodulatorType; -} - void DemodulatorThread::setDemodulatorLock(bool demod_lock_in) { demod_lock_in ? currentDemodLock = true : currentDemodLock = false; } diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index 7166fed..6a0a526 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -31,9 +31,6 @@ public: float getSignalLevel(); void setSquelchLevel(float signal_level_in); float getSquelchLevel(); - - void setDemodulatorType(std::string demod_type_in); - std::string getDemodulatorType(); void setDemodulatorLock(bool demod_lock_in); int getDemodulatorLock(); @@ -137,7 +134,6 @@ protected: std::atomic_bool muted; std::atomic_bool agcEnabled; - std::string demodulatorType; std::atomic_int demodulatorCons; int audioSampleRate; diff --git a/src/demod/DemodulatorWorkerThread.cpp b/src/demod/DemodulatorWorkerThread.cpp index 0ba23f3..edbc6c3 100644 --- a/src/demod/DemodulatorWorkerThread.cpp +++ b/src/demod/DemodulatorWorkerThread.cpp @@ -53,6 +53,7 @@ void DemodulatorWorkerThread::run() { if (makeDemod) { cModem = Modem::makeModem(filterCommand.demodType); + cModemType = filterCommand.demodType; } if (filterCommand.bandwidth && filterCommand.audioSampleRate) { @@ -71,6 +72,8 @@ void DemodulatorWorkerThread::run() { result.sampleRate = filterCommand.sampleRate; } + result.modemType = cModemType; + resultQueue->push(result); } diff --git a/src/demod/DemodulatorWorkerThread.h b/src/demod/DemodulatorWorkerThread.h index 2a47ce4..5455a5f 100644 --- a/src/demod/DemodulatorWorkerThread.h +++ b/src/demod/DemodulatorWorkerThread.h @@ -16,7 +16,7 @@ public: }; DemodulatorWorkerThreadResult() : - cmd(DEMOD_WORKER_THREAD_RESULT_NULL), iqResampler(nullptr), iqResampleRatio(0), sampleRate(0), bandwidth(0), modemKit(nullptr) { + cmd(DEMOD_WORKER_THREAD_RESULT_NULL), iqResampler(nullptr), iqResampleRatio(0), sampleRate(0), bandwidth(0), modemKit(nullptr), modemType("") { } @@ -36,6 +36,7 @@ public: unsigned int bandwidth; Modem *modem; ModemKit *modemKit; + std::string modemType; }; class DemodulatorWorkerThreadCommand { @@ -90,4 +91,5 @@ protected: DemodulatorThreadWorkerResultQueue *resultQueue; Modem *cModem; ModemKit *cModemKit; + std::string cModemType; }; From 5f6b492478d5a81a7fcbc74119b97f6c1e46bad7 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 17 Nov 2015 23:23:23 -0500 Subject: [PATCH 09/28] Analog modems now somewhat functional - Still major memory leaks.. :) --- src/demod/DemodulatorInstance.cpp | 8 ++---- src/demod/DemodulatorPreThread.cpp | 9 ++++++- src/demod/DemodulatorThread.cpp | 36 +++++++++++++-------------- src/demod/DemodulatorThread.h | 4 ++- src/demod/DemodulatorWorkerThread.cpp | 10 ++++---- src/modules/modem/ModemAnalog.cpp | 1 + 6 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index 8dffd44..3d90fa9 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -34,7 +34,7 @@ DemodulatorInstance::DemodulatorInstance() : pipeAudioData = new AudioThreadInputQueue; threadQueueControl = new DemodulatorThreadControlCommandQueue; - demodulatorThread = new DemodulatorThread(); + demodulatorThread = new DemodulatorThread(this); demodulatorThread->setInputQueue("IQDataInput",pipeIQDemodData); demodulatorThread->setInputQueue("ControlQueue",threadQueueControl); demodulatorThread->setOutputQueue("NotifyQueue",pipeDemodNotify); @@ -291,11 +291,7 @@ void DemodulatorInstance::setDemodulatorType(std::string demod_type_in) { checkBandwidth(); demodulatorPreThread->getParams().demodType = currentDemodType; } else if (demodulatorThread && threadQueueControl) { - DemodulatorThreadControlCommand command; - command.cmd = DemodulatorThreadControlCommand::DEMOD_THREAD_CMD_CTL_TYPE; - command.demodType = demod_type_in; - checkBandwidth(); - threadQueueControl->push(command); + demodulatorPreThread->setDemodType(currentDemodType); } } diff --git a/src/demod/DemodulatorPreThread.cpp b/src/demod/DemodulatorPreThread.cpp index 21cc402..acd18c9 100644 --- a/src/demod/DemodulatorPreThread.cpp +++ b/src/demod/DemodulatorPreThread.cpp @@ -64,6 +64,8 @@ void DemodulatorPreThread::run() { std::vector in_buf_data; std::vector out_buf_data; + setDemodType(params.demodType); + while (!terminated) { DemodulatorThreadIQData *inp; iqInputQueue->pop(inp); @@ -199,9 +201,11 @@ void DemodulatorPreThread::run() { switch (result.cmd) { case DemodulatorWorkerThreadResult::DEMOD_WORKER_THREAD_RESULT_FILTERS: - msresamp_crcf_destroy(iqResampler); if (result.iqResampler) { + if (iqResampler) { + msresamp_crcf_destroy(iqResampler); + } iqResampler = result.iqResampler; iqResampleRatio = result.iqResampleRatio; } @@ -224,6 +228,7 @@ void DemodulatorPreThread::run() { if (result.modemType != "") { demodType = result.modemType; + params.demodType = result.modemType; demodTypeChanged.store(false); } break; @@ -254,6 +259,8 @@ void DemodulatorPreThread::setDemodType(std::string demodType) { this->newDemodType = demodType; DemodulatorWorkerThreadCommand command(DemodulatorWorkerThreadCommand::DEMOD_WORKER_THREAD_CMD_MAKE_DEMOD); command.demodType = demodType; + command.bandwidth = params.bandwidth; + command.audioSampleRate = params.audioSampleRate; workerQueue->push(command); } diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index 000c52f..df7e89f 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -1,5 +1,6 @@ #include "CubicSDRDefs.h" #include "DemodulatorThread.h" +#include "DemodulatorInstance.h" #include #include @@ -11,8 +12,9 @@ #include #endif -DemodulatorThread::DemodulatorThread() : IOThread(), iqAutoGain(NULL), amOutputCeil(1), amOutputCeilMA(1), amOutputCeilMAA(1), audioSampleRate(0), squelchLevel(0), signalLevel(0), squelchEnabled(false), iqInputQueue(NULL), audioOutputQueue(NULL), audioVisOutputQueue(NULL), threadQueueControl(NULL), threadQueueNotify(NULL) { +DemodulatorThread::DemodulatorThread(DemodulatorInstance *parent) : IOThread(), iqAutoGain(NULL), amOutputCeil(1), amOutputCeilMA(1), amOutputCeilMAA(1), audioSampleRate(0), squelchLevel(0), signalLevel(0), squelchEnabled(false), iqInputQueue(NULL), audioOutputQueue(NULL), audioVisOutputQueue(NULL), threadQueueControl(NULL), threadQueueNotify(NULL), cModem(nullptr), cModemKit(nullptr) { + demodInstance = parent; muted.store(false); agcEnabled.store(false); @@ -122,6 +124,8 @@ void DemodulatorThread::run() { iqInputQueue->pop(inp); // std::lock_guard < std::mutex > lock(inp->m_mutex); + audioSampleRate = demodInstance->getAudioSampleRate(); + int bufSize = inp->data.size(); if (!bufSize) { @@ -131,7 +135,9 @@ void DemodulatorThread::run() { if (inp->modemKit && inp->modemKit != cModemKit) { - cModem->disposeKit(cModemKit); + if (cModemKit != nullptr) { + cModem->disposeKit(cModemKit); + } cModemKit = inp->modemKit; } @@ -174,6 +180,9 @@ void DemodulatorThread::run() { modemData.sampleRate = inp->sampleRate; modemData.data.assign(inputData->begin(), inputData->end()); + modemData.setRefCount(1); + + AudioThreadInput *ati = NULL; ati = outputBuffers.getBuffer(); @@ -506,11 +515,7 @@ void DemodulatorThread::run() { ati->peak = p; } } - } else if (ati) { - ati->decRefCount(); } - } else if (ati) { - ati->decRefCount(); } if (ati && audioVisOutputQueue != NULL && audioVisOutputQueue->empty()) { @@ -545,18 +550,18 @@ void DemodulatorThread::run() { } else { int numAudioWritten = ati->data.size(); ati_vis->channels = 1; - if (numAudioWritten > bufSize) { +// if (numAudioWritten > bufSize) { ati_vis->inputRate = audioSampleRate; if (num_vis > numAudioWritten) { num_vis = numAudioWritten; } ati_vis->data.assign(ati->data.begin(), ati->data.begin() + num_vis); - } else { - if (num_vis > bufSize) { - num_vis = bufSize; - } - ati_vis->data.assign(ati->data.begin(), ati->data.begin() + num_vis); - } +// } else { +// if (num_vis > bufSize) { +// num_vis = bufSize; +// } +// ati_vis->data.assign(ati->data.begin(), ati->data.begin() + num_vis); +// } // std::cout << "Signal: " << agc_crcf_get_signal_level(agc) << " -- " << agc_crcf_get_rssi(agc) << "dB " << std::endl; } @@ -574,8 +579,6 @@ void DemodulatorThread::run() { } if (!threadQueueControl->empty()) { -// int newDemodType = DEMOD_TYPE_NULL; - while (!threadQueueControl->empty()) { DemodulatorThreadControlCommand command; threadQueueControl->pop(command); @@ -587,9 +590,6 @@ void DemodulatorThread::run() { case DemodulatorThreadControlCommand::DEMOD_THREAD_CMD_CTL_SQUELCH_OFF: squelchEnabled = false; break; -// case DemodulatorThreadControlCommand::DEMOD_THREAD_CMD_CTL_TYPE: -// newDemodType = command.demodType; -// break; default: break; } diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index 6a0a526..cc08ac7 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -10,11 +10,12 @@ typedef ThreadQueue DemodulatorThreadOutputQueue; #define DEMOD_VIS_SIZE 2048 +class DemodulatorInstance; class DemodulatorThread : public IOThread { public: - DemodulatorThread(); + DemodulatorThread(DemodulatorInstance *parent); ~DemodulatorThread(); void onBindOutput(std::string name, ThreadQueueBase *threadQueue); @@ -45,6 +46,7 @@ public: //#endif protected: + DemodulatorInstance *demodInstance; ReBuffer outputBuffers; std::vector agcData; diff --git a/src/demod/DemodulatorWorkerThread.cpp b/src/demod/DemodulatorWorkerThread.cpp index edbc6c3..5eb7e93 100644 --- a/src/demod/DemodulatorWorkerThread.cpp +++ b/src/demod/DemodulatorWorkerThread.cpp @@ -3,7 +3,7 @@ #include DemodulatorWorkerThread::DemodulatorWorkerThread() : IOThread(), - commandQueue(NULL), resultQueue(NULL) { + commandQueue(NULL), resultQueue(NULL), cModem(nullptr), cModemKit(nullptr) { } DemodulatorWorkerThread::~DemodulatorWorkerThread() { @@ -41,7 +41,7 @@ void DemodulatorWorkerThread::run() { } - if (filterChanged && !terminated) { + if ((makeDemod || filterChanged) && !terminated) { DemodulatorWorkerThreadResult result(DemodulatorWorkerThreadResult::DEMOD_WORKER_THREAD_RESULT_FILTERS); float As = 60.0f; // stop-band attenuation [dB] @@ -55,14 +55,14 @@ void DemodulatorWorkerThread::run() { cModem = Modem::makeModem(filterCommand.demodType); cModemType = filterCommand.demodType; } - + result.modem = cModem; + if (filterCommand.bandwidth && filterCommand.audioSampleRate) { - result.modem = cModem; if (cModem != nullptr) { cModemKit = cModem->buildKit(filterCommand.bandwidth, filterCommand.audioSampleRate); } - result.modemKit = cModemKit; } + result.modemKit = cModemKit; if (filterCommand.bandwidth) { result.bandwidth = filterCommand.bandwidth; diff --git a/src/modules/modem/ModemAnalog.cpp b/src/modules/modem/ModemAnalog.cpp index 183a700..d50994d 100644 --- a/src/modules/modem/ModemAnalog.cpp +++ b/src/modules/modem/ModemAnalog.cpp @@ -74,5 +74,6 @@ void ModemAnalog::buildAudioOutput(ModemKitAnalog *akit, AudioThreadInput *audio msresamp_rrrf_execute(akit->audioResampler, &demodOutputData[0], demodOutputData.size(), &resampledOutputData[0], &numAudioWritten); audioOut->channels = 1; + audioOut->sampleRate = akit->audioSampleRate; audioOut->data.assign(resampledOutputData.begin(), resampledOutputData.begin() + numAudioWritten); } From bb62fd19992dba87b341e181bddff4385bdfa85f Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 18 Nov 2015 00:23:04 -0500 Subject: [PATCH 10/28] Fix/add FMS as temporary FM-Stereo mode --- src/AppFrame.cpp | 11 ++++++----- src/CubicSDR.cpp | 2 +- src/modules/modem/analog/ModemFMStereo.cpp | 2 ++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 5bddf93..10f4592 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -68,11 +68,12 @@ AppFrame::AppFrame() : demodModeSelector = new ModeSelectorCanvas(demodPanel, attribList); demodModeSelector->addChoice(0, "FM"); - demodModeSelector->addChoice(1, "AM"); - demodModeSelector->addChoice(2, "LSB"); - demodModeSelector->addChoice(3, "USB"); - demodModeSelector->addChoice(4, "DSB"); - demodModeSelector->addChoice(5, "I/Q"); + demodModeSelector->addChoice(1, "FMS"); + demodModeSelector->addChoice(2, "AM"); + demodModeSelector->addChoice(3, "LSB"); + demodModeSelector->addChoice(4, "USB"); + demodModeSelector->addChoice(5, "DSB"); + demodModeSelector->addChoice(6, "I/Q"); demodModeSelector->setSelection("FM"); demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation, Amplitude Modulation and Lower, Upper or Double Side-Band."); demodTray->Add(demodModeSelector, 2, wxEXPAND | wxALL, 0); diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 4440072..0bf2432 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -165,7 +165,7 @@ bool CubicSDR::OnInit() { wxApp::SetAppName("CubicSDR"); Modem::addModemFactory("FM", new ModemFM); - Modem::addModemFactory("WBFM", new ModemFMStereo); + Modem::addModemFactory("FMS", new ModemFMStereo); Modem::addModemFactory("AM", new ModemAM); Modem::addModemFactory("LSB", new ModemLSB); Modem::addModemFactory("USB", new ModemUSB); diff --git a/src/modules/modem/analog/ModemFMStereo.cpp b/src/modules/modem/analog/ModemFMStereo.cpp index f6f7c18..e020fa0 100644 --- a/src/modules/modem/analog/ModemFMStereo.cpp +++ b/src/modules/modem/analog/ModemFMStereo.cpp @@ -1,6 +1,8 @@ #include "ModemFMStereo.h" ModemFMStereo::ModemFMStereo() { + demodFM = freqdem_create(0.5); + firStereoR2C = firhilbf_create(5, 60.0f); firStereoC2R = firhilbf_create(5, 60.0f); From ea005014ae3cae20c687288871f6a7b865902df8 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 18 Nov 2015 21:09:51 -0500 Subject: [PATCH 11/28] Refactor digital code, prepare for implementation --- CMakeLists.txt | 2 + src/demod/DemodulatorThread.cpp | 406 +----------------------- src/demod/DemodulatorThread.h | 94 +----- src/modules/modem/ModemAnalog.cpp | 2 +- src/modules/modem/ModemDigital.cpp | 70 ++++ src/modules/modem/ModemDigital.h | 38 +++ src/modules/modem/digital/ModemAPSK.cpp | 77 ++++- src/modules/modem/digital/ModemAPSK.h | 19 +- src/modules/modem/digital/ModemASK.cpp | 77 +++++ src/modules/modem/digital/ModemASK.h | 20 +- src/modules/modem/digital/ModemBPSK.cpp | 24 ++ src/modules/modem/digital/ModemBPSK.h | 13 +- src/modules/modem/digital/ModemDPSK.cpp | 78 +++++ src/modules/modem/digital/ModemDPSK.h | 21 +- src/modules/modem/digital/ModemOOK.cpp | 24 ++ src/modules/modem/digital/ModemOOK.h | 13 +- src/modules/modem/digital/ModemPSK.cpp | 79 +++++ src/modules/modem/digital/ModemPSK.h | 21 +- src/modules/modem/digital/ModemQAM.cpp | 76 +++++ src/modules/modem/digital/ModemQAM.h | 21 +- src/modules/modem/digital/ModemQPSK.cpp | 24 ++ src/modules/modem/digital/ModemQPSK.h | 12 +- src/modules/modem/digital/ModemSQAM.cpp | 66 ++++ src/modules/modem/digital/ModemSQAM.h | 14 +- src/modules/modem/digital/ModemST.cpp | 25 ++ src/modules/modem/digital/ModemST.h | 14 +- 26 files changed, 820 insertions(+), 510 deletions(-) create mode 100644 src/modules/modem/ModemDigital.cpp create mode 100644 src/modules/modem/ModemDigital.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0178a2a..45b62ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -236,6 +236,7 @@ SET (cubicsdr_sources src/demod/DemodulatorMgr.cpp src/modules/modem/Modem.cpp src/modules/modem/ModemAnalog.cpp + src/modules/modem/ModemDigital.cpp src/modules/modem/digital/ModemASK.cpp src/modules/modem/digital/ModemAPSK.cpp src/modules/modem/digital/ModemBPSK.cpp @@ -314,6 +315,7 @@ SET (cubicsdr_headers src/demod/DemodDefs.h src/modules/modem/Modem.h src/modules/modem/ModemAnalog.h + src/modules/modem/ModemDigital.h src/modules/modem/digital/ModemASK.h src/modules/modem/digital/ModemAPSK.h src/modules/modem/digital/ModemBPSK.h diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index df7e89f..7a654b4 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -12,80 +12,12 @@ #include #endif -DemodulatorThread::DemodulatorThread(DemodulatorInstance *parent) : IOThread(), iqAutoGain(NULL), amOutputCeil(1), amOutputCeilMA(1), amOutputCeilMAA(1), audioSampleRate(0), squelchLevel(0), signalLevel(0), squelchEnabled(false), iqInputQueue(NULL), audioOutputQueue(NULL), audioVisOutputQueue(NULL), threadQueueControl(NULL), threadQueueNotify(NULL), cModem(nullptr), cModemKit(nullptr) { +DemodulatorThread::DemodulatorThread(DemodulatorInstance *parent) : IOThread(), iqAutoGain(NULL), audioSampleRate(0), squelchLevel(0), signalLevel(0), squelchEnabled(false), iqInputQueue(NULL), audioOutputQueue(NULL), audioVisOutputQueue(NULL), threadQueueControl(NULL), threadQueueNotify(NULL), cModem(nullptr), cModemKit(nullptr) { demodInstance = parent; muted.store(false); agcEnabled.store(false); - - // advanced demodulators - -/* demodulatorCons.store(2); - currentDemodCons = 0; - - demodASK = demodASK2; - demodASK2 = modem_create(LIQUID_MODEM_ASK2); - demodASK4 = modem_create(LIQUID_MODEM_ASK4); - demodASK8 = modem_create(LIQUID_MODEM_ASK8); - demodASK16 = modem_create(LIQUID_MODEM_ASK16); - demodASK32 = modem_create(LIQUID_MODEM_ASK32); - demodASK64 = modem_create(LIQUID_MODEM_ASK64); - demodASK128 = modem_create(LIQUID_MODEM_ASK128); - demodASK256 = modem_create(LIQUID_MODEM_ASK256); - - demodAPSK = demodAPSK4; - demodAPSK4 = modem_create(LIQUID_MODEM_APSK4); - demodAPSK8 = modem_create(LIQUID_MODEM_APSK8); - demodAPSK16 = modem_create(LIQUID_MODEM_APSK16); - demodAPSK32 = modem_create(LIQUID_MODEM_APSK32); - demodAPSK64 = modem_create(LIQUID_MODEM_APSK64); - demodAPSK128 = modem_create(LIQUID_MODEM_APSK128); - demodAPSK256 = modem_create(LIQUID_MODEM_APSK256); - - demodBPSK = modem_create(LIQUID_MODEM_BPSK); - - demodDPSK = demodDPSK2; - demodDPSK2 = modem_create(LIQUID_MODEM_DPSK2); - demodDPSK4 = modem_create(LIQUID_MODEM_DPSK4); - demodDPSK8 = modem_create(LIQUID_MODEM_DPSK8); - demodDPSK16 = modem_create(LIQUID_MODEM_DPSK16); - demodDPSK32 = modem_create(LIQUID_MODEM_DPSK32); - demodDPSK64 = modem_create(LIQUID_MODEM_DPSK64); - demodDPSK128 = modem_create(LIQUID_MODEM_DPSK128); - demodDPSK256 = modem_create(LIQUID_MODEM_DPSK256); - - demodPSK = demodPSK2; - demodPSK2 = modem_create(LIQUID_MODEM_PSK2); - demodPSK4 = modem_create(LIQUID_MODEM_PSK4); - demodPSK8 = modem_create(LIQUID_MODEM_PSK8); - demodPSK16 = modem_create(LIQUID_MODEM_PSK16); - demodPSK32 = modem_create(LIQUID_MODEM_PSK32); - demodPSK64 = modem_create(LIQUID_MODEM_PSK64); - demodPSK128 = modem_create(LIQUID_MODEM_PSK128); - demodPSK256 = modem_create(LIQUID_MODEM_PSK256); - - demodOOK = modem_create(LIQUID_MODEM_OOK); - - demodSQAM = demodSQAM32; - demodSQAM32 = modem_create(LIQUID_MODEM_SQAM32); - demodSQAM128 = modem_create(LIQUID_MODEM_SQAM128); - - demodST = modem_create(LIQUID_MODEM_V29); - - demodQAM = demodQAM4; - demodQAM4 = modem_create(LIQUID_MODEM_QAM4); - demodQAM8 = modem_create(LIQUID_MODEM_QAM8); - demodQAM16 = modem_create(LIQUID_MODEM_QAM16); - demodQAM32 = modem_create(LIQUID_MODEM_QAM32); - demodQAM64 = modem_create(LIQUID_MODEM_QAM64); - demodQAM128 = modem_create(LIQUID_MODEM_QAM128); - demodQAM256 = modem_create(LIQUID_MODEM_QAM256); - - demodQPSK = modem_create(LIQUID_MODEM_QPSK); - - currentDemodLock = false; */ - } DemodulatorThread::~DemodulatorThread() { } @@ -133,7 +65,6 @@ void DemodulatorThread::run() { continue; } - if (inp->modemKit && inp->modemKit != cModemKit) { if (cModemKit != nullptr) { cModem->disposeKit(cModemKit); @@ -182,8 +113,6 @@ void DemodulatorThread::run() { modemData.data.assign(inputData->begin(), inputData->end()); modemData.setRefCount(1); - - AudioThreadInput *ati = NULL; ati = outputBuffers.getBuffer(); @@ -192,311 +121,6 @@ void DemodulatorThread::run() { ati->setRefCount(1); cModem->demodulate(cModemKit, &modemData, ati); - - // Reset demodulator Constellations & Lock -// updateDemodulatorCons(0); -/* - { - switch (demodulatorType.load()) { - // advanced demodulators - case DEMOD_TYPE_ASK: - - switch (demodulatorCons.load()) { - case 2: - demodASK = demodASK2; - updateDemodulatorCons(2); - break; - case 4: - demodASK = demodASK4; - updateDemodulatorCons(4); - break; - case 8: - demodASK = demodASK8; - updateDemodulatorCons(8); - break; - case 16: - demodASK = demodASK16; - updateDemodulatorCons(16); - break; - case 32: - demodASK = demodASK32; - updateDemodulatorCons(32); - break; - case 64: - demodASK = demodASK64; - updateDemodulatorCons(64); - break; - case 128: - demodASK = demodASK128; - updateDemodulatorCons(128); - break; - case 256: - demodASK = demodASK256; - updateDemodulatorCons(256); - break; - default: - demodASK = demodASK2; - break; - } - - for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodASK, inp->data[i], &demodOutputDataDigital[i]); - } - updateDemodulatorLock(demodASK, 0.005f); - break; - case DEMOD_TYPE_APSK: - - switch (demodulatorCons.load()) { - case 2: - demodAPSK = demodAPSK4; - updateDemodulatorCons(4); - break; - case 4: - demodAPSK = demodAPSK4; - updateDemodulatorCons(4); - break; - case 8: - demodAPSK = demodAPSK8; - updateDemodulatorCons(8); - break; - case 16: - demodAPSK = demodAPSK16; - updateDemodulatorCons(16); - break; - case 32: - demodAPSK = demodAPSK32; - updateDemodulatorCons(32); - break; - case 64: - demodAPSK = demodAPSK64; - updateDemodulatorCons(64); - break; - case 128: - demodAPSK = demodAPSK128; - updateDemodulatorCons(128); - break; - case 256: - demodAPSK = demodAPSK256; - updateDemodulatorCons(256); - break; - default: - demodAPSK = demodAPSK4; - break; - } - - for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodAPSK, inp->data[i], &demodOutputDataDigital[i]); - } - updateDemodulatorLock(demodAPSK, 0.005f); - break; - case DEMOD_TYPE_BPSK: - for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodBPSK, inp->data[i], &demodOutputDataDigital[i]); - } - updateDemodulatorLock(demodBPSK, 0.005f); - break; - case DEMOD_TYPE_DPSK: - - switch (demodulatorCons.load()) { - case 2: - demodDPSK = demodDPSK2; - updateDemodulatorCons(2); - break; - case 4: - demodDPSK = demodDPSK4; - updateDemodulatorCons(4); - break; - case 8: - demodDPSK = demodDPSK8; - updateDemodulatorCons(8); - break; - case 16: - demodDPSK = demodDPSK16; - updateDemodulatorCons(16); - break; - case 32: - demodDPSK = demodDPSK32; - updateDemodulatorCons(32); - break; - case 64: - demodDPSK = demodDPSK64; - updateDemodulatorCons(64); - break; - case 128: - demodDPSK = demodDPSK128; - updateDemodulatorCons(128); - break; - case 256: - demodDPSK = demodDPSK256; - updateDemodulatorCons(256); - break; - default: - demodDPSK = demodDPSK2; - break; - } - - for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodDPSK, inp->data[i], &demodOutputDataDigital[i]); - } - updateDemodulatorLock(demodDPSK, 0.005f); - break; - case DEMOD_TYPE_PSK: - - switch (demodulatorCons.load()) { - case 2: - demodPSK = demodPSK2; - updateDemodulatorCons(2); - break; - case 4: - demodPSK = demodPSK4; - updateDemodulatorCons(4); - break; - case 8: - demodPSK = demodPSK8; - updateDemodulatorCons(8); - break; - case 16: - demodPSK = demodPSK16; - updateDemodulatorCons(16); - break; - case 32: - demodPSK = demodPSK32; - updateDemodulatorCons(32); - break; - case 64: - demodPSK = demodPSK64; - updateDemodulatorCons(64); - break; - case 128: - demodPSK = demodPSK128; - updateDemodulatorCons(128); - break; - case 256: - demodPSK = demodPSK256; - updateDemodulatorCons(256); - break; - default: - demodPSK = demodPSK2; - break; - } - - for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodPSK, inp->data[i], &demodOutputDataDigital[i]); - } - updateDemodulatorLock(demodPSK, 0.005f); - break; - case DEMOD_TYPE_OOK: - for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodOOK, inp->data[i], &demodOutputDataDigital[i]); - } - updateDemodulatorLock(demodOOK, 0.005f); - break; - case DEMOD_TYPE_SQAM: - - switch (demodulatorCons.load()) { - case 2: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 4: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 8: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 16: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 32: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 64: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 128: - demodSQAM = demodSQAM128; - updateDemodulatorCons(128); - break; - case 256: - demodSQAM = demodSQAM128; - updateDemodulatorCons(128); - break; - default: - demodSQAM = demodSQAM32; - break; - } - - for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodSQAM, inp->data[i], &demodOutputDataDigital[i]); - } - updateDemodulatorLock(demodSQAM, 0.005f); - break; - case DEMOD_TYPE_ST: - for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodST, inp->data[i], &demodOutputDataDigital[i]); - } - updateDemodulatorLock(demodST, 0.005f); - break; - case DEMOD_TYPE_QAM: - - switch (demodulatorCons.load()) { - case 2: - demodQAM = demodQAM4; - updateDemodulatorCons(4); - break; - case 4: - demodQAM = demodQAM4; - updateDemodulatorCons(4); - break; - case 8: - demodQAM = demodQAM8; - updateDemodulatorCons(8); - break; - case 16: - demodQAM = demodQAM16; - updateDemodulatorCons(16); - break; - case 32: - demodQAM = demodQAM32; - updateDemodulatorCons(32); - break; - case 64: - demodQAM = demodQAM64; - updateDemodulatorCons(64); - break; - case 128: - demodQAM = demodQAM128; - updateDemodulatorCons(128); - break; - case 256: - demodQAM = demodQAM256; - updateDemodulatorCons(256); - break; - default: - demodQAM = demodQAM4; - break; - } - - for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodQAM, inp->data[i], &demodOutputDataDigital[i]); - } - updateDemodulatorLock(demodQAM, 0.5f); - break; - case DEMOD_TYPE_QPSK: - for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodQPSK, inp->data[i], &demodOutputDataDigital[i]); - } - updateDemodulatorLock(demodQPSK, 0.8f); - break; - } - } - - }*/ if (currentSignalLevel > signalLevel) { signalLevel = signalLevel + (currentSignalLevel - signalLevel) * 0.5; @@ -504,7 +128,6 @@ void DemodulatorThread::run() { signalLevel = signalLevel + (currentSignalLevel - signalLevel) * 0.05; } - if (audioOutputQueue != NULL) { if (ati && (!squelchEnabled || (signalLevel >= squelchLevel))) { std::vector::iterator data_i; @@ -596,7 +219,6 @@ void DemodulatorThread::run() { } } -// demodOutputDataDigital.empty(); inp->decRefCount(); } @@ -654,29 +276,3 @@ void DemodulatorThread::setSquelchLevel(float signal_level_in) { float DemodulatorThread::getSquelchLevel() { return squelchLevel; } - -void DemodulatorThread::setDemodulatorLock(bool demod_lock_in) { - demod_lock_in ? currentDemodLock = true : currentDemodLock = false; -} - -int DemodulatorThread::getDemodulatorLock() { - return currentDemodLock; -} - -void DemodulatorThread::setDemodulatorCons(int demod_cons_in) { - demodulatorCons.store(demod_cons_in); -} - -int DemodulatorThread::getDemodulatorCons() { - return currentDemodCons; -} - -void DemodulatorThread::updateDemodulatorLock(modem demod, float sensitivity) { - modem_get_demodulator_evm(demod) <= sensitivity ? setDemodulatorLock(true) : setDemodulatorLock(false); -} - -void DemodulatorThread::updateDemodulatorCons(int Cons) { - if (currentDemodCons != Cons) { - currentDemodCons = Cons; - } -} diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index cc08ac7..7cccd58 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -32,12 +32,7 @@ public: float getSignalLevel(); void setSquelchLevel(float signal_level_in); float getSquelchLevel(); - - void setDemodulatorLock(bool demod_lock_in); - int getDemodulatorLock(); - - void setDemodulatorCons(int demod_cons_in); - int getDemodulatorCons(); + // //#ifdef __APPLE__ // static void *pthread_helper(void *context) { @@ -51,104 +46,17 @@ protected: std::vector agcData; std::vector agcAMData; -// std::vector demodOutputData; -// std::vector demodStereoData; -// std::vector resampledOutputData; -// std::vector resampledStereoData; - std::vector demodOutputDataDigital; - //std::vector demodOutputDataDigitalTest; - //std::vector demodOutputSoftbits; - //std::vector demodOutputSoftbitsTest; - -// freqdem demodFM; -// ampmodem demodAM; -// ampmodem demodAM_DSB_CSP; -// ampmodem demodAM_DSB; -// ampmodem demodAM_LSB; -// ampmodem demodAM_USB; -/* - modem demodASK; - modem demodASK2; - modem demodASK4; - modem demodASK8; - modem demodASK16; - modem demodASK32; - modem demodASK64; - modem demodASK128; - modem demodASK256; - - modem demodAPSK; - modem demodAPSK4; - modem demodAPSK8; - modem demodAPSK16; - modem demodAPSK32; - modem demodAPSK64; - modem demodAPSK128; - modem demodAPSK256; - - modem demodBPSK; - - modem demodDPSK; - modem demodDPSK2; - modem demodDPSK4; - modem demodDPSK8; - modem demodDPSK16; - modem demodDPSK32; - modem demodDPSK64; - modem demodDPSK128; - modem demodDPSK256; - - modem demodPSK; - modem demodPSK2; - modem demodPSK4; - modem demodPSK8; - modem demodPSK16; - modem demodPSK32; - modem demodPSK64; - modem demodPSK128; - modem demodPSK256; - - modem demodOOK; - - modem demodSQAM; - modem demodSQAM32; - modem demodSQAM128; - - modem demodST; - - modem demodQAM; - modem demodQAM4; - modem demodQAM8; - modem demodQAM16; - modem demodQAM32; - modem demodQAM64; - modem demodQAM128; - modem demodQAM256; - - modem demodQPSK; -*/ agc_crcf iqAutoGain; - float amOutputCeil; - float amOutputCeilMA; - float amOutputCeilMAA; - std::atomic_bool muted; std::atomic_bool agcEnabled; - std::atomic_int demodulatorCons; int audioSampleRate; std::atomic squelchLevel; std::atomic signalLevel; bool squelchEnabled; - bool currentDemodLock; - int currentDemodCons; - - void updateDemodulatorCons(int Cons); - void updateDemodulatorLock(modem demod, float sensitivity); - Modem *cModem; ModemKit *cModemKit; diff --git a/src/modules/modem/ModemAnalog.cpp b/src/modules/modem/ModemAnalog.cpp index d50994d..1284bc1 100644 --- a/src/modules/modem/ModemAnalog.cpp +++ b/src/modules/modem/ModemAnalog.cpp @@ -22,7 +22,7 @@ void ModemAnalog::disposeKit(ModemKit *kit) { ModemKitAnalog *akit = (ModemKitAnalog *)kit; msresamp_rrrf_destroy(akit->audioResampler); - delete kit; + delete akit; } void ModemAnalog::initOutputBuffers(ModemKitAnalog *akit, ModemIQData *input) { diff --git a/src/modules/modem/ModemDigital.cpp b/src/modules/modem/ModemDigital.cpp new file mode 100644 index 0000000..9a73695 --- /dev/null +++ b/src/modules/modem/ModemDigital.cpp @@ -0,0 +1,70 @@ +#include "ModemDigital.h" + +ModemDigital::ModemDigital() { + demodulatorCons.store(2); + currentDemodCons = 0; + currentDemodLock = false; +} + +ModemKit *ModemDigital::buildKit(long long sampleRate, int audioSampleRate) { + ModemKitDigital *dkit = new ModemKitDigital; + + dkit->sampleRate = sampleRate; + dkit->audioSampleRate = audioSampleRate; + + return dkit; +} + +void ModemDigital::disposeKit(ModemKit *kit) { + ModemKitDigital *dkit = (ModemKitDigital *)kit; + + delete dkit; +} + + +void ModemDigital::setDemodulatorLock(bool demod_lock_in) { + demod_lock_in ? currentDemodLock = true : currentDemodLock = false; +} + +int ModemDigital::getDemodulatorLock() { + return currentDemodLock; +} + +void ModemDigital::setDemodulatorCons(int demod_cons_in) { + demodulatorCons.store(demod_cons_in); +} + +int ModemDigital::getDemodulatorCons() { + return currentDemodCons; +} + +void ModemDigital::updateDemodulatorLock(modem demod, float sensitivity) { + modem_get_demodulator_evm(demod) <= sensitivity ? setDemodulatorLock(true) : setDemodulatorLock(false); +} + +void ModemDigital::updateDemodulatorCons(int Cons) { + if (currentDemodCons != Cons) { + currentDemodCons = Cons; + } +} + + +// Demodulate +/* + // Reset demodulator Constellations & Lock + // updateDemodulatorCons(0); + +{ + switch (demodulatorType.load()) { + // advanced demodulators + + } +} + + +} + + // demodOutputDataDigital.empty(); + + + */ diff --git a/src/modules/modem/ModemDigital.h b/src/modules/modem/ModemDigital.h new file mode 100644 index 0000000..9768207 --- /dev/null +++ b/src/modules/modem/ModemDigital.h @@ -0,0 +1,38 @@ +#pragma once +#include "Modem.h" + +class ModemKitDigital : public ModemKit { +public: + ModemKitDigital() : ModemKit() { + + }; +}; + + +class ModemDigital : public Modem { +public: + ModemDigital(); + ModemKit *buildKit(long long sampleRate, int audioSampleRate); + void disposeKit(ModemKit *kit); + + void setDemodulatorLock(bool demod_lock_in); + int getDemodulatorLock(); + + void setDemodulatorCons(int demod_cons_in); + int getDemodulatorCons(); + + void updateDemodulatorCons(int Cons); + void updateDemodulatorLock(modem demod, float sensitivity); + +protected: + std::vector demodOutputDataDigital; + std::atomic_int demodulatorCons; + bool currentDemodLock; + int currentDemodCons; + + int bufSize; + +// std::vector demodOutputDataDigitalTest; +// std::vector demodOutputSoftbits; +// std::vector demodOutputSoftbitsTest; +}; \ No newline at end of file diff --git a/src/modules/modem/digital/ModemAPSK.cpp b/src/modules/modem/digital/ModemAPSK.cpp index b21c7fc..b66259e 100644 --- a/src/modules/modem/digital/ModemAPSK.cpp +++ b/src/modules/modem/digital/ModemAPSK.cpp @@ -1 +1,76 @@ -#include "ModemAPSK.h" \ No newline at end of file +#include "ModemAPSK.h" + +ModemAPSK::ModemAPSK() { + demodAPSK4 = modem_create(LIQUID_MODEM_APSK4); + demodAPSK8 = modem_create(LIQUID_MODEM_APSK8); + demodAPSK16 = modem_create(LIQUID_MODEM_APSK16); + demodAPSK32 = modem_create(LIQUID_MODEM_APSK32); + demodAPSK64 = modem_create(LIQUID_MODEM_APSK64); + demodAPSK128 = modem_create(LIQUID_MODEM_APSK128); + demodAPSK256 = modem_create(LIQUID_MODEM_APSK256); + demodAPSK = demodAPSK4; +} + +Modem *ModemAPSK::factory() { + return new ModemAPSK; +} + +ModemAPSK::~ModemAPSK() { + modem_destroy(demodAPSK4); + modem_destroy(demodAPSK8); + modem_destroy(demodAPSK16); + modem_destroy(demodAPSK32); + modem_destroy(demodAPSK64); + modem_destroy(demodAPSK128); + modem_destroy(demodAPSK256); +} + +void ModemAPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { +/* + case DEMOD_TYPE_APSK: + + switch (demodulatorCons.load()) { + case 2: + demodAPSK = demodAPSK4; + updateDemodulatorCons(4); + break; + case 4: + demodAPSK = demodAPSK4; + updateDemodulatorCons(4); + break; + case 8: + demodAPSK = demodAPSK8; + updateDemodulatorCons(8); + break; + case 16: + demodAPSK = demodAPSK16; + updateDemodulatorCons(16); + break; + case 32: + demodAPSK = demodAPSK32; + updateDemodulatorCons(32); + break; + case 64: + demodAPSK = demodAPSK64; + updateDemodulatorCons(64); + break; + case 128: + demodAPSK = demodAPSK128; + updateDemodulatorCons(128); + break; + case 256: + demodAPSK = demodAPSK256; + updateDemodulatorCons(256); + break; + default: + demodAPSK = demodAPSK4; + break; + } + + for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodAPSK, inp->data[i], &demodOutputDataDigital[i]); + } + updateDemodulatorLock(demodAPSK, 0.005f); + break; +*/ +} diff --git a/src/modules/modem/digital/ModemAPSK.h b/src/modules/modem/digital/ModemAPSK.h index d8fc4cc..475b043 100644 --- a/src/modules/modem/digital/ModemAPSK.h +++ b/src/modules/modem/digital/ModemAPSK.h @@ -1,3 +1,20 @@ #pragma once -#include "Modem.h" +#include "ModemDigital.h" +class ModemAPSK : public ModemDigital { +public: + ModemAPSK(); + ~ModemAPSK(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + modem demodAPSK; + modem demodAPSK4; + modem demodAPSK8; + modem demodAPSK16; + modem demodAPSK32; + modem demodAPSK64; + modem demodAPSK128; + modem demodAPSK256; +}; diff --git a/src/modules/modem/digital/ModemASK.cpp b/src/modules/modem/digital/ModemASK.cpp index 19ba6e9..72c842a 100644 --- a/src/modules/modem/digital/ModemASK.cpp +++ b/src/modules/modem/digital/ModemASK.cpp @@ -1 +1,78 @@ #include "ModemASK.h" + +ModemASK::ModemASK() { + demodASK2 = modem_create(LIQUID_MODEM_ASK2); + demodASK4 = modem_create(LIQUID_MODEM_ASK4); + demodASK8 = modem_create(LIQUID_MODEM_ASK8); + demodASK16 = modem_create(LIQUID_MODEM_ASK16); + demodASK32 = modem_create(LIQUID_MODEM_ASK32); + demodASK64 = modem_create(LIQUID_MODEM_ASK64); + demodASK128 = modem_create(LIQUID_MODEM_ASK128); + demodASK256 = modem_create(LIQUID_MODEM_ASK256); + demodASK = demodASK2; +} + +Modem *ModemASK::factory() { + return new ModemASK; +} + +ModemASK::~ModemASK() { + modem_destroy(demodASK4); + modem_destroy(demodASK8); + modem_destroy(demodASK16); + modem_destroy(demodASK32); + modem_destroy(demodASK64); + modem_destroy(demodASK128); + modem_destroy(demodASK256); +} + +void ModemASK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + +/* +case DEMOD_TYPE_ASK: + +switch (demodulatorCons.load()) { + case 2: + demodASK = demodASK2; + updateDemodulatorCons(2); + break; + case 4: + demodASK = demodASK4; + updateDemodulatorCons(4); + break; + case 8: + demodASK = demodASK8; + updateDemodulatorCons(8); + break; + case 16: + demodASK = demodASK16; + updateDemodulatorCons(16); + break; + case 32: + demodASK = demodASK32; + updateDemodulatorCons(32); + break; + case 64: + demodASK = demodASK64; + updateDemodulatorCons(64); + break; + case 128: + demodASK = demodASK128; + updateDemodulatorCons(128); + break; + case 256: + demodASK = demodASK256; + updateDemodulatorCons(256); + break; + default: + demodASK = demodASK2; + break; +} + +for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodASK, inp->data[i], &demodOutputDataDigital[i]); +} +updateDemodulatorLock(demodASK, 0.005f); +break; +*/ +} \ No newline at end of file diff --git a/src/modules/modem/digital/ModemASK.h b/src/modules/modem/digital/ModemASK.h index d8fc4cc..090d2c3 100644 --- a/src/modules/modem/digital/ModemASK.h +++ b/src/modules/modem/digital/ModemASK.h @@ -1,3 +1,21 @@ #pragma once -#include "Modem.h" +#include "ModemDigital.h" +class ModemASK : public ModemDigital { +public: + ModemASK(); + ~ModemASK(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + modem demodASK; + modem demodASK2; + modem demodASK4; + modem demodASK8; + modem demodASK16; + modem demodASK32; + modem demodASK64; + modem demodASK128; + modem demodASK256; +}; diff --git a/src/modules/modem/digital/ModemBPSK.cpp b/src/modules/modem/digital/ModemBPSK.cpp index 4cb3576..b4ce0aa 100644 --- a/src/modules/modem/digital/ModemBPSK.cpp +++ b/src/modules/modem/digital/ModemBPSK.cpp @@ -1 +1,25 @@ #include "ModemBPSK.h" + +ModemBPSK::ModemBPSK() { + demodBPSK = modem_create(LIQUID_MODEM_BPSK); + +} + +Modem *ModemBPSK::factory() { + return new ModemBPSK; +} + +ModemBPSK::~ModemBPSK() { + modem_destroy(demodBPSK); +} + +void ModemBPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { +/* +case DEMOD_TYPE_BPSK: +for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodBPSK, inp->data[i], &demodOutputDataDigital[i]); +} +updateDemodulatorLock(demodBPSK, 0.005f); +break; +*/ +} \ No newline at end of file diff --git a/src/modules/modem/digital/ModemBPSK.h b/src/modules/modem/digital/ModemBPSK.h index d8fc4cc..a454170 100644 --- a/src/modules/modem/digital/ModemBPSK.h +++ b/src/modules/modem/digital/ModemBPSK.h @@ -1,3 +1,14 @@ #pragma once -#include "Modem.h" +#include "ModemDigital.h" +class ModemBPSK : public ModemDigital { +public: + ModemBPSK(); + ~ModemBPSK(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + modem demodBPSK; + +}; diff --git a/src/modules/modem/digital/ModemDPSK.cpp b/src/modules/modem/digital/ModemDPSK.cpp index 04c269d..3c05329 100644 --- a/src/modules/modem/digital/ModemDPSK.cpp +++ b/src/modules/modem/digital/ModemDPSK.cpp @@ -1 +1,79 @@ #include "ModemDPSK.h" + +ModemDPSK::ModemDPSK() { + demodDPSK2 = modem_create(LIQUID_MODEM_DPSK2); + demodDPSK4 = modem_create(LIQUID_MODEM_DPSK4); + demodDPSK8 = modem_create(LIQUID_MODEM_DPSK8); + demodDPSK16 = modem_create(LIQUID_MODEM_DPSK16); + demodDPSK32 = modem_create(LIQUID_MODEM_DPSK32); + demodDPSK64 = modem_create(LIQUID_MODEM_DPSK64); + demodDPSK128 = modem_create(LIQUID_MODEM_DPSK128); + demodDPSK256 = modem_create(LIQUID_MODEM_DPSK256); + demodDPSK = demodDPSK2; +} + +Modem *ModemDPSK::factory() { + return new ModemDPSK; +} + +ModemDPSK::~ModemDPSK() { + modem_destroy(demodDPSK2); + modem_destroy(demodDPSK4); + modem_destroy(demodDPSK8); + modem_destroy(demodDPSK16); + modem_destroy(demodDPSK32); + modem_destroy(demodDPSK64); + modem_destroy(demodDPSK128); + modem_destroy(demodDPSK256); +} + +void ModemDPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + +/* +case DEMOD_TYPE_DPSK: + +switch (demodulatorCons.load()) { + case 2: + demodDPSK = demodDPSK2; + updateDemodulatorCons(2); + break; + case 4: + demodDPSK = demodDPSK4; + updateDemodulatorCons(4); + break; + case 8: + demodDPSK = demodDPSK8; + updateDemodulatorCons(8); + break; + case 16: + demodDPSK = demodDPSK16; + updateDemodulatorCons(16); + break; + case 32: + demodDPSK = demodDPSK32; + updateDemodulatorCons(32); + break; + case 64: + demodDPSK = demodDPSK64; + updateDemodulatorCons(64); + break; + case 128: + demodDPSK = demodDPSK128; + updateDemodulatorCons(128); + break; + case 256: + demodDPSK = demodDPSK256; + updateDemodulatorCons(256); + break; + default: + demodDPSK = demodDPSK2; + break; +} + +for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodDPSK, inp->data[i], &demodOutputDataDigital[i]); +} +updateDemodulatorLock(demodDPSK, 0.005f); +break; +*/ +} \ No newline at end of file diff --git a/src/modules/modem/digital/ModemDPSK.h b/src/modules/modem/digital/ModemDPSK.h index d8fc4cc..a3f188b 100644 --- a/src/modules/modem/digital/ModemDPSK.h +++ b/src/modules/modem/digital/ModemDPSK.h @@ -1,3 +1,22 @@ #pragma once -#include "Modem.h" +#include "ModemDigital.h" + +class ModemDPSK : public ModemDigital { +public: + ModemDPSK(); + ~ModemDPSK(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + modem demodDPSK; + modem demodDPSK2; + modem demodDPSK4; + modem demodDPSK8; + modem demodDPSK16; + modem demodDPSK32; + modem demodDPSK64; + modem demodDPSK128; + modem demodDPSK256; +}; diff --git a/src/modules/modem/digital/ModemOOK.cpp b/src/modules/modem/digital/ModemOOK.cpp index 50dd454..b8c825b 100644 --- a/src/modules/modem/digital/ModemOOK.cpp +++ b/src/modules/modem/digital/ModemOOK.cpp @@ -1 +1,25 @@ #include "ModemOOK.h" + +ModemOOK::ModemOOK() { + demodOOK = modem_create(LIQUID_MODEM_OOK); +} + +Modem *ModemOOK::factory() { + return new ModemOOK; +} + +ModemOOK::~ModemOOK() { + modem_destroy(demodOOK); +} + +void ModemOOK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + +/* +case DEMOD_TYPE_OOK: +for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodOOK, inp->data[i], &demodOutputDataDigital[i]); +} +updateDemodulatorLock(demodOOK, 0.005f); +break; +*/ +} \ No newline at end of file diff --git a/src/modules/modem/digital/ModemOOK.h b/src/modules/modem/digital/ModemOOK.h index d8fc4cc..9af2837 100644 --- a/src/modules/modem/digital/ModemOOK.h +++ b/src/modules/modem/digital/ModemOOK.h @@ -1,3 +1,14 @@ #pragma once -#include "Modem.h" +#include "ModemDigital.h" +class ModemOOK : public ModemDigital { +public: + ModemOOK(); + ~ModemOOK(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + modem demodOOK; + +}; diff --git a/src/modules/modem/digital/ModemPSK.cpp b/src/modules/modem/digital/ModemPSK.cpp index 3efece7..1609d54 100644 --- a/src/modules/modem/digital/ModemPSK.cpp +++ b/src/modules/modem/digital/ModemPSK.cpp @@ -1 +1,80 @@ #include "ModemPSK.h" + +ModemPSK::ModemPSK() { + + demodPSK = demodPSK2; + demodPSK2 = modem_create(LIQUID_MODEM_PSK2); + demodPSK4 = modem_create(LIQUID_MODEM_PSK4); + demodPSK8 = modem_create(LIQUID_MODEM_PSK8); + demodPSK16 = modem_create(LIQUID_MODEM_PSK16); + demodPSK32 = modem_create(LIQUID_MODEM_PSK32); + demodPSK64 = modem_create(LIQUID_MODEM_PSK64); + demodPSK128 = modem_create(LIQUID_MODEM_PSK128); + demodPSK256 = modem_create(LIQUID_MODEM_PSK256); +} + +Modem *ModemPSK::factory() { + return new ModemPSK; +} + +ModemPSK::~ModemPSK() { + modem_destroy(demodPSK2); + modem_destroy(demodPSK4); + modem_destroy(demodPSK8); + modem_destroy(demodPSK16); + modem_destroy(demodPSK32); + modem_destroy(demodPSK64); + modem_destroy(demodPSK128); + modem_destroy(demodPSK256); +} + +void ModemPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + +/* +case DEMOD_TYPE_PSK: + +switch (demodulatorCons.load()) { + case 2: + demodPSK = demodPSK2; + updateDemodulatorCons(2); + break; + case 4: + demodPSK = demodPSK4; + updateDemodulatorCons(4); + break; + case 8: + demodPSK = demodPSK8; + updateDemodulatorCons(8); + break; + case 16: + demodPSK = demodPSK16; + updateDemodulatorCons(16); + break; + case 32: + demodPSK = demodPSK32; + updateDemodulatorCons(32); + break; + case 64: + demodPSK = demodPSK64; + updateDemodulatorCons(64); + break; + case 128: + demodPSK = demodPSK128; + updateDemodulatorCons(128); + break; + case 256: + demodPSK = demodPSK256; + updateDemodulatorCons(256); + break; + default: + demodPSK = demodPSK2; + break; +} + +for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodPSK, inp->data[i], &demodOutputDataDigital[i]); +} +updateDemodulatorLock(demodPSK, 0.005f); +break; +*/ +} \ No newline at end of file diff --git a/src/modules/modem/digital/ModemPSK.h b/src/modules/modem/digital/ModemPSK.h index d8fc4cc..5cbc68c 100644 --- a/src/modules/modem/digital/ModemPSK.h +++ b/src/modules/modem/digital/ModemPSK.h @@ -1,3 +1,22 @@ #pragma once -#include "Modem.h" +#include "ModemDigital.h" + +class ModemPSK : public ModemDigital { +public: + ModemPSK(); + ~ModemPSK(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + modem demodPSK; + modem demodPSK2; + modem demodPSK4; + modem demodPSK8; + modem demodPSK16; + modem demodPSK32; + modem demodPSK64; + modem demodPSK128; + modem demodPSK256; +}; diff --git a/src/modules/modem/digital/ModemQAM.cpp b/src/modules/modem/digital/ModemQAM.cpp index 8b4b6d2..d6be0bb 100644 --- a/src/modules/modem/digital/ModemQAM.cpp +++ b/src/modules/modem/digital/ModemQAM.cpp @@ -1 +1,77 @@ #include "ModemQAM.h" + +ModemQAM::ModemQAM() { + demodQAM4 = modem_create(LIQUID_MODEM_QAM4); + demodQAM8 = modem_create(LIQUID_MODEM_QAM8); + demodQAM16 = modem_create(LIQUID_MODEM_QAM16); + demodQAM32 = modem_create(LIQUID_MODEM_QAM32); + demodQAM64 = modem_create(LIQUID_MODEM_QAM64); + demodQAM128 = modem_create(LIQUID_MODEM_QAM128); + demodQAM256 = modem_create(LIQUID_MODEM_QAM256); + demodQAM = demodQAM4; +} + +Modem *ModemQAM::factory() { + return new ModemQAM; +} + +ModemQAM::~ModemQAM() { + modem_destroy(demodQAM4); + modem_destroy(demodQAM8); + modem_destroy(demodQAM16); + modem_destroy(demodQAM32); + modem_destroy(demodQAM64); + modem_destroy(demodQAM128); + modem_destroy(demodQAM256); +} + +void ModemQAM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + +/* +case DEMOD_TYPE_QAM: + +switch (demodulatorCons.load()) { + case 2: + demodQAM = demodQAM4; + updateDemodulatorCons(4); + break; + case 4: + demodQAM = demodQAM4; + updateDemodulatorCons(4); + break; + case 8: + demodQAM = demodQAM8; + updateDemodulatorCons(8); + break; + case 16: + demodQAM = demodQAM16; + updateDemodulatorCons(16); + break; + case 32: + demodQAM = demodQAM32; + updateDemodulatorCons(32); + break; + case 64: + demodQAM = demodQAM64; + updateDemodulatorCons(64); + break; + case 128: + demodQAM = demodQAM128; + updateDemodulatorCons(128); + break; + case 256: + demodQAM = demodQAM256; + updateDemodulatorCons(256); + break; + default: + demodQAM = demodQAM4; + break; +} + +for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodQAM, inp->data[i], &demodOutputDataDigital[i]); +} +updateDemodulatorLock(demodQAM, 0.5f); +break; +*/ +} diff --git a/src/modules/modem/digital/ModemQAM.h b/src/modules/modem/digital/ModemQAM.h index d8fc4cc..2971cb8 100644 --- a/src/modules/modem/digital/ModemQAM.h +++ b/src/modules/modem/digital/ModemQAM.h @@ -1,3 +1,22 @@ #pragma once -#include "Modem.h" +#include "ModemDigital.h" + +class ModemQAM : public ModemDigital { +public: + ModemQAM(); + ~ModemQAM(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + modem demodQAM; + modem demodQAM4; + modem demodQAM8; + modem demodQAM16; + modem demodQAM32; + modem demodQAM64; + modem demodQAM128; + modem demodQAM256; +}; + diff --git a/src/modules/modem/digital/ModemQPSK.cpp b/src/modules/modem/digital/ModemQPSK.cpp index e2dea39..50ab626 100644 --- a/src/modules/modem/digital/ModemQPSK.cpp +++ b/src/modules/modem/digital/ModemQPSK.cpp @@ -1 +1,25 @@ #include "ModemQPSK.h" + +ModemQPSK::ModemQPSK() { + demodQPSK = modem_create(LIQUID_MODEM_QPSK); +} + +Modem *ModemQPSK::factory() { + return new ModemQPSK; +} + +ModemQPSK::~ModemQPSK() { + modem_destroy(demodQPSK); +} + +void ModemQPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + +/* +case DEMOD_TYPE_QPSK: +for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodQPSK, inp->data[i], &demodOutputDataDigital[i]); +} +updateDemodulatorLock(demodQPSK, 0.8f); +break; +*/ +} \ No newline at end of file diff --git a/src/modules/modem/digital/ModemQPSK.h b/src/modules/modem/digital/ModemQPSK.h index d8fc4cc..dfdd1b0 100644 --- a/src/modules/modem/digital/ModemQPSK.h +++ b/src/modules/modem/digital/ModemQPSK.h @@ -1,3 +1,13 @@ #pragma once -#include "Modem.h" +#include "ModemDigital.h" +class ModemQPSK : public ModemDigital { +public: + ModemQPSK(); + ~ModemQPSK(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + modem demodQPSK; +}; diff --git a/src/modules/modem/digital/ModemSQAM.cpp b/src/modules/modem/digital/ModemSQAM.cpp index fed6b18..4dc7045 100644 --- a/src/modules/modem/digital/ModemSQAM.cpp +++ b/src/modules/modem/digital/ModemSQAM.cpp @@ -1 +1,67 @@ #include "ModemSQAM.h" + +ModemSQAM::ModemSQAM() { + demodSQAM = demodSQAM32; + demodSQAM32 = modem_create(LIQUID_MODEM_SQAM32); + demodSQAM128 = modem_create(LIQUID_MODEM_SQAM128); +} + +Modem *ModemSQAM::factory() { + return new ModemSQAM; +} + +ModemSQAM::~ModemSQAM() { + modem_destroy(demodSQAM32); + modem_destroy(demodSQAM128); +} + +void ModemSQAM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + +/* +case DEMOD_TYPE_SQAM: + +switch (demodulatorCons.load()) { + case 2: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 4: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 8: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 16: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 32: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 64: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 128: + demodSQAM = demodSQAM128; + updateDemodulatorCons(128); + break; + case 256: + demodSQAM = demodSQAM128; + updateDemodulatorCons(128); + break; + default: + demodSQAM = demodSQAM32; + break; +} + +for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodSQAM, inp->data[i], &demodOutputDataDigital[i]); +} +updateDemodulatorLock(demodSQAM, 0.005f); +break; +*/ +} \ No newline at end of file diff --git a/src/modules/modem/digital/ModemSQAM.h b/src/modules/modem/digital/ModemSQAM.h index d8fc4cc..b869547 100644 --- a/src/modules/modem/digital/ModemSQAM.h +++ b/src/modules/modem/digital/ModemSQAM.h @@ -1,3 +1,15 @@ #pragma once -#include "Modem.h" +#include "ModemDigital.h" +class ModemSQAM : public ModemDigital { +public: + ModemSQAM(); + ~ModemSQAM(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + modem demodSQAM; + modem demodSQAM32; + modem demodSQAM128; +}; diff --git a/src/modules/modem/digital/ModemST.cpp b/src/modules/modem/digital/ModemST.cpp index 81cea23..5311352 100644 --- a/src/modules/modem/digital/ModemST.cpp +++ b/src/modules/modem/digital/ModemST.cpp @@ -1,2 +1,27 @@ #include "ModemST.h" +ModemST::ModemST() { + demodST = modem_create(LIQUID_MODEM_V29); +} + +Modem *ModemST::factory() { + return new ModemST; +} + + +ModemST::~ModemST() { + modem_destroy(demodST); +} + +void ModemST::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + +/* +case DEMOD_TYPE_ST: +for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodST, inp->data[i], &demodOutputDataDigital[i]); +} +updateDemodulatorLock(demodST, 0.005f); +break; + +*/ +} \ No newline at end of file diff --git a/src/modules/modem/digital/ModemST.h b/src/modules/modem/digital/ModemST.h index ae80ca2..380f05f 100644 --- a/src/modules/modem/digital/ModemST.h +++ b/src/modules/modem/digital/ModemST.h @@ -1,2 +1,14 @@ #pragma once -#include "Modem.h" \ No newline at end of file +#include "ModemDigital.h" + +class ModemST : public ModemDigital { +public: + ModemST(); + ~ModemST(); + Modem *factory(); + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + modem demodST; +}; + From 10aa9f86dddb4145113f3baa3ec29329b18b5332 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 18 Nov 2015 21:13:04 -0500 Subject: [PATCH 12/28] Apply source formatting for demodulator thread --- src/demod/DemodulatorThread.cpp | 126 ++++++++++++++++---------------- src/demod/DemodulatorThread.h | 7 -- 2 files changed, 63 insertions(+), 70 deletions(-) diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index 7a654b4..fe73f50 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -13,13 +13,15 @@ #endif DemodulatorThread::DemodulatorThread(DemodulatorInstance *parent) : IOThread(), iqAutoGain(NULL), audioSampleRate(0), squelchLevel(0), signalLevel(0), squelchEnabled(false), iqInputQueue(NULL), audioOutputQueue(NULL), audioVisOutputQueue(NULL), threadQueueControl(NULL), threadQueueNotify(NULL), cModem(nullptr), cModemKit(nullptr) { - + demodInstance = parent; muted.store(false); - agcEnabled.store(false); - + agcEnabled.store(false); + } + DemodulatorThread::~DemodulatorThread() { + } void DemodulatorThread::onBindOutput(std::string name, ThreadQueueBase *threadQueue) { @@ -35,36 +37,36 @@ void DemodulatorThread::run() { sched_param prio = {priority}; // scheduling priority of thread pthread_setschedparam(tID, SCHED_FIFO, &prio); #endif - + // Automatic IQ gain iqAutoGain = agc_crcf_create(); agc_crcf_set_bandwidth(iqAutoGain, 0.1); - + ReBuffer audioVisBuffers; - + std::cout << "Demodulator thread started.." << std::endl; - + iqInputQueue = (DemodulatorThreadPostInputQueue*)getInputQueue("IQDataInput"); audioOutputQueue = (AudioThreadInputQueue*)getOutputQueue("AudioDataOutput"); threadQueueControl = (DemodulatorThreadControlCommandQueue *)getInputQueue("ControlQueue"); threadQueueNotify = (DemodulatorThreadCommandQueue*)getOutputQueue("NotifyQueue"); - + ModemIQData modemData; while (!terminated) { DemodulatorThreadPostIQData *inp; iqInputQueue->pop(inp); -// std::lock_guard < std::mutex > lock(inp->m_mutex); - + // std::lock_guard < std::mutex > lock(inp->m_mutex); + audioSampleRate = demodInstance->getAudioSampleRate(); int bufSize = inp->data.size(); - + if (!bufSize) { inp->decRefCount(); continue; } - + if (inp->modemKit && inp->modemKit != cModemKit) { if (cModemKit != nullptr) { cModem->disposeKit(cModemKit); @@ -90,23 +92,23 @@ void DemodulatorThread::run() { agcData.resize(bufSize); agcAMData.resize(bufSize); } - + agc_crcf_execute_block(iqAutoGain, &(inp->data[0]), bufSize, &agcData[0]); - + float currentSignalLevel = 0; - + currentSignalLevel = ((60.0 / fabs(agc_crcf_get_rssi(iqAutoGain))) / 15.0 - signalLevel); - + if (agc_crcf_get_signal_level(iqAutoGain) > currentSignalLevel) { currentSignalLevel = agc_crcf_get_signal_level(iqAutoGain); } - + std::vector *inputData; - + if (agcEnabled) { - inputData = &agcData; + inputData = &agcData; } else { - inputData = &inp->data; + inputData = &inp->data; } modemData.sampleRate = inp->sampleRate; @@ -119,15 +121,15 @@ void DemodulatorThread::run() { ati->sampleRate = audioSampleRate; ati->inputRate = inp->sampleRate; ati->setRefCount(1); - + cModem->demodulate(cModemKit, &modemData, ati); - + if (currentSignalLevel > signalLevel) { signalLevel = signalLevel + (currentSignalLevel - signalLevel) * 0.5; } else { signalLevel = signalLevel + (currentSignalLevel - signalLevel) * 0.05; } - + if (audioOutputQueue != NULL) { if (ati && (!squelchEnabled || (signalLevel >= squelchLevel))) { std::vector::iterator data_i; @@ -140,10 +142,10 @@ void DemodulatorThread::run() { } } } - + if (ati && audioVisOutputQueue != NULL && audioVisOutputQueue->empty()) { - AudioThreadInput *ati_vis = audioVisBuffers.getBuffer(); - ati_vis->setRefCount(1); + AudioThreadInput *ati_vis = audioVisBuffers.getBuffer(); + ati_vis->setRefCount(1); ati_vis->sampleRate = inp->sampleRate; ati_vis->inputRate = inp->sampleRate; @@ -154,9 +156,9 @@ void DemodulatorThread::run() { if (stereoSize > DEMOD_VIS_SIZE * 2) { stereoSize = DEMOD_VIS_SIZE * 2; } - + ati_vis->data.resize(stereoSize); - + if (inp->modemType == "I/Q") { for (int i = 0; i < stereoSize / 2; i++) { ati_vis->data[i] = agcData[i].real * 0.75; @@ -173,25 +175,25 @@ void DemodulatorThread::run() { } else { int numAudioWritten = ati->data.size(); ati_vis->channels = 1; -// if (numAudioWritten > bufSize) { - ati_vis->inputRate = audioSampleRate; - if (num_vis > numAudioWritten) { - num_vis = numAudioWritten; - } - ati_vis->data.assign(ati->data.begin(), ati->data.begin() + num_vis); -// } else { -// if (num_vis > bufSize) { -// num_vis = bufSize; -// } -// ati_vis->data.assign(ati->data.begin(), ati->data.begin() + num_vis); -// } - -// std::cout << "Signal: " << agc_crcf_get_signal_level(agc) << " -- " << agc_crcf_get_rssi(agc) << "dB " << std::endl; + // if (numAudioWritten > bufSize) { + ati_vis->inputRate = audioSampleRate; + if (num_vis > numAudioWritten) { + num_vis = numAudioWritten; + } + ati_vis->data.assign(ati->data.begin(), ati->data.begin() + num_vis); + // } else { + // if (num_vis > bufSize) { + // num_vis = bufSize; + // } + // ati_vis->data.assign(ati->data.begin(), ati->data.begin() + num_vis); + // } + + // std::cout << "Signal: " << agc_crcf_get_signal_level(agc) << " -- " << agc_crcf_get_rssi(agc) << "dB " << std::endl; } - + audioVisOutputQueue->push(ati_vis); } - + if (ati != NULL) { if (!muted.load()) { @@ -200,38 +202,37 @@ void DemodulatorThread::run() { ati->setRefCount(0); } } - + if (!threadQueueControl->empty()) { while (!threadQueueControl->empty()) { DemodulatorThreadControlCommand command; threadQueueControl->pop(command); - + switch (command.cmd) { - case DemodulatorThreadControlCommand::DEMOD_THREAD_CMD_CTL_SQUELCH_ON: - squelchEnabled = true; - break; - case DemodulatorThreadControlCommand::DEMOD_THREAD_CMD_CTL_SQUELCH_OFF: - squelchEnabled = false; - break; - default: - break; + case DemodulatorThreadControlCommand::DEMOD_THREAD_CMD_CTL_SQUELCH_ON: + squelchEnabled = true; + break; + case DemodulatorThreadControlCommand::DEMOD_THREAD_CMD_CTL_SQUELCH_OFF: + squelchEnabled = false; + break; + default: + break; } } } - - + inp->decRefCount(); } - // end while !terminated + // end while !terminated outputBuffers.purge(); - + if (audioVisOutputQueue && !audioVisOutputQueue->empty()) { AudioThreadInput *dummy_vis; audioVisOutputQueue->pop(dummy_vis); } - audioVisBuffers.purge(); - + audioVisBuffers.purge(); + DemodulatorThreadCommand tCmd(DemodulatorThreadCommand::DEMOD_THREAD_CMD_DEMOD_TERMINATED); tCmd.context = this; threadQueueNotify->push(tCmd); @@ -254,14 +255,13 @@ void DemodulatorThread::setMuted(bool muted) { } void DemodulatorThread::setAGC(bool state) { - agcEnabled.store(state); + agcEnabled.store(state); } bool DemodulatorThread::getAGC() { - return agcEnabled.load(); + return agcEnabled.load(); } - float DemodulatorThread::getSignalLevel() { return signalLevel.load(); } diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index 7cccd58..6ada067 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -33,13 +33,6 @@ public: void setSquelchLevel(float signal_level_in); float getSquelchLevel(); -// -//#ifdef __APPLE__ -// static void *pthread_helper(void *context) { -// return ((DemodulatorThread *) context)->threadMain(); -// } -//#endif - protected: DemodulatorInstance *demodInstance; ReBuffer outputBuffers; From d6ffb6edc2e0d2b533e56ebb81da57e86b44f876 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 18 Nov 2015 21:31:59 -0500 Subject: [PATCH 13/28] Cleanup / implement digital modem demod code --- src/modules/modem/ModemDigital.h | 4 +- src/modules/modem/digital/ModemAPSK.cpp | 9 +-- src/modules/modem/digital/ModemASK.cpp | 91 ++++++++++++------------ src/modules/modem/digital/ModemBPSK.cpp | 14 ++-- src/modules/modem/digital/ModemDPSK.cpp | 91 ++++++++++++------------ src/modules/modem/digital/ModemOOK.cpp | 14 ++-- src/modules/modem/digital/ModemPSK.cpp | 91 ++++++++++++------------ src/modules/modem/digital/ModemQAM.cpp | 92 ++++++++++++------------- src/modules/modem/digital/ModemQPSK.cpp | 14 ++-- src/modules/modem/digital/ModemSQAM.cpp | 91 ++++++++++++------------ src/modules/modem/digital/ModemST.cpp | 15 ++-- 11 files changed, 239 insertions(+), 287 deletions(-) diff --git a/src/modules/modem/ModemDigital.h b/src/modules/modem/ModemDigital.h index 9768207..2c0809f 100644 --- a/src/modules/modem/ModemDigital.h +++ b/src/modules/modem/ModemDigital.h @@ -29,9 +29,7 @@ protected: std::atomic_int demodulatorCons; bool currentDemodLock; int currentDemodCons; - - int bufSize; - + // std::vector demodOutputDataDigitalTest; // std::vector demodOutputSoftbits; // std::vector demodOutputSoftbitsTest; diff --git a/src/modules/modem/digital/ModemAPSK.cpp b/src/modules/modem/digital/ModemAPSK.cpp index b66259e..9f27f98 100644 --- a/src/modules/modem/digital/ModemAPSK.cpp +++ b/src/modules/modem/digital/ModemAPSK.cpp @@ -26,9 +26,6 @@ ModemAPSK::~ModemAPSK() { } void ModemAPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { -/* - case DEMOD_TYPE_APSK: - switch (demodulatorCons.load()) { case 2: demodAPSK = demodAPSK4; @@ -67,10 +64,8 @@ void ModemAPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput * break; } - for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodAPSK, inp->data[i], &demodOutputDataDigital[i]); + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { + modem_demodulate(demodAPSK, input->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodAPSK, 0.005f); - break; -*/ } diff --git a/src/modules/modem/digital/ModemASK.cpp b/src/modules/modem/digital/ModemASK.cpp index 72c842a..2119406 100644 --- a/src/modules/modem/digital/ModemASK.cpp +++ b/src/modules/modem/digital/ModemASK.cpp @@ -27,52 +27,47 @@ ModemASK::~ModemASK() { } void ModemASK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - -/* -case DEMOD_TYPE_ASK: - -switch (demodulatorCons.load()) { - case 2: - demodASK = demodASK2; - updateDemodulatorCons(2); - break; - case 4: - demodASK = demodASK4; - updateDemodulatorCons(4); - break; - case 8: - demodASK = demodASK8; - updateDemodulatorCons(8); - break; - case 16: - demodASK = demodASK16; - updateDemodulatorCons(16); - break; - case 32: - demodASK = demodASK32; - updateDemodulatorCons(32); - break; - case 64: - demodASK = demodASK64; - updateDemodulatorCons(64); - break; - case 128: - demodASK = demodASK128; - updateDemodulatorCons(128); - break; - case 256: - demodASK = demodASK256; - updateDemodulatorCons(256); - break; - default: - demodASK = demodASK2; - break; -} - -for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodASK, inp->data[i], &demodOutputDataDigital[i]); -} -updateDemodulatorLock(demodASK, 0.005f); -break; -*/ + + switch (demodulatorCons.load()) { + case 2: + demodASK = demodASK2; + updateDemodulatorCons(2); + break; + case 4: + demodASK = demodASK4; + updateDemodulatorCons(4); + break; + case 8: + demodASK = demodASK8; + updateDemodulatorCons(8); + break; + case 16: + demodASK = demodASK16; + updateDemodulatorCons(16); + break; + case 32: + demodASK = demodASK32; + updateDemodulatorCons(32); + break; + case 64: + demodASK = demodASK64; + updateDemodulatorCons(64); + break; + case 128: + demodASK = demodASK128; + updateDemodulatorCons(128); + break; + case 256: + demodASK = demodASK256; + updateDemodulatorCons(256); + break; + default: + demodASK = demodASK2; + break; + } + + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { + modem_demodulate(demodASK, input->data[i], &demodOutputDataDigital[i]); + } + updateDemodulatorLock(demodASK, 0.005f); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemBPSK.cpp b/src/modules/modem/digital/ModemBPSK.cpp index b4ce0aa..51dea63 100644 --- a/src/modules/modem/digital/ModemBPSK.cpp +++ b/src/modules/modem/digital/ModemBPSK.cpp @@ -2,7 +2,7 @@ ModemBPSK::ModemBPSK() { demodBPSK = modem_create(LIQUID_MODEM_BPSK); - + } Modem *ModemBPSK::factory() { @@ -14,12 +14,8 @@ ModemBPSK::~ModemBPSK() { } void ModemBPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { -/* -case DEMOD_TYPE_BPSK: -for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodBPSK, inp->data[i], &demodOutputDataDigital[i]); -} -updateDemodulatorLock(demodBPSK, 0.005f); -break; -*/ + for (int i = 0, bufSize=input->data.size(); i < bufSize; i++) { + modem_demodulate(demodBPSK, input->data[i], &demodOutputDataDigital[i]); + } + updateDemodulatorLock(demodBPSK, 0.005f); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemDPSK.cpp b/src/modules/modem/digital/ModemDPSK.cpp index 3c05329..7a12b3e 100644 --- a/src/modules/modem/digital/ModemDPSK.cpp +++ b/src/modules/modem/digital/ModemDPSK.cpp @@ -28,52 +28,47 @@ ModemDPSK::~ModemDPSK() { } void ModemDPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - -/* -case DEMOD_TYPE_DPSK: - -switch (demodulatorCons.load()) { - case 2: - demodDPSK = demodDPSK2; - updateDemodulatorCons(2); - break; - case 4: - demodDPSK = demodDPSK4; - updateDemodulatorCons(4); - break; - case 8: - demodDPSK = demodDPSK8; - updateDemodulatorCons(8); - break; - case 16: - demodDPSK = demodDPSK16; - updateDemodulatorCons(16); - break; - case 32: - demodDPSK = demodDPSK32; - updateDemodulatorCons(32); - break; - case 64: - demodDPSK = demodDPSK64; - updateDemodulatorCons(64); - break; - case 128: - demodDPSK = demodDPSK128; - updateDemodulatorCons(128); - break; - case 256: - demodDPSK = demodDPSK256; - updateDemodulatorCons(256); - break; - default: - demodDPSK = demodDPSK2; - break; -} - -for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodDPSK, inp->data[i], &demodOutputDataDigital[i]); -} -updateDemodulatorLock(demodDPSK, 0.005f); -break; -*/ + + switch (demodulatorCons.load()) { + case 2: + demodDPSK = demodDPSK2; + updateDemodulatorCons(2); + break; + case 4: + demodDPSK = demodDPSK4; + updateDemodulatorCons(4); + break; + case 8: + demodDPSK = demodDPSK8; + updateDemodulatorCons(8); + break; + case 16: + demodDPSK = demodDPSK16; + updateDemodulatorCons(16); + break; + case 32: + demodDPSK = demodDPSK32; + updateDemodulatorCons(32); + break; + case 64: + demodDPSK = demodDPSK64; + updateDemodulatorCons(64); + break; + case 128: + demodDPSK = demodDPSK128; + updateDemodulatorCons(128); + break; + case 256: + demodDPSK = demodDPSK256; + updateDemodulatorCons(256); + break; + default: + demodDPSK = demodDPSK2; + break; + } + + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { + modem_demodulate(demodDPSK, input->data[i], &demodOutputDataDigital[i]); + } + updateDemodulatorLock(demodDPSK, 0.005f); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemOOK.cpp b/src/modules/modem/digital/ModemOOK.cpp index b8c825b..b8a8025 100644 --- a/src/modules/modem/digital/ModemOOK.cpp +++ b/src/modules/modem/digital/ModemOOK.cpp @@ -13,13 +13,9 @@ ModemOOK::~ModemOOK() { } void ModemOOK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - -/* -case DEMOD_TYPE_OOK: -for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodOOK, inp->data[i], &demodOutputDataDigital[i]); -} -updateDemodulatorLock(demodOOK, 0.005f); -break; -*/ + + for (int i = 0, bufSize=input->data.size(); i < bufSize; i++) { + modem_demodulate(demodOOK, input->data[i], &demodOutputDataDigital[i]); + } + updateDemodulatorLock(demodOOK, 0.005f); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemPSK.cpp b/src/modules/modem/digital/ModemPSK.cpp index 1609d54..33ca3cd 100644 --- a/src/modules/modem/digital/ModemPSK.cpp +++ b/src/modules/modem/digital/ModemPSK.cpp @@ -29,52 +29,47 @@ ModemPSK::~ModemPSK() { } void ModemPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - -/* -case DEMOD_TYPE_PSK: - -switch (demodulatorCons.load()) { - case 2: - demodPSK = demodPSK2; - updateDemodulatorCons(2); - break; - case 4: - demodPSK = demodPSK4; - updateDemodulatorCons(4); - break; - case 8: - demodPSK = demodPSK8; - updateDemodulatorCons(8); - break; - case 16: - demodPSK = demodPSK16; - updateDemodulatorCons(16); - break; - case 32: - demodPSK = demodPSK32; - updateDemodulatorCons(32); - break; - case 64: - demodPSK = demodPSK64; - updateDemodulatorCons(64); - break; - case 128: - demodPSK = demodPSK128; - updateDemodulatorCons(128); - break; - case 256: - demodPSK = demodPSK256; - updateDemodulatorCons(256); - break; - default: - demodPSK = demodPSK2; - break; -} - -for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodPSK, inp->data[i], &demodOutputDataDigital[i]); -} -updateDemodulatorLock(demodPSK, 0.005f); -break; -*/ + + switch (demodulatorCons.load()) { + case 2: + demodPSK = demodPSK2; + updateDemodulatorCons(2); + break; + case 4: + demodPSK = demodPSK4; + updateDemodulatorCons(4); + break; + case 8: + demodPSK = demodPSK8; + updateDemodulatorCons(8); + break; + case 16: + demodPSK = demodPSK16; + updateDemodulatorCons(16); + break; + case 32: + demodPSK = demodPSK32; + updateDemodulatorCons(32); + break; + case 64: + demodPSK = demodPSK64; + updateDemodulatorCons(64); + break; + case 128: + demodPSK = demodPSK128; + updateDemodulatorCons(128); + break; + case 256: + demodPSK = demodPSK256; + updateDemodulatorCons(256); + break; + default: + demodPSK = demodPSK2; + break; + } + + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { + modem_demodulate(demodPSK, input->data[i], &demodOutputDataDigital[i]); + } + updateDemodulatorLock(demodPSK, 0.005f); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemQAM.cpp b/src/modules/modem/digital/ModemQAM.cpp index d6be0bb..4790cad 100644 --- a/src/modules/modem/digital/ModemQAM.cpp +++ b/src/modules/modem/digital/ModemQAM.cpp @@ -26,52 +26,48 @@ ModemQAM::~ModemQAM() { } void ModemQAM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - -/* -case DEMOD_TYPE_QAM: - -switch (demodulatorCons.load()) { - case 2: - demodQAM = demodQAM4; - updateDemodulatorCons(4); - break; - case 4: - demodQAM = demodQAM4; - updateDemodulatorCons(4); - break; - case 8: - demodQAM = demodQAM8; - updateDemodulatorCons(8); - break; - case 16: - demodQAM = demodQAM16; - updateDemodulatorCons(16); - break; - case 32: - demodQAM = demodQAM32; - updateDemodulatorCons(32); - break; - case 64: - demodQAM = demodQAM64; - updateDemodulatorCons(64); - break; - case 128: - demodQAM = demodQAM128; - updateDemodulatorCons(128); - break; - case 256: - demodQAM = demodQAM256; - updateDemodulatorCons(256); - break; - default: - demodQAM = demodQAM4; - break; -} - -for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodQAM, inp->data[i], &demodOutputDataDigital[i]); -} -updateDemodulatorLock(demodQAM, 0.5f); -break; -*/ + + + switch (demodulatorCons.load()) { + case 2: + demodQAM = demodQAM4; + updateDemodulatorCons(4); + break; + case 4: + demodQAM = demodQAM4; + updateDemodulatorCons(4); + break; + case 8: + demodQAM = demodQAM8; + updateDemodulatorCons(8); + break; + case 16: + demodQAM = demodQAM16; + updateDemodulatorCons(16); + break; + case 32: + demodQAM = demodQAM32; + updateDemodulatorCons(32); + break; + case 64: + demodQAM = demodQAM64; + updateDemodulatorCons(64); + break; + case 128: + demodQAM = demodQAM128; + updateDemodulatorCons(128); + break; + case 256: + demodQAM = demodQAM256; + updateDemodulatorCons(256); + break; + default: + demodQAM = demodQAM4; + break; + } + + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { + modem_demodulate(demodQAM, input->data[i], &demodOutputDataDigital[i]); + } + updateDemodulatorLock(demodQAM, 0.5f); } diff --git a/src/modules/modem/digital/ModemQPSK.cpp b/src/modules/modem/digital/ModemQPSK.cpp index 50ab626..f316f04 100644 --- a/src/modules/modem/digital/ModemQPSK.cpp +++ b/src/modules/modem/digital/ModemQPSK.cpp @@ -13,13 +13,9 @@ ModemQPSK::~ModemQPSK() { } void ModemQPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - -/* -case DEMOD_TYPE_QPSK: -for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodQPSK, inp->data[i], &demodOutputDataDigital[i]); -} -updateDemodulatorLock(demodQPSK, 0.8f); -break; -*/ + + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { + modem_demodulate(demodQPSK, input->data[i], &demodOutputDataDigital[i]); + } + updateDemodulatorLock(demodQPSK, 0.8f); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemSQAM.cpp b/src/modules/modem/digital/ModemSQAM.cpp index 4dc7045..8c68dff 100644 --- a/src/modules/modem/digital/ModemSQAM.cpp +++ b/src/modules/modem/digital/ModemSQAM.cpp @@ -16,52 +16,47 @@ ModemSQAM::~ModemSQAM() { } void ModemSQAM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - -/* -case DEMOD_TYPE_SQAM: - -switch (demodulatorCons.load()) { - case 2: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 4: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 8: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 16: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 32: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 64: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 128: - demodSQAM = demodSQAM128; - updateDemodulatorCons(128); - break; - case 256: - demodSQAM = demodSQAM128; - updateDemodulatorCons(128); - break; - default: - demodSQAM = demodSQAM32; - break; -} - -for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodSQAM, inp->data[i], &demodOutputDataDigital[i]); -} -updateDemodulatorLock(demodSQAM, 0.005f); -break; -*/ + + switch (demodulatorCons.load()) { + case 2: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 4: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 8: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 16: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 32: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 64: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 128: + demodSQAM = demodSQAM128; + updateDemodulatorCons(128); + break; + case 256: + demodSQAM = demodSQAM128; + updateDemodulatorCons(128); + break; + default: + demodSQAM = demodSQAM32; + break; + } + + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { + modem_demodulate(demodSQAM, input->data[i], &demodOutputDataDigital[i]); + } + updateDemodulatorLock(demodSQAM, 0.005f); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemST.cpp b/src/modules/modem/digital/ModemST.cpp index 5311352..6091c27 100644 --- a/src/modules/modem/digital/ModemST.cpp +++ b/src/modules/modem/digital/ModemST.cpp @@ -14,14 +14,9 @@ ModemST::~ModemST() { } void ModemST::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - -/* -case DEMOD_TYPE_ST: -for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodST, inp->data[i], &demodOutputDataDigital[i]); -} -updateDemodulatorLock(demodST, 0.005f); -break; - -*/ + + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { + modem_demodulate(demodST, input->data[i], &demodOutputDataDigital[i]); + } + updateDemodulatorLock(demodST, 0.005f); } \ No newline at end of file From 94f94fa7dc21066d84db05e075cdeb3e863dc449 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 18 Nov 2015 21:33:52 -0500 Subject: [PATCH 14/28] modem init order fix --- src/modules/modem/digital/ModemPSK.cpp | 3 +-- src/modules/modem/digital/ModemSQAM.cpp | 2 +- src/modules/modem/digital/ModemST.cpp | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/modules/modem/digital/ModemPSK.cpp b/src/modules/modem/digital/ModemPSK.cpp index 33ca3cd..3a75f14 100644 --- a/src/modules/modem/digital/ModemPSK.cpp +++ b/src/modules/modem/digital/ModemPSK.cpp @@ -1,8 +1,6 @@ #include "ModemPSK.h" ModemPSK::ModemPSK() { - - demodPSK = demodPSK2; demodPSK2 = modem_create(LIQUID_MODEM_PSK2); demodPSK4 = modem_create(LIQUID_MODEM_PSK4); demodPSK8 = modem_create(LIQUID_MODEM_PSK8); @@ -11,6 +9,7 @@ ModemPSK::ModemPSK() { demodPSK64 = modem_create(LIQUID_MODEM_PSK64); demodPSK128 = modem_create(LIQUID_MODEM_PSK128); demodPSK256 = modem_create(LIQUID_MODEM_PSK256); + demodPSK = demodPSK2; } Modem *ModemPSK::factory() { diff --git a/src/modules/modem/digital/ModemSQAM.cpp b/src/modules/modem/digital/ModemSQAM.cpp index 8c68dff..3721bea 100644 --- a/src/modules/modem/digital/ModemSQAM.cpp +++ b/src/modules/modem/digital/ModemSQAM.cpp @@ -1,9 +1,9 @@ #include "ModemSQAM.h" ModemSQAM::ModemSQAM() { - demodSQAM = demodSQAM32; demodSQAM32 = modem_create(LIQUID_MODEM_SQAM32); demodSQAM128 = modem_create(LIQUID_MODEM_SQAM128); + demodSQAM = demodSQAM32; } Modem *ModemSQAM::factory() { diff --git a/src/modules/modem/digital/ModemST.cpp b/src/modules/modem/digital/ModemST.cpp index 6091c27..480a215 100644 --- a/src/modules/modem/digital/ModemST.cpp +++ b/src/modules/modem/digital/ModemST.cpp @@ -8,7 +8,6 @@ Modem *ModemST::factory() { return new ModemST; } - ModemST::~ModemST() { modem_destroy(demodST); } From f43abdddaf53e7776271dd049c6468203b481431 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 18 Nov 2015 22:57:31 -0500 Subject: [PATCH 15/28] updateDemodulatorCons() cleanup --- src/modules/modem/ModemDigital.cpp | 53 +++++++------- src/modules/modem/ModemDigital.h | 18 ++--- src/modules/modem/digital/ModemAPSK.cpp | 90 ++++++++++++++---------- src/modules/modem/digital/ModemAPSK.h | 1 + src/modules/modem/digital/ModemASK.cpp | 15 ++++ src/modules/modem/digital/ModemASK.h | 1 + src/modules/modem/digital/ModemBPSK.cpp | 12 +++- src/modules/modem/digital/ModemBPSK.h | 1 + src/modules/modem/digital/ModemDPSK.cpp | 93 ++++++++++++++----------- src/modules/modem/digital/ModemDPSK.h | 1 + src/modules/modem/digital/ModemOOK.cpp | 13 +++- src/modules/modem/digital/ModemOOK.h | 1 + src/modules/modem/digital/ModemPSK.cpp | 91 +++++++++++++----------- src/modules/modem/digital/ModemPSK.h | 1 + src/modules/modem/digital/ModemQAM.cpp | 93 ++++++++++++++----------- src/modules/modem/digital/ModemQAM.h | 1 + src/modules/modem/digital/ModemQPSK.cpp | 12 +++- src/modules/modem/digital/ModemQPSK.h | 1 + src/modules/modem/digital/ModemSQAM.cpp | 91 +++++++++++++----------- src/modules/modem/digital/ModemSQAM.h | 1 + src/modules/modem/digital/ModemST.cpp | 12 +++- src/modules/modem/digital/ModemST.h | 1 + 22 files changed, 368 insertions(+), 235 deletions(-) diff --git a/src/modules/modem/ModemDigital.cpp b/src/modules/modem/ModemDigital.cpp index 9a73695..f24baa4 100644 --- a/src/modules/modem/ModemDigital.cpp +++ b/src/modules/modem/ModemDigital.cpp @@ -2,8 +2,9 @@ ModemDigital::ModemDigital() { demodulatorCons.store(2); - currentDemodCons = 0; - currentDemodLock = false; + // Reset demodulator Constellations & Lock + updateDemodulatorCons(0); + currentDemodLock.store(false); } ModemKit *ModemDigital::buildKit(long long sampleRate, int audioSampleRate) { @@ -23,11 +24,11 @@ void ModemDigital::disposeKit(ModemKit *kit) { void ModemDigital::setDemodulatorLock(bool demod_lock_in) { - demod_lock_in ? currentDemodLock = true : currentDemodLock = false; + currentDemodLock.store(demod_lock_in); } int ModemDigital::getDemodulatorLock() { - return currentDemodLock; + return currentDemodLock.load(); } void ModemDigital::setDemodulatorCons(int demod_cons_in) { @@ -35,36 +36,36 @@ void ModemDigital::setDemodulatorCons(int demod_cons_in) { } int ModemDigital::getDemodulatorCons() { - return currentDemodCons; + return currentDemodCons.load(); } -void ModemDigital::updateDemodulatorLock(modem demod, float sensitivity) { - modem_get_demodulator_evm(demod) <= sensitivity ? setDemodulatorLock(true) : setDemodulatorLock(false); +void ModemDigital::updateDemodulatorLock(modem mod, float sensitivity) { + modem_get_demodulator_evm(mod) <= sensitivity ? setDemodulatorLock(true) : setDemodulatorLock(false); } -void ModemDigital::updateDemodulatorCons(int Cons) { - if (currentDemodCons != Cons) { - currentDemodCons = Cons; +void ModemDigital::updateDemodulatorCons(int cons) { + if (currentDemodCons.load() != cons) { + currentDemodCons = cons; } } - -// Demodulate -/* - // Reset demodulator Constellations & Lock - // updateDemodulatorCons(0); - -{ - switch (demodulatorType.load()) { - // advanced demodulators - - } +void ModemDigital::digitalStart(ModemKitDigital *kit, modem mod, ModemIQData *input) { + int bufSize = input->data.size(); + + if (demodOutputDataDigital.size() != bufSize) { + if (demodOutputDataDigital.capacity() < bufSize) { + demodOutputDataDigital.reserve(bufSize); + } + demodOutputDataDigital.resize(bufSize); + } + + if (demodulatorCons.load() != currentDemodCons.load()) { + updateDemodulatorCons(demodulatorCons.load()); + currentDemodLock.store(false); + } } - +void ModemDigital::digitalFinish(ModemKitDigital *kit, modem mod) { + demodOutputDataDigital.empty(); } - // demodOutputDataDigital.empty(); - - - */ diff --git a/src/modules/modem/ModemDigital.h b/src/modules/modem/ModemDigital.h index 2c0809f..de427cc 100644 --- a/src/modules/modem/ModemDigital.h +++ b/src/modules/modem/ModemDigital.h @@ -14,21 +14,23 @@ public: ModemDigital(); ModemKit *buildKit(long long sampleRate, int audioSampleRate); void disposeKit(ModemKit *kit); + void digitalStart(ModemKitDigital *kit, modem mod, ModemIQData *input); + void digitalFinish(ModemKitDigital *kit, modem mod); - void setDemodulatorLock(bool demod_lock_in); - int getDemodulatorLock(); + virtual void setDemodulatorLock(bool demod_lock_in); + virtual int getDemodulatorLock(); - void setDemodulatorCons(int demod_cons_in); - int getDemodulatorCons(); + virtual void setDemodulatorCons(int demod_cons_in); + virtual int getDemodulatorCons(); - void updateDemodulatorCons(int Cons); - void updateDemodulatorLock(modem demod, float sensitivity); + virtual void updateDemodulatorCons(int cons); + virtual void updateDemodulatorLock(modem mod, float sensitivity); protected: std::vector demodOutputDataDigital; std::atomic_int demodulatorCons; - bool currentDemodLock; - int currentDemodCons; + std::atomic_bool currentDemodLock; + std::atomic_int currentDemodCons; // std::vector demodOutputDataDigitalTest; // std::vector demodOutputSoftbits; diff --git a/src/modules/modem/digital/ModemAPSK.cpp b/src/modules/modem/digital/ModemAPSK.cpp index 9f27f98..65e2189 100644 --- a/src/modules/modem/digital/ModemAPSK.cpp +++ b/src/modules/modem/digital/ModemAPSK.cpp @@ -8,7 +8,9 @@ ModemAPSK::ModemAPSK() { demodAPSK64 = modem_create(LIQUID_MODEM_APSK64); demodAPSK128 = modem_create(LIQUID_MODEM_APSK128); demodAPSK256 = modem_create(LIQUID_MODEM_APSK256); - demodAPSK = demodAPSK4; + demodulatorCons.store(4); + currentDemodCons.store(0); + updateDemodulatorCons(4); } Modem *ModemAPSK::factory() { @@ -25,47 +27,59 @@ ModemAPSK::~ModemAPSK() { modem_destroy(demodAPSK256); } -void ModemAPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - switch (demodulatorCons.load()) { - case 2: - demodAPSK = demodAPSK4; - updateDemodulatorCons(4); - break; - case 4: - demodAPSK = demodAPSK4; - updateDemodulatorCons(4); - break; - case 8: - demodAPSK = demodAPSK8; - updateDemodulatorCons(8); - break; - case 16: - demodAPSK = demodAPSK16; - updateDemodulatorCons(16); - break; - case 32: - demodAPSK = demodAPSK32; - updateDemodulatorCons(32); - break; - case 64: - demodAPSK = demodAPSK64; - updateDemodulatorCons(64); - break; - case 128: - demodAPSK = demodAPSK128; - updateDemodulatorCons(128); - break; - case 256: - demodAPSK = demodAPSK256; - updateDemodulatorCons(256); - break; - default: - demodAPSK = demodAPSK4; - break; +void ModemAPSK::updateDemodulatorCons(int cons) { + if (currentDemodCons.load() != cons) { + currentDemodCons = cons; + switch (demodulatorCons.load()) { + case 2: + demodAPSK = demodAPSK4; + updateDemodulatorCons(4); + break; + case 4: + demodAPSK = demodAPSK4; + updateDemodulatorCons(4); + break; + case 8: + demodAPSK = demodAPSK8; + updateDemodulatorCons(8); + break; + case 16: + demodAPSK = demodAPSK16; + updateDemodulatorCons(16); + break; + case 32: + demodAPSK = demodAPSK32; + updateDemodulatorCons(32); + break; + case 64: + demodAPSK = demodAPSK64; + updateDemodulatorCons(64); + break; + case 128: + demodAPSK = demodAPSK128; + updateDemodulatorCons(128); + break; + case 256: + demodAPSK = demodAPSK256; + updateDemodulatorCons(256); + break; + default: + demodAPSK = demodAPSK4; + break; + } } +} + +void ModemAPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitDigital *dkit = (ModemKitDigital *)kit; + + digitalStart(dkit, demodAPSK, input); for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { modem_demodulate(demodAPSK, input->data[i], &demodOutputDataDigital[i]); } + updateDemodulatorLock(demodAPSK, 0.005f); + + digitalFinish(dkit, demodAPSK); } diff --git a/src/modules/modem/digital/ModemAPSK.h b/src/modules/modem/digital/ModemAPSK.h index 475b043..003bcfe 100644 --- a/src/modules/modem/digital/ModemAPSK.h +++ b/src/modules/modem/digital/ModemAPSK.h @@ -6,6 +6,7 @@ public: ModemAPSK(); ~ModemAPSK(); Modem *factory(); + void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); private: diff --git a/src/modules/modem/digital/ModemASK.cpp b/src/modules/modem/digital/ModemASK.cpp index 2119406..2888f6e 100644 --- a/src/modules/modem/digital/ModemASK.cpp +++ b/src/modules/modem/digital/ModemASK.cpp @@ -10,6 +10,9 @@ ModemASK::ModemASK() { demodASK128 = modem_create(LIQUID_MODEM_ASK128); demodASK256 = modem_create(LIQUID_MODEM_ASK256); demodASK = demodASK2; + demodulatorCons.store(2); + currentDemodCons.store(0); + updateDemodulatorCons(2); } Modem *ModemASK::factory() { @@ -26,7 +29,15 @@ ModemASK::~ModemASK() { modem_destroy(demodASK256); } +void ModemASK::updateDemodulatorCons(int cons) { + if (currentDemodCons.load() != cons) { + currentDemodCons = cons; + + } +} + void ModemASK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitDigital *dkit = (ModemKitDigital *)kit; switch (demodulatorCons.load()) { case 2: @@ -66,8 +77,12 @@ void ModemASK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *a break; } + digitalStart(dkit, demodASK, input); + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { modem_demodulate(demodASK, input->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodASK, 0.005f); + + digitalFinish(dkit, demodASK); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemASK.h b/src/modules/modem/digital/ModemASK.h index 090d2c3..a32fc6e 100644 --- a/src/modules/modem/digital/ModemASK.h +++ b/src/modules/modem/digital/ModemASK.h @@ -6,6 +6,7 @@ public: ModemASK(); ~ModemASK(); Modem *factory(); + void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); private: diff --git a/src/modules/modem/digital/ModemBPSK.cpp b/src/modules/modem/digital/ModemBPSK.cpp index 51dea63..d7339d3 100644 --- a/src/modules/modem/digital/ModemBPSK.cpp +++ b/src/modules/modem/digital/ModemBPSK.cpp @@ -2,7 +2,6 @@ ModemBPSK::ModemBPSK() { demodBPSK = modem_create(LIQUID_MODEM_BPSK); - } Modem *ModemBPSK::factory() { @@ -13,9 +12,20 @@ ModemBPSK::~ModemBPSK() { modem_destroy(demodBPSK); } +void ModemBPSK::updateDemodulatorCons(int cons) { + if (currentDemodCons.load() != cons) { + currentDemodCons = cons; + } +} + void ModemBPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitDigital *dkit = (ModemKitDigital *)kit; + digitalStart(dkit, demodBPSK, input); + for (int i = 0, bufSize=input->data.size(); i < bufSize; i++) { modem_demodulate(demodBPSK, input->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodBPSK, 0.005f); + + digitalFinish(dkit, demodBPSK); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemBPSK.h b/src/modules/modem/digital/ModemBPSK.h index a454170..be28c16 100644 --- a/src/modules/modem/digital/ModemBPSK.h +++ b/src/modules/modem/digital/ModemBPSK.h @@ -6,6 +6,7 @@ public: ModemBPSK(); ~ModemBPSK(); Modem *factory(); + void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); private: diff --git a/src/modules/modem/digital/ModemDPSK.cpp b/src/modules/modem/digital/ModemDPSK.cpp index 7a12b3e..07e49f5 100644 --- a/src/modules/modem/digital/ModemDPSK.cpp +++ b/src/modules/modem/digital/ModemDPSK.cpp @@ -9,7 +9,9 @@ ModemDPSK::ModemDPSK() { demodDPSK64 = modem_create(LIQUID_MODEM_DPSK64); demodDPSK128 = modem_create(LIQUID_MODEM_DPSK128); demodDPSK256 = modem_create(LIQUID_MODEM_DPSK256); - demodDPSK = demodDPSK2; + demodulatorCons.store(2); + currentDemodCons.store(0); + updateDemodulatorCons(2); } Modem *ModemDPSK::factory() { @@ -27,48 +29,59 @@ ModemDPSK::~ModemDPSK() { modem_destroy(demodDPSK256); } -void ModemDPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - - switch (demodulatorCons.load()) { - case 2: - demodDPSK = demodDPSK2; - updateDemodulatorCons(2); - break; - case 4: - demodDPSK = demodDPSK4; - updateDemodulatorCons(4); - break; - case 8: - demodDPSK = demodDPSK8; - updateDemodulatorCons(8); - break; - case 16: - demodDPSK = demodDPSK16; - updateDemodulatorCons(16); - break; - case 32: - demodDPSK = demodDPSK32; - updateDemodulatorCons(32); - break; - case 64: - demodDPSK = demodDPSK64; - updateDemodulatorCons(64); - break; - case 128: - demodDPSK = demodDPSK128; - updateDemodulatorCons(128); - break; - case 256: - demodDPSK = demodDPSK256; - updateDemodulatorCons(256); - break; - default: - demodDPSK = demodDPSK2; - break; +void ModemDPSK::updateDemodulatorCons(int cons) { + if (currentDemodCons.load() != cons) { + currentDemodCons = cons; + + switch (demodulatorCons.load()) { + case 2: + demodDPSK = demodDPSK2; + updateDemodulatorCons(2); + break; + case 4: + demodDPSK = demodDPSK4; + updateDemodulatorCons(4); + break; + case 8: + demodDPSK = demodDPSK8; + updateDemodulatorCons(8); + break; + case 16: + demodDPSK = demodDPSK16; + updateDemodulatorCons(16); + break; + case 32: + demodDPSK = demodDPSK32; + updateDemodulatorCons(32); + break; + case 64: + demodDPSK = demodDPSK64; + updateDemodulatorCons(64); + break; + case 128: + demodDPSK = demodDPSK128; + updateDemodulatorCons(128); + break; + case 256: + demodDPSK = demodDPSK256; + updateDemodulatorCons(256); + break; + default: + demodDPSK = demodDPSK2; + break; + } } - +} + +void ModemDPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitDigital *dkit = (ModemKitDigital *)kit; + + digitalStart(dkit, demodDPSK, input); + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { modem_demodulate(demodDPSK, input->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodDPSK, 0.005f); + + digitalFinish(dkit, demodDPSK); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemDPSK.h b/src/modules/modem/digital/ModemDPSK.h index a3f188b..00b115d 100644 --- a/src/modules/modem/digital/ModemDPSK.h +++ b/src/modules/modem/digital/ModemDPSK.h @@ -6,6 +6,7 @@ public: ModemDPSK(); ~ModemDPSK(); Modem *factory(); + void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); private: diff --git a/src/modules/modem/digital/ModemOOK.cpp b/src/modules/modem/digital/ModemOOK.cpp index b8a8025..87b6d48 100644 --- a/src/modules/modem/digital/ModemOOK.cpp +++ b/src/modules/modem/digital/ModemOOK.cpp @@ -12,10 +12,21 @@ ModemOOK::~ModemOOK() { modem_destroy(demodOOK); } + +void ModemOOK::updateDemodulatorCons(int cons) { + if (currentDemodCons.load() != cons) { + currentDemodCons = cons; + } +} + void ModemOOK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - + ModemKitDigital *dkit = (ModemKitDigital *)kit; + digitalStart(dkit, demodOOK, input); + for (int i = 0, bufSize=input->data.size(); i < bufSize; i++) { modem_demodulate(demodOOK, input->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodOOK, 0.005f); + + digitalFinish(dkit, demodOOK); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemOOK.h b/src/modules/modem/digital/ModemOOK.h index 9af2837..5bc7731 100644 --- a/src/modules/modem/digital/ModemOOK.h +++ b/src/modules/modem/digital/ModemOOK.h @@ -6,6 +6,7 @@ public: ModemOOK(); ~ModemOOK(); Modem *factory(); + void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); private: diff --git a/src/modules/modem/digital/ModemPSK.cpp b/src/modules/modem/digital/ModemPSK.cpp index 3a75f14..3d391cd 100644 --- a/src/modules/modem/digital/ModemPSK.cpp +++ b/src/modules/modem/digital/ModemPSK.cpp @@ -9,7 +9,9 @@ ModemPSK::ModemPSK() { demodPSK64 = modem_create(LIQUID_MODEM_PSK64); demodPSK128 = modem_create(LIQUID_MODEM_PSK128); demodPSK256 = modem_create(LIQUID_MODEM_PSK256); - demodPSK = demodPSK2; + demodulatorCons.store(2); + currentDemodCons.store(0); + updateDemodulatorCons(2); } Modem *ModemPSK::factory() { @@ -27,48 +29,59 @@ ModemPSK::~ModemPSK() { modem_destroy(demodPSK256); } -void ModemPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - - switch (demodulatorCons.load()) { - case 2: - demodPSK = demodPSK2; - updateDemodulatorCons(2); - break; - case 4: - demodPSK = demodPSK4; - updateDemodulatorCons(4); - break; - case 8: - demodPSK = demodPSK8; - updateDemodulatorCons(8); - break; - case 16: - demodPSK = demodPSK16; - updateDemodulatorCons(16); - break; - case 32: - demodPSK = demodPSK32; - updateDemodulatorCons(32); - break; - case 64: - demodPSK = demodPSK64; - updateDemodulatorCons(64); - break; - case 128: - demodPSK = demodPSK128; - updateDemodulatorCons(128); - break; - case 256: - demodPSK = demodPSK256; - updateDemodulatorCons(256); - break; - default: - demodPSK = demodPSK2; - break; +void ModemPSK::updateDemodulatorCons(int cons) { + if (currentDemodCons.load() != cons) { + currentDemodCons = cons; + + switch (demodulatorCons.load()) { + case 2: + demodPSK = demodPSK2; + updateDemodulatorCons(2); + break; + case 4: + demodPSK = demodPSK4; + updateDemodulatorCons(4); + break; + case 8: + demodPSK = demodPSK8; + updateDemodulatorCons(8); + break; + case 16: + demodPSK = demodPSK16; + updateDemodulatorCons(16); + break; + case 32: + demodPSK = demodPSK32; + updateDemodulatorCons(32); + break; + case 64: + demodPSK = demodPSK64; + updateDemodulatorCons(64); + break; + case 128: + demodPSK = demodPSK128; + updateDemodulatorCons(128); + break; + case 256: + demodPSK = demodPSK256; + updateDemodulatorCons(256); + break; + default: + demodPSK = demodPSK2; + break; + } } +} + +void ModemPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitDigital *dkit = (ModemKitDigital *)kit; + + digitalStart(dkit, demodPSK, input); for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { modem_demodulate(demodPSK, input->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodPSK, 0.005f); + + digitalFinish(dkit, demodPSK); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemPSK.h b/src/modules/modem/digital/ModemPSK.h index 5cbc68c..d1818fc 100644 --- a/src/modules/modem/digital/ModemPSK.h +++ b/src/modules/modem/digital/ModemPSK.h @@ -6,6 +6,7 @@ public: ModemPSK(); ~ModemPSK(); Modem *factory(); + void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); private: diff --git a/src/modules/modem/digital/ModemQAM.cpp b/src/modules/modem/digital/ModemQAM.cpp index 4790cad..5beea0e 100644 --- a/src/modules/modem/digital/ModemQAM.cpp +++ b/src/modules/modem/digital/ModemQAM.cpp @@ -8,7 +8,9 @@ ModemQAM::ModemQAM() { demodQAM64 = modem_create(LIQUID_MODEM_QAM64); demodQAM128 = modem_create(LIQUID_MODEM_QAM128); demodQAM256 = modem_create(LIQUID_MODEM_QAM256); - demodQAM = demodQAM4; + demodulatorCons.store(4); + currentDemodCons.store(0); + updateDemodulatorCons(4); } Modem *ModemQAM::factory() { @@ -25,49 +27,58 @@ ModemQAM::~ModemQAM() { modem_destroy(demodQAM256); } -void ModemQAM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - - - switch (demodulatorCons.load()) { - case 2: - demodQAM = demodQAM4; - updateDemodulatorCons(4); - break; - case 4: - demodQAM = demodQAM4; - updateDemodulatorCons(4); - break; - case 8: - demodQAM = demodQAM8; - updateDemodulatorCons(8); - break; - case 16: - demodQAM = demodQAM16; - updateDemodulatorCons(16); - break; - case 32: - demodQAM = demodQAM32; - updateDemodulatorCons(32); - break; - case 64: - demodQAM = demodQAM64; - updateDemodulatorCons(64); - break; - case 128: - demodQAM = demodQAM128; - updateDemodulatorCons(128); - break; - case 256: - demodQAM = demodQAM256; - updateDemodulatorCons(256); - break; - default: - demodQAM = demodQAM4; - break; +void ModemQAM::updateDemodulatorCons(int cons) { + if (currentDemodCons.load() != cons) { + currentDemodCons = cons; + + switch (demodulatorCons.load()) { + case 2: + demodQAM = demodQAM4; + updateDemodulatorCons(4); + break; + case 4: + demodQAM = demodQAM4; + updateDemodulatorCons(4); + break; + case 8: + demodQAM = demodQAM8; + updateDemodulatorCons(8); + break; + case 16: + demodQAM = demodQAM16; + updateDemodulatorCons(16); + break; + case 32: + demodQAM = demodQAM32; + updateDemodulatorCons(32); + break; + case 64: + demodQAM = demodQAM64; + updateDemodulatorCons(64); + break; + case 128: + demodQAM = demodQAM128; + updateDemodulatorCons(128); + break; + case 256: + demodQAM = demodQAM256; + updateDemodulatorCons(256); + break; + default: + demodQAM = demodQAM4; + break; + } } - +} + +void ModemQAM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitDigital *dkit = (ModemKitDigital *)kit; + digitalStart(dkit, demodQAM, input); + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { modem_demodulate(demodQAM, input->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodQAM, 0.5f); + + digitalFinish(dkit, demodQAM); } diff --git a/src/modules/modem/digital/ModemQAM.h b/src/modules/modem/digital/ModemQAM.h index 2971cb8..2780321 100644 --- a/src/modules/modem/digital/ModemQAM.h +++ b/src/modules/modem/digital/ModemQAM.h @@ -6,6 +6,7 @@ public: ModemQAM(); ~ModemQAM(); Modem *factory(); + void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); private: diff --git a/src/modules/modem/digital/ModemQPSK.cpp b/src/modules/modem/digital/ModemQPSK.cpp index f316f04..d47e998 100644 --- a/src/modules/modem/digital/ModemQPSK.cpp +++ b/src/modules/modem/digital/ModemQPSK.cpp @@ -12,10 +12,20 @@ ModemQPSK::~ModemQPSK() { modem_destroy(demodQPSK); } +void ModemQPSK::updateDemodulatorCons(int cons) { + if (currentDemodCons.load() != cons) { + currentDemodCons = cons; + } +} + void ModemQPSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - + ModemKitDigital *dkit = (ModemKitDigital *)kit; + digitalStart(dkit, demodQPSK, input); + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { modem_demodulate(demodQPSK, input->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodQPSK, 0.8f); + + digitalFinish(dkit, demodQPSK); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemQPSK.h b/src/modules/modem/digital/ModemQPSK.h index dfdd1b0..7fbd56f 100644 --- a/src/modules/modem/digital/ModemQPSK.h +++ b/src/modules/modem/digital/ModemQPSK.h @@ -6,6 +6,7 @@ public: ModemQPSK(); ~ModemQPSK(); Modem *factory(); + void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); private: diff --git a/src/modules/modem/digital/ModemSQAM.cpp b/src/modules/modem/digital/ModemSQAM.cpp index 3721bea..c8df8c7 100644 --- a/src/modules/modem/digital/ModemSQAM.cpp +++ b/src/modules/modem/digital/ModemSQAM.cpp @@ -3,7 +3,9 @@ ModemSQAM::ModemSQAM() { demodSQAM32 = modem_create(LIQUID_MODEM_SQAM32); demodSQAM128 = modem_create(LIQUID_MODEM_SQAM128); - demodSQAM = demodSQAM32; + demodulatorCons.store(32); + currentDemodCons.store(0); + updateDemodulatorCons(32); } Modem *ModemSQAM::factory() { @@ -15,48 +17,59 @@ ModemSQAM::~ModemSQAM() { modem_destroy(demodSQAM128); } -void ModemSQAM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - - switch (demodulatorCons.load()) { - case 2: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 4: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 8: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 16: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 32: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 64: - demodSQAM = demodSQAM32; - updateDemodulatorCons(32); - break; - case 128: - demodSQAM = demodSQAM128; - updateDemodulatorCons(128); - break; - case 256: - demodSQAM = demodSQAM128; - updateDemodulatorCons(128); - break; - default: - demodSQAM = demodSQAM32; - break; +void ModemSQAM::updateDemodulatorCons(int cons) { + if (currentDemodCons.load() != cons) { + currentDemodCons = cons; + + switch (demodulatorCons.load()) { + case 2: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 4: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 8: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 16: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 32: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 64: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 128: + demodSQAM = demodSQAM128; + updateDemodulatorCons(128); + break; + case 256: + demodSQAM = demodSQAM128; + updateDemodulatorCons(128); + break; + default: + demodSQAM = demodSQAM32; + break; + } } +} + +void ModemSQAM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitDigital *dkit = (ModemKitDigital *)kit; + + digitalStart(dkit, demodSQAM, input); for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { modem_demodulate(demodSQAM, input->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodSQAM, 0.005f); + + digitalFinish(dkit, demodSQAM); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemSQAM.h b/src/modules/modem/digital/ModemSQAM.h index b869547..b87c770 100644 --- a/src/modules/modem/digital/ModemSQAM.h +++ b/src/modules/modem/digital/ModemSQAM.h @@ -6,6 +6,7 @@ public: ModemSQAM(); ~ModemSQAM(); Modem *factory(); + void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); private: diff --git a/src/modules/modem/digital/ModemST.cpp b/src/modules/modem/digital/ModemST.cpp index 480a215..708063b 100644 --- a/src/modules/modem/digital/ModemST.cpp +++ b/src/modules/modem/digital/ModemST.cpp @@ -12,10 +12,20 @@ ModemST::~ModemST() { modem_destroy(demodST); } +void ModemST::updateDemodulatorCons(int cons) { + if (currentDemodCons.load() != cons) { + currentDemodCons = cons; + } +} + void ModemST::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { - + ModemKitDigital *dkit = (ModemKitDigital *)kit; + digitalStart(dkit, demodST, input); + for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { modem_demodulate(demodST, input->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodST, 0.005f); + + digitalFinish(dkit, demodST); } \ No newline at end of file diff --git a/src/modules/modem/digital/ModemST.h b/src/modules/modem/digital/ModemST.h index 380f05f..26cf358 100644 --- a/src/modules/modem/digital/ModemST.h +++ b/src/modules/modem/digital/ModemST.h @@ -6,6 +6,7 @@ public: ModemST(); ~ModemST(); Modem *factory(); + void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); private: From a6cb932ab9eab2a4b7062016f768a16992856aac Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 18 Nov 2015 23:01:56 -0500 Subject: [PATCH 16/28] ModemDigital cleanup --- src/modules/modem/ModemDigital.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/modules/modem/ModemDigital.cpp b/src/modules/modem/ModemDigital.cpp index f24baa4..ee5ba2d 100644 --- a/src/modules/modem/ModemDigital.cpp +++ b/src/modules/modem/ModemDigital.cpp @@ -1,10 +1,6 @@ #include "ModemDigital.h" ModemDigital::ModemDigital() { - demodulatorCons.store(2); - // Reset demodulator Constellations & Lock - updateDemodulatorCons(0); - currentDemodLock.store(false); } ModemKit *ModemDigital::buildKit(long long sampleRate, int audioSampleRate) { @@ -22,7 +18,6 @@ void ModemDigital::disposeKit(ModemKit *kit) { delete dkit; } - void ModemDigital::setDemodulatorLock(bool demod_lock_in) { currentDemodLock.store(demod_lock_in); } @@ -40,7 +35,7 @@ int ModemDigital::getDemodulatorCons() { } void ModemDigital::updateDemodulatorLock(modem mod, float sensitivity) { - modem_get_demodulator_evm(mod) <= sensitivity ? setDemodulatorLock(true) : setDemodulatorLock(false); + setDemodulatorLock(modem_get_demodulator_evm(mod) <= sensitivity); } void ModemDigital::updateDemodulatorCons(int cons) { From 001f4ee23b715b460c1993db2f3c86060437ef82 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 18 Nov 2015 23:06:21 -0500 Subject: [PATCH 17/28] Add digital modem factories --- src/CubicSDR.cpp | 13 ++++++++++++- src/CubicSDR.h | 12 ++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 0bf2432..5b05f19 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -171,7 +171,18 @@ bool CubicSDR::OnInit() { Modem::addModemFactory("USB", new ModemUSB); Modem::addModemFactory("DSB", new ModemDSB); Modem::addModemFactory("I/Q", new ModemIQ); - + + Modem::addModemFactory("APSK", new ModemAPSK); + Modem::addModemFactory("ASK", new ModemASK); + Modem::addModemFactory("BPSK", new ModemBPSK); + Modem::addModemFactory("DPSK", new ModemDPSK); + Modem::addModemFactory("OOK", new ModemOOK); + Modem::addModemFactory("PSK", new ModemPSK); + Modem::addModemFactory("QAM", new ModemQAM); + Modem::addModemFactory("QPSK", new ModemQPSK); + Modem::addModemFactory("SQAM", new ModemSQAM); + Modem::addModemFactory("ST", new ModemST); + frequency = wxGetApp().getConfig()->getCenterFreq(); offset = 0; ppm = 0; diff --git a/src/CubicSDR.h b/src/CubicSDR.h index 0253624..54bb4b0 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -28,6 +28,7 @@ #include "SpectrumVisualDataThread.h" #include "SDRDevices.h" #include "Modem.h" + #include "ModemFM.h" #include "ModemFMStereo.h" #include "ModemAM.h" @@ -36,6 +37,17 @@ #include "ModemDSB.h" #include "ModemIQ.h" +#include "ModemAPSK.h" +#include "ModemASK.h" +#include "ModemBPSK.h" +#include "ModemDPSK.h" +#include "ModemOOK.h" +#include "ModemPSK.h" +#include "ModemQAM.h" +#include "ModemQPSK.h" +#include "ModemSQAM.h" +#include "ModemST.h" + #include #define NUM_DEMODULATORS 1 From dfd7496175c1fea8d9847fa9165afb1f5fd2a242 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 18 Nov 2015 23:40:30 -0500 Subject: [PATCH 18/28] digital modem wrap-up and re-connect - Compiles but untested --- src/CubicSDR.cpp | 34 +++++++++++----------- src/demod/DemodulatorInstance.cpp | 26 +++++++++++++---- src/demod/DemodulatorInstance.h | 4 ++- src/demod/DemodulatorPreThread.cpp | 9 ++++++ src/demod/DemodulatorPreThread.h | 9 ++---- src/modules/modem/Modem.cpp | 4 +-- src/modules/modem/Modem.h | 6 ++-- src/modules/modem/ModemAnalog.cpp | 4 +++ src/modules/modem/ModemAnalog.h | 1 + src/modules/modem/ModemDigital.cpp | 5 ++++ src/modules/modem/ModemDigital.h | 1 + src/modules/modem/analog/ModemAM.cpp | 4 +++ src/modules/modem/analog/ModemAM.h | 1 + src/modules/modem/analog/ModemDSB.cpp | 4 +++ src/modules/modem/analog/ModemDSB.h | 1 + src/modules/modem/analog/ModemFM.cpp | 4 +++ src/modules/modem/analog/ModemFM.h | 1 + src/modules/modem/analog/ModemFMStereo.cpp | 8 +++++ src/modules/modem/analog/ModemFMStereo.h | 2 ++ src/modules/modem/analog/ModemIQ.cpp | 8 +++++ src/modules/modem/analog/ModemIQ.h | 2 ++ src/modules/modem/analog/ModemLSB.cpp | 4 +++ src/modules/modem/analog/ModemLSB.h | 1 + src/modules/modem/analog/ModemUSB.cpp | 4 +++ src/modules/modem/analog/ModemUSB.h | 1 + src/modules/modem/digital/ModemAPSK.cpp | 4 +++ src/modules/modem/digital/ModemAPSK.h | 1 + src/modules/modem/digital/ModemASK.cpp | 5 +++- src/modules/modem/digital/ModemASK.h | 1 + src/modules/modem/digital/ModemBPSK.cpp | 4 +++ src/modules/modem/digital/ModemBPSK.h | 1 + src/modules/modem/digital/ModemDPSK.cpp | 4 +++ src/modules/modem/digital/ModemDPSK.h | 1 + src/modules/modem/digital/ModemOOK.cpp | 3 ++ src/modules/modem/digital/ModemOOK.h | 1 + src/modules/modem/digital/ModemPSK.cpp | 4 +++ src/modules/modem/digital/ModemPSK.h | 1 + src/modules/modem/digital/ModemQAM.cpp | 4 +++ src/modules/modem/digital/ModemQAM.h | 1 + src/modules/modem/digital/ModemQPSK.cpp | 4 +++ src/modules/modem/digital/ModemQPSK.h | 1 + src/modules/modem/digital/ModemSQAM.cpp | 4 +++ src/modules/modem/digital/ModemSQAM.h | 1 + src/modules/modem/digital/ModemST.cpp | 4 +++ src/modules/modem/digital/ModemST.h | 1 + 45 files changed, 162 insertions(+), 36 deletions(-) diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 5b05f19..4227bdf 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -164,24 +164,24 @@ bool CubicSDR::OnInit() { wxApp::SetAppName("CubicSDR"); - Modem::addModemFactory("FM", new ModemFM); - Modem::addModemFactory("FMS", new ModemFMStereo); - Modem::addModemFactory("AM", new ModemAM); - Modem::addModemFactory("LSB", new ModemLSB); - Modem::addModemFactory("USB", new ModemUSB); - Modem::addModemFactory("DSB", new ModemDSB); - Modem::addModemFactory("I/Q", new ModemIQ); + Modem::addModemFactory(new ModemFM); + Modem::addModemFactory(new ModemFMStereo); + Modem::addModemFactory(new ModemAM); + Modem::addModemFactory(new ModemLSB); + Modem::addModemFactory(new ModemUSB); + Modem::addModemFactory(new ModemDSB); + Modem::addModemFactory(new ModemIQ); - Modem::addModemFactory("APSK", new ModemAPSK); - Modem::addModemFactory("ASK", new ModemASK); - Modem::addModemFactory("BPSK", new ModemBPSK); - Modem::addModemFactory("DPSK", new ModemDPSK); - Modem::addModemFactory("OOK", new ModemOOK); - Modem::addModemFactory("PSK", new ModemPSK); - Modem::addModemFactory("QAM", new ModemQAM); - Modem::addModemFactory("QPSK", new ModemQPSK); - Modem::addModemFactory("SQAM", new ModemSQAM); - Modem::addModemFactory("ST", new ModemST); + Modem::addModemFactory(new ModemAPSK); + Modem::addModemFactory(new ModemASK); + Modem::addModemFactory(new ModemBPSK); + Modem::addModemFactory(new ModemDPSK); + Modem::addModemFactory(new ModemOOK); + Modem::addModemFactory(new ModemPSK); + Modem::addModemFactory(new ModemQAM); + Modem::addModemFactory(new ModemQPSK); + Modem::addModemFactory(new ModemSQAM); + Modem::addModemFactory(new ModemST); frequency = wxGetApp().getConfig()->getCenterFreq(); offset = 0; diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index 3d90fa9..172e95a 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -45,7 +45,6 @@ DemodulatorInstance::DemodulatorInstance() : audioThread->setOutputQueue("NotifyQueue", pipeDemodNotify); currentDemodType = demodulatorPreThread->getParams().demodType; - currentDemodCons = demodulatorThread->getDemodulatorCons(); } DemodulatorInstance::~DemodulatorInstance() { @@ -75,7 +74,6 @@ void DemodulatorInstance::run() { currentFrequency = demodulatorPreThread->getParams().frequency; currentDemodType = demodulatorPreThread->getParams().demodType; - currentDemodCons = demodulatorThread->getDemodulatorCons(); currentAudioSampleRate = AudioThread::deviceSampleRate[getOutputDevice()]; demodulatorPreThread->getParams().audioSampleRate = currentAudioSampleRate; @@ -300,19 +298,35 @@ std::string DemodulatorInstance::getDemodulatorType() { } void DemodulatorInstance::setDemodulatorLock(bool demod_lock_in) { - demodulatorThread->setDemodulatorLock(demod_lock_in); + Modem *cModem = demodulatorPreThread->getModem(); + if (cModem && cModem->getType() == "digital") { + ((ModemDigital *)cModem)->setDemodulatorLock(demod_lock_in); + } } int DemodulatorInstance::getDemodulatorLock() { - return demodulatorThread->getDemodulatorLock(); + Modem *cModem = demodulatorPreThread->getModem(); + + if (cModem && cModem->getType() == "digital") { + return ((ModemDigital *)cModem)->getDemodulatorLock(); + } + + return -1; } void DemodulatorInstance::setDemodulatorCons(int demod_cons_in) { - demodulatorThread->setDemodulatorCons(demod_cons_in); + Modem *cModem = demodulatorPreThread->getModem(); + if (cModem && cModem->getType() == "digital") { + ((ModemDigital *)cModem)->setDemodulatorCons(demod_cons_in); + } } int DemodulatorInstance::getDemodulatorCons() { - return demodulatorThread->getDemodulatorCons(); + Modem *cModem = demodulatorPreThread->getModem(); + if (cModem && cModem->getType() == "digital") { + return ((ModemDigital *)cModem)->getDemodulatorCons(); + } + return -1; } void DemodulatorInstance::setBandwidth(int bw) { diff --git a/src/demod/DemodulatorInstance.h b/src/demod/DemodulatorInstance.h index 158b800..612cf07 100644 --- a/src/demod/DemodulatorInstance.h +++ b/src/demod/DemodulatorInstance.h @@ -7,6 +7,9 @@ #include "DemodulatorThread.h" #include "DemodulatorPreThread.h" +#include "ModemDigital.h" +#include "ModemAnalog.h" + class DemodulatorInstance { public: @@ -112,7 +115,6 @@ private: std::atomic_llong currentFrequency; std::atomic_int currentBandwidth; std::string currentDemodType; - std::atomic_int currentDemodCons; std::atomic_int currentOutputDevice; std::atomic_int currentAudioSampleRate; std::atomic currentAudioGain; diff --git a/src/demod/DemodulatorPreThread.cpp b/src/demod/DemodulatorPreThread.cpp index acd18c9..1235134 100644 --- a/src/demod/DemodulatorPreThread.cpp +++ b/src/demod/DemodulatorPreThread.cpp @@ -284,3 +284,12 @@ void DemodulatorPreThread::terminate() { delete workerResults; delete workerQueue; } + + +Modem *DemodulatorPreThread::getModem() { + return cModem; +} + +ModemKit *DemodulatorPreThread::getModemKit() { + return cModemKit; +} diff --git a/src/demod/DemodulatorPreThread.h b/src/demod/DemodulatorPreThread.h index 28110dc..f339a70 100644 --- a/src/demod/DemodulatorPreThread.h +++ b/src/demod/DemodulatorPreThread.h @@ -24,12 +24,9 @@ public: void initialize(); void terminate(); -#ifdef __APPLE__ - static void *pthread_helper(void *context) { - return ((DemodulatorPreThread *) context)->threadMain(); - } -#endif - + Modem *getModem(); + ModemKit *getModemKit(); + protected: msresamp_crcf iqResampler; double iqResampleRatio; diff --git a/src/modules/modem/Modem.cpp b/src/modules/modem/Modem.cpp index f9acec2..8a1ff0e 100644 --- a/src/modules/modem/Modem.cpp +++ b/src/modules/modem/Modem.cpp @@ -2,8 +2,8 @@ ModemFactoryList Modem::modemFactories; -void Modem::addModemFactory(std::string modemName, Modem *factorySingle) { - modemFactories[modemName] = factorySingle; +void Modem::addModemFactory(Modem *factorySingle) { + modemFactories[factorySingle->getName()] = factorySingle; } ModemFactoryList Modem::getFactories() { diff --git a/src/modules/modem/Modem.h b/src/modules/modem/Modem.h index be905ba..e11e18d 100644 --- a/src/modules/modem/Modem.h +++ b/src/modules/modem/Modem.h @@ -14,7 +14,6 @@ public: int audioSampleRate; }; - class ModemIQData: public ReferenceCounter { public: std::vector data; @@ -34,10 +33,11 @@ typedef std::map ModemFactoryList; class Modem { public: - static void addModemFactory(std::string modemName, Modem *factorySingle); + static void addModemFactory(Modem *factorySingle); static ModemFactoryList getFactories(); static Modem *makeModem(std::string modemType); - + virtual std::string getType() = 0; + virtual std::string getName() = 0; virtual Modem *factory() = 0; Modem(); diff --git a/src/modules/modem/ModemAnalog.cpp b/src/modules/modem/ModemAnalog.cpp index 1284bc1..58474e8 100644 --- a/src/modules/modem/ModemAnalog.cpp +++ b/src/modules/modem/ModemAnalog.cpp @@ -4,6 +4,10 @@ ModemAnalog::ModemAnalog() : aOutputCeil(1), aOutputCeilMA(1), aOutputCeilMAA(1) } +std::string ModemAnalog::getType() { + return "analog"; +} + ModemKit *ModemAnalog::buildKit(long long sampleRate, int audioSampleRate) { ModemKitAnalog *akit = new ModemKitAnalog; diff --git a/src/modules/modem/ModemAnalog.h b/src/modules/modem/ModemAnalog.h index 0a64151..2f80db7 100644 --- a/src/modules/modem/ModemAnalog.h +++ b/src/modules/modem/ModemAnalog.h @@ -15,6 +15,7 @@ public: class ModemAnalog : public Modem { public: ModemAnalog(); + std::string getType(); ModemKit *buildKit(long long sampleRate, int audioSampleRate); void disposeKit(ModemKit *kit); void initOutputBuffers(ModemKitAnalog *akit, ModemIQData *input); diff --git a/src/modules/modem/ModemDigital.cpp b/src/modules/modem/ModemDigital.cpp index ee5ba2d..6c2224d 100644 --- a/src/modules/modem/ModemDigital.cpp +++ b/src/modules/modem/ModemDigital.cpp @@ -1,6 +1,11 @@ #include "ModemDigital.h" ModemDigital::ModemDigital() { + +} + +std::string ModemDigital::getType() { + return "digital"; } ModemKit *ModemDigital::buildKit(long long sampleRate, int audioSampleRate) { diff --git a/src/modules/modem/ModemDigital.h b/src/modules/modem/ModemDigital.h index de427cc..34a119b 100644 --- a/src/modules/modem/ModemDigital.h +++ b/src/modules/modem/ModemDigital.h @@ -12,6 +12,7 @@ public: class ModemDigital : public Modem { public: ModemDigital(); + std::string getType(); ModemKit *buildKit(long long sampleRate, int audioSampleRate); void disposeKit(ModemKit *kit); void digitalStart(ModemKitDigital *kit, modem mod, ModemIQData *input); diff --git a/src/modules/modem/analog/ModemAM.cpp b/src/modules/modem/analog/ModemAM.cpp index dbd6bc0..75c0be0 100644 --- a/src/modules/modem/analog/ModemAM.cpp +++ b/src/modules/modem/analog/ModemAM.cpp @@ -8,6 +8,10 @@ Modem *ModemAM::factory() { return new ModemAM; } +std::string ModemAM::getName() { + return "AM"; +} + void ModemAM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { ModemKitAnalog *amkit = (ModemKitAnalog *)kit; diff --git a/src/modules/modem/analog/ModemAM.h b/src/modules/modem/analog/ModemAM.h index d7d115e..8a1d017 100644 --- a/src/modules/modem/analog/ModemAM.h +++ b/src/modules/modem/analog/ModemAM.h @@ -5,6 +5,7 @@ class ModemAM : public ModemAnalog { public: ModemAM(); + std::string getName(); Modem *factory(); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/analog/ModemDSB.cpp b/src/modules/modem/analog/ModemDSB.cpp index 62c5054..042593a 100644 --- a/src/modules/modem/analog/ModemDSB.cpp +++ b/src/modules/modem/analog/ModemDSB.cpp @@ -8,6 +8,10 @@ Modem *ModemDSB::factory() { return new ModemDSB; } +std::string ModemDSB::getName() { + return "DSB"; +} + void ModemDSB::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { ModemKitAnalog *amkit = (ModemKitAnalog *)kit; diff --git a/src/modules/modem/analog/ModemDSB.h b/src/modules/modem/analog/ModemDSB.h index 1c94e7a..fc0e550 100644 --- a/src/modules/modem/analog/ModemDSB.h +++ b/src/modules/modem/analog/ModemDSB.h @@ -5,6 +5,7 @@ class ModemDSB : public ModemAnalog { public: ModemDSB(); + std::string getName(); Modem *factory(); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/analog/ModemFM.cpp b/src/modules/modem/analog/ModemFM.cpp index ee28692..259fcfd 100644 --- a/src/modules/modem/analog/ModemFM.cpp +++ b/src/modules/modem/analog/ModemFM.cpp @@ -8,6 +8,10 @@ Modem *ModemFM::factory() { return new ModemFM; } +std::string ModemFM::getName() { + return "FM"; +} + void ModemFM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { ModemKitAnalog *fmkit = (ModemKitAnalog *)kit; diff --git a/src/modules/modem/analog/ModemFM.h b/src/modules/modem/analog/ModemFM.h index c96bcdd..a763bc2 100644 --- a/src/modules/modem/analog/ModemFM.h +++ b/src/modules/modem/analog/ModemFM.h @@ -5,6 +5,7 @@ class ModemFM : public ModemAnalog { public: ModemFM(); + std::string getName(); Modem *factory(); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/analog/ModemFMStereo.cpp b/src/modules/modem/analog/ModemFMStereo.cpp index e020fa0..04ec5d7 100644 --- a/src/modules/modem/analog/ModemFMStereo.cpp +++ b/src/modules/modem/analog/ModemFMStereo.cpp @@ -18,6 +18,14 @@ ModemFMStereo::~ModemFMStereo() { nco_crcf_destroy(stereoPilot); } +std::string ModemFMStereo::getType() { + return "analog"; +} + +std::string ModemFMStereo::getName() { + return "FMS"; +} + Modem *ModemFMStereo::factory() { return new ModemFMStereo; } diff --git a/src/modules/modem/analog/ModemFMStereo.h b/src/modules/modem/analog/ModemFMStereo.h index b3f116e..cbc5aec 100644 --- a/src/modules/modem/analog/ModemFMStereo.h +++ b/src/modules/modem/analog/ModemFMStereo.h @@ -20,6 +20,8 @@ class ModemFMStereo : public Modem { public: ModemFMStereo(); ~ModemFMStereo(); + std::string getType(); + std::string getName(); Modem *factory(); ModemKit *buildKit(long long sampleRate, int audioSampleRate); void disposeKit(ModemKit *kit); diff --git a/src/modules/modem/analog/ModemIQ.cpp b/src/modules/modem/analog/ModemIQ.cpp index 055c6e8..6c984f6 100644 --- a/src/modules/modem/analog/ModemIQ.cpp +++ b/src/modules/modem/analog/ModemIQ.cpp @@ -13,6 +13,14 @@ ModemKit *ModemIQ::buildKit(long long sampleRate, int audioSampleRate) { return kit; } +std::string ModemIQ::getType() { + return "analog"; +} + +std::string ModemIQ::getName() { + return "I/Q"; +} + void ModemIQ::disposeKit(ModemKit *kit) { delete kit; } diff --git a/src/modules/modem/analog/ModemIQ.h b/src/modules/modem/analog/ModemIQ.h index 7bda47e..abd9d94 100644 --- a/src/modules/modem/analog/ModemIQ.h +++ b/src/modules/modem/analog/ModemIQ.h @@ -4,6 +4,8 @@ class ModemIQ : public Modem { public: ModemIQ(); + std::string getType(); + std::string getName(); Modem *factory(); ModemKit *buildKit(long long sampleRate, int audioSampleRate); void disposeKit(ModemKit *kit); diff --git a/src/modules/modem/analog/ModemLSB.cpp b/src/modules/modem/analog/ModemLSB.cpp index 74c3b3a..44fb116 100644 --- a/src/modules/modem/analog/ModemLSB.cpp +++ b/src/modules/modem/analog/ModemLSB.cpp @@ -10,6 +10,10 @@ Modem *ModemLSB::factory() { return new ModemLSB; } +std::string ModemLSB::getName() { + return "LSB"; +} + ModemLSB::~ModemLSB() { resamp2_crcf_destroy(ssbFilt); ampmodem_destroy(demodAM_LSB); diff --git a/src/modules/modem/analog/ModemLSB.h b/src/modules/modem/analog/ModemLSB.h index 180928b..cbdc176 100644 --- a/src/modules/modem/analog/ModemLSB.h +++ b/src/modules/modem/analog/ModemLSB.h @@ -6,6 +6,7 @@ class ModemLSB : public ModemAnalog { public: ModemLSB(); ~ModemLSB(); + std::string getName(); Modem *factory(); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/analog/ModemUSB.cpp b/src/modules/modem/analog/ModemUSB.cpp index 2827451..0482d4f 100644 --- a/src/modules/modem/analog/ModemUSB.cpp +++ b/src/modules/modem/analog/ModemUSB.cpp @@ -10,6 +10,10 @@ Modem *ModemUSB::factory() { return new ModemUSB; } +std::string ModemUSB::getName() { + return "USB"; +} + ModemUSB::~ModemUSB() { resamp2_crcf_destroy(ssbFilt); ampmodem_destroy(demodAM_USB); diff --git a/src/modules/modem/analog/ModemUSB.h b/src/modules/modem/analog/ModemUSB.h index 8267526..d6d3a4d 100644 --- a/src/modules/modem/analog/ModemUSB.h +++ b/src/modules/modem/analog/ModemUSB.h @@ -5,6 +5,7 @@ class ModemUSB : public ModemAnalog { public: ModemUSB(); ~ModemUSB(); + std::string getName(); Modem *factory(); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/digital/ModemAPSK.cpp b/src/modules/modem/digital/ModemAPSK.cpp index 65e2189..ed04c10 100644 --- a/src/modules/modem/digital/ModemAPSK.cpp +++ b/src/modules/modem/digital/ModemAPSK.cpp @@ -27,6 +27,10 @@ ModemAPSK::~ModemAPSK() { modem_destroy(demodAPSK256); } +std::string ModemAPSK::getName() { + return "APSK"; +} + void ModemAPSK::updateDemodulatorCons(int cons) { if (currentDemodCons.load() != cons) { currentDemodCons = cons; diff --git a/src/modules/modem/digital/ModemAPSK.h b/src/modules/modem/digital/ModemAPSK.h index 003bcfe..f5497df 100644 --- a/src/modules/modem/digital/ModemAPSK.h +++ b/src/modules/modem/digital/ModemAPSK.h @@ -5,6 +5,7 @@ class ModemAPSK : public ModemDigital { public: ModemAPSK(); ~ModemAPSK(); + std::string getName(); Modem *factory(); void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/digital/ModemASK.cpp b/src/modules/modem/digital/ModemASK.cpp index 2888f6e..7a9f405 100644 --- a/src/modules/modem/digital/ModemASK.cpp +++ b/src/modules/modem/digital/ModemASK.cpp @@ -29,10 +29,13 @@ ModemASK::~ModemASK() { modem_destroy(demodASK256); } +std::string ModemASK::getName() { + return "ASK"; +} + void ModemASK::updateDemodulatorCons(int cons) { if (currentDemodCons.load() != cons) { currentDemodCons = cons; - } } diff --git a/src/modules/modem/digital/ModemASK.h b/src/modules/modem/digital/ModemASK.h index a32fc6e..5dfffc1 100644 --- a/src/modules/modem/digital/ModemASK.h +++ b/src/modules/modem/digital/ModemASK.h @@ -5,6 +5,7 @@ class ModemASK : public ModemDigital { public: ModemASK(); ~ModemASK(); + std::string getName(); Modem *factory(); void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/digital/ModemBPSK.cpp b/src/modules/modem/digital/ModemBPSK.cpp index d7339d3..535cdae 100644 --- a/src/modules/modem/digital/ModemBPSK.cpp +++ b/src/modules/modem/digital/ModemBPSK.cpp @@ -12,6 +12,10 @@ ModemBPSK::~ModemBPSK() { modem_destroy(demodBPSK); } +std::string ModemBPSK::getName() { + return "BPSK"; +} + void ModemBPSK::updateDemodulatorCons(int cons) { if (currentDemodCons.load() != cons) { currentDemodCons = cons; diff --git a/src/modules/modem/digital/ModemBPSK.h b/src/modules/modem/digital/ModemBPSK.h index be28c16..ef26c5c 100644 --- a/src/modules/modem/digital/ModemBPSK.h +++ b/src/modules/modem/digital/ModemBPSK.h @@ -5,6 +5,7 @@ class ModemBPSK : public ModemDigital { public: ModemBPSK(); ~ModemBPSK(); + std::string getName(); Modem *factory(); void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/digital/ModemDPSK.cpp b/src/modules/modem/digital/ModemDPSK.cpp index 07e49f5..b44ebb7 100644 --- a/src/modules/modem/digital/ModemDPSK.cpp +++ b/src/modules/modem/digital/ModemDPSK.cpp @@ -18,6 +18,10 @@ Modem *ModemDPSK::factory() { return new ModemDPSK; } +std::string ModemDPSK::getName() { + return "DPSK"; +} + ModemDPSK::~ModemDPSK() { modem_destroy(demodDPSK2); modem_destroy(demodDPSK4); diff --git a/src/modules/modem/digital/ModemDPSK.h b/src/modules/modem/digital/ModemDPSK.h index 00b115d..b431ffd 100644 --- a/src/modules/modem/digital/ModemDPSK.h +++ b/src/modules/modem/digital/ModemDPSK.h @@ -5,6 +5,7 @@ class ModemDPSK : public ModemDigital { public: ModemDPSK(); ~ModemDPSK(); + std::string getName(); Modem *factory(); void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/digital/ModemOOK.cpp b/src/modules/modem/digital/ModemOOK.cpp index 87b6d48..7be56d7 100644 --- a/src/modules/modem/digital/ModemOOK.cpp +++ b/src/modules/modem/digital/ModemOOK.cpp @@ -12,6 +12,9 @@ ModemOOK::~ModemOOK() { modem_destroy(demodOOK); } +std::string ModemOOK::getName() { + return "OOK"; +} void ModemOOK::updateDemodulatorCons(int cons) { if (currentDemodCons.load() != cons) { diff --git a/src/modules/modem/digital/ModemOOK.h b/src/modules/modem/digital/ModemOOK.h index 5bc7731..6f15c8b 100644 --- a/src/modules/modem/digital/ModemOOK.h +++ b/src/modules/modem/digital/ModemOOK.h @@ -5,6 +5,7 @@ class ModemOOK : public ModemDigital { public: ModemOOK(); ~ModemOOK(); + std::string getName(); Modem *factory(); void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/digital/ModemPSK.cpp b/src/modules/modem/digital/ModemPSK.cpp index 3d391cd..cf05a9e 100644 --- a/src/modules/modem/digital/ModemPSK.cpp +++ b/src/modules/modem/digital/ModemPSK.cpp @@ -18,6 +18,10 @@ Modem *ModemPSK::factory() { return new ModemPSK; } +std::string ModemPSK::getName() { + return "PSK"; +} + ModemPSK::~ModemPSK() { modem_destroy(demodPSK2); modem_destroy(demodPSK4); diff --git a/src/modules/modem/digital/ModemPSK.h b/src/modules/modem/digital/ModemPSK.h index d1818fc..913f8f8 100644 --- a/src/modules/modem/digital/ModemPSK.h +++ b/src/modules/modem/digital/ModemPSK.h @@ -5,6 +5,7 @@ class ModemPSK : public ModemDigital { public: ModemPSK(); ~ModemPSK(); + std::string getName(); Modem *factory(); void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/digital/ModemQAM.cpp b/src/modules/modem/digital/ModemQAM.cpp index 5beea0e..f14b5b5 100644 --- a/src/modules/modem/digital/ModemQAM.cpp +++ b/src/modules/modem/digital/ModemQAM.cpp @@ -17,6 +17,10 @@ Modem *ModemQAM::factory() { return new ModemQAM; } +std::string ModemQAM::getName() { + return "QAM"; +} + ModemQAM::~ModemQAM() { modem_destroy(demodQAM4); modem_destroy(demodQAM8); diff --git a/src/modules/modem/digital/ModemQAM.h b/src/modules/modem/digital/ModemQAM.h index 2780321..973f9ff 100644 --- a/src/modules/modem/digital/ModemQAM.h +++ b/src/modules/modem/digital/ModemQAM.h @@ -5,6 +5,7 @@ class ModemQAM : public ModemDigital { public: ModemQAM(); ~ModemQAM(); + std::string getName(); Modem *factory(); void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/digital/ModemQPSK.cpp b/src/modules/modem/digital/ModemQPSK.cpp index d47e998..309cadb 100644 --- a/src/modules/modem/digital/ModemQPSK.cpp +++ b/src/modules/modem/digital/ModemQPSK.cpp @@ -12,6 +12,10 @@ ModemQPSK::~ModemQPSK() { modem_destroy(demodQPSK); } +std::string ModemQPSK::getName() { + return "QPSK"; +} + void ModemQPSK::updateDemodulatorCons(int cons) { if (currentDemodCons.load() != cons) { currentDemodCons = cons; diff --git a/src/modules/modem/digital/ModemQPSK.h b/src/modules/modem/digital/ModemQPSK.h index 7fbd56f..4d26e49 100644 --- a/src/modules/modem/digital/ModemQPSK.h +++ b/src/modules/modem/digital/ModemQPSK.h @@ -5,6 +5,7 @@ class ModemQPSK : public ModemDigital { public: ModemQPSK(); ~ModemQPSK(); + std::string getName(); Modem *factory(); void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/digital/ModemSQAM.cpp b/src/modules/modem/digital/ModemSQAM.cpp index c8df8c7..a4abd39 100644 --- a/src/modules/modem/digital/ModemSQAM.cpp +++ b/src/modules/modem/digital/ModemSQAM.cpp @@ -17,6 +17,10 @@ ModemSQAM::~ModemSQAM() { modem_destroy(demodSQAM128); } +std::string ModemSQAM::getName() { + return "SQAM"; +} + void ModemSQAM::updateDemodulatorCons(int cons) { if (currentDemodCons.load() != cons) { currentDemodCons = cons; diff --git a/src/modules/modem/digital/ModemSQAM.h b/src/modules/modem/digital/ModemSQAM.h index b87c770..e26b497 100644 --- a/src/modules/modem/digital/ModemSQAM.h +++ b/src/modules/modem/digital/ModemSQAM.h @@ -5,6 +5,7 @@ class ModemSQAM : public ModemDigital { public: ModemSQAM(); ~ModemSQAM(); + std::string getName(); Modem *factory(); void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/digital/ModemST.cpp b/src/modules/modem/digital/ModemST.cpp index 708063b..b5d8e3f 100644 --- a/src/modules/modem/digital/ModemST.cpp +++ b/src/modules/modem/digital/ModemST.cpp @@ -8,6 +8,10 @@ Modem *ModemST::factory() { return new ModemST; } +std::string ModemST::getName() { + return "ST"; +} + ModemST::~ModemST() { modem_destroy(demodST); } diff --git a/src/modules/modem/digital/ModemST.h b/src/modules/modem/digital/ModemST.h index 26cf358..ac9ee10 100644 --- a/src/modules/modem/digital/ModemST.h +++ b/src/modules/modem/digital/ModemST.h @@ -5,6 +5,7 @@ class ModemST : public ModemDigital { public: ModemST(); ~ModemST(); + std::string getName(); Modem *factory(); void updateDemodulatorCons(int cons); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); From 86270b330082b74bea3f31d552da2983c2e01639 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 19 Nov 2015 00:11:34 -0500 Subject: [PATCH 19/28] race/init fix; skip audio output on digital --- src/demod/DemodulatorInstance.cpp | 5 +++-- src/demod/DemodulatorPreThread.cpp | 6 +++--- src/demod/DemodulatorThread.cpp | 12 +++++++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index 172e95a..cd1cd03 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -73,7 +73,6 @@ void DemodulatorInstance::run() { // } currentFrequency = demodulatorPreThread->getParams().frequency; - currentDemodType = demodulatorPreThread->getParams().demodType; currentAudioSampleRate = AudioThread::deviceSampleRate[getOutputDevice()]; demodulatorPreThread->getParams().audioSampleRate = currentAudioSampleRate; @@ -101,6 +100,8 @@ void DemodulatorInstance::run() { t_PreDemod = new std::thread(&DemodulatorPreThread::threadMain, demodulatorPreThread); t_Demod = new std::thread(&DemodulatorThread::threadMain, demodulatorThread); #endif + + setDemodulatorType(demodulatorPreThread->getParams().demodType); active = true; audioTerminated = demodTerminated = preDemodTerminated = terminated = false; @@ -285,9 +286,9 @@ void DemodulatorInstance::setDemodulatorType(std::string demod_type_in) { } setGain(getGain()); + demodulatorPreThread->getParams().demodType = currentDemodType; if (!active) { checkBandwidth(); - demodulatorPreThread->getParams().demodType = currentDemodType; } else if (demodulatorThread && threadQueueControl) { demodulatorPreThread->setDemodType(currentDemodType); } diff --git a/src/demod/DemodulatorPreThread.cpp b/src/demod/DemodulatorPreThread.cpp index 1235134..a92d942 100644 --- a/src/demod/DemodulatorPreThread.cpp +++ b/src/demod/DemodulatorPreThread.cpp @@ -52,8 +52,6 @@ void DemodulatorPreThread::run() { std::cout << "Demodulator preprocessor thread started.." << std::endl; - t_Worker = new std::thread(&DemodulatorWorkerThread::threadMain, workerThread); - ReBuffer buffers; iqInputQueue = (DemodulatorThreadInputQueue*)getInputQueue("IQDataInput"); @@ -65,6 +63,7 @@ void DemodulatorPreThread::run() { std::vector out_buf_data; setDemodType(params.demodType); + t_Worker = new std::thread(&DemodulatorWorkerThread::threadMain, workerThread); while (!terminated) { DemodulatorThreadIQData *inp; @@ -262,10 +261,11 @@ void DemodulatorPreThread::setDemodType(std::string demodType) { command.bandwidth = params.bandwidth; command.audioSampleRate = params.audioSampleRate; workerQueue->push(command); + demodTypeChanged.store(true); } std::string DemodulatorPreThread::getDemodType() { - if (newDemodType != demodType) { + if (demodTypeChanged.load()) { return newDemodType; } return demodType; diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index fe73f50..6986e65 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -116,12 +116,14 @@ void DemodulatorThread::run() { modemData.setRefCount(1); AudioThreadInput *ati = NULL; - ati = outputBuffers.getBuffer(); - - ati->sampleRate = audioSampleRate; - ati->inputRate = inp->sampleRate; - ati->setRefCount(1); + if (cModem->getType() != "digital") { + ati = outputBuffers.getBuffer(); + + ati->sampleRate = audioSampleRate; + ati->inputRate = inp->sampleRate; + ati->setRefCount(1); + } cModem->demodulate(cModemKit, &modemData, ati); if (currentSignalLevel > signalLevel) { From e9f886931284bddee65b989a995edd4d56245114 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 19 Nov 2015 00:19:24 -0500 Subject: [PATCH 20/28] Fix ModemASK cons init --- src/modules/modem/digital/ModemASK.cpp | 76 +++++++++++++------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/modules/modem/digital/ModemASK.cpp b/src/modules/modem/digital/ModemASK.cpp index 7a9f405..af09b76 100644 --- a/src/modules/modem/digital/ModemASK.cpp +++ b/src/modules/modem/digital/ModemASK.cpp @@ -36,50 +36,50 @@ std::string ModemASK::getName() { void ModemASK::updateDemodulatorCons(int cons) { if (currentDemodCons.load() != cons) { currentDemodCons = cons; + + switch (demodulatorCons.load()) { + case 2: + demodASK = demodASK2; + updateDemodulatorCons(2); + break; + case 4: + demodASK = demodASK4; + updateDemodulatorCons(4); + break; + case 8: + demodASK = demodASK8; + updateDemodulatorCons(8); + break; + case 16: + demodASK = demodASK16; + updateDemodulatorCons(16); + break; + case 32: + demodASK = demodASK32; + updateDemodulatorCons(32); + break; + case 64: + demodASK = demodASK64; + updateDemodulatorCons(64); + break; + case 128: + demodASK = demodASK128; + updateDemodulatorCons(128); + break; + case 256: + demodASK = demodASK256; + updateDemodulatorCons(256); + break; + default: + demodASK = demodASK2; + break; + } } } void ModemASK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { ModemKitDigital *dkit = (ModemKitDigital *)kit; - switch (demodulatorCons.load()) { - case 2: - demodASK = demodASK2; - updateDemodulatorCons(2); - break; - case 4: - demodASK = demodASK4; - updateDemodulatorCons(4); - break; - case 8: - demodASK = demodASK8; - updateDemodulatorCons(8); - break; - case 16: - demodASK = demodASK16; - updateDemodulatorCons(16); - break; - case 32: - demodASK = demodASK32; - updateDemodulatorCons(32); - break; - case 64: - demodASK = demodASK64; - updateDemodulatorCons(64); - break; - case 128: - demodASK = demodASK128; - updateDemodulatorCons(128); - break; - case 256: - demodASK = demodASK256; - updateDemodulatorCons(256); - break; - default: - demodASK = demodASK2; - break; - } - digitalStart(dkit, demodASK, input); for (int i = 0, bufSize = input->data.size(); i < bufSize; i++) { From cf5cefbf6c17dd0c5c8594be4cc4795b19e62a67 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 19 Nov 2015 00:39:14 -0500 Subject: [PATCH 21/28] fix non-lab build --- src/AppFrame.cpp | 4 ++-- src/demod/DemodulatorInstance.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 10f4592..504e65e 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -912,7 +912,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { } #else // basic demodulators - if (dSelection != -1 && dSelection != demod->getDemodulatorType()) { + if (dSelection != "" && dSelection != demod->getDemodulatorType()) { demod->setDemodulatorType(dSelection); } #endif @@ -974,7 +974,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { } #else // basic demodulators - if (dSelection != -1 && dSelection != mgr->getLastDemodulatorType()) { + if (dSelection != "" && dSelection != mgr->getLastDemodulatorType()) { mgr->setLastDemodulatorType(dSelection); } #endif diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index cd1cd03..5f73a2e 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -312,7 +312,7 @@ int DemodulatorInstance::getDemodulatorLock() { return ((ModemDigital *)cModem)->getDemodulatorLock(); } - return -1; + return 0; } void DemodulatorInstance::setDemodulatorCons(int demod_cons_in) { @@ -327,7 +327,7 @@ int DemodulatorInstance::getDemodulatorCons() { if (cModem && cModem->getType() == "digital") { return ((ModemDigital *)cModem)->getDemodulatorCons(); } - return -1; + return 0; } void DemodulatorInstance::setBandwidth(int bw) { From c9126012727c4ee3fc5c49b07da87e7f127faf6f Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 20 Nov 2015 19:05:08 -0500 Subject: [PATCH 22/28] MSVC fixes --- CMakeLists.txt | 4 ++-- src/modules/modem/analog/ModemAM.cpp | 4 +++- src/modules/modem/analog/ModemDSB.cpp | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 45b62ee..a09cb5c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,8 +2,8 @@ cmake_minimum_required (VERSION 2.8) SET(CUBICSDR_VERSION_MAJOR "0") SET(CUBICSDR_VERSION_MINOR "1") -SET(CUBICSDR_VERSION_PATCH "16") -SET(CUBICSDR_VERSION_REL "alpha") +SET(CUBICSDR_VERSION_PATCH "17") +SET(CUBICSDR_VERSION_REL "alpha-demod-refactor") SET(CUBICSDR_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}-${CUBICSDR_VERSION_REL}") SET(CPACK_PACKAGE_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}") diff --git a/src/modules/modem/analog/ModemAM.cpp b/src/modules/modem/analog/ModemAM.cpp index 75c0be0..678832e 100644 --- a/src/modules/modem/analog/ModemAM.cpp +++ b/src/modules/modem/analog/ModemAM.cpp @@ -22,7 +22,9 @@ void ModemAM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *au return; } - ampmodem_demodulate_block(demodAM, &input->data[0], bufSize, &demodOutputData[0]); + for (int i = 0; i < bufSize; i++) { + ampmodem_demodulate(demodAM, input->data[i], &demodOutputData[i]); + } buildAudioOutput(amkit,audioOut,true); } diff --git a/src/modules/modem/analog/ModemDSB.cpp b/src/modules/modem/analog/ModemDSB.cpp index 042593a..c343425 100644 --- a/src/modules/modem/analog/ModemDSB.cpp +++ b/src/modules/modem/analog/ModemDSB.cpp @@ -22,7 +22,9 @@ void ModemDSB::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *a return; } - ampmodem_demodulate_block(demodAM_DSB, &input->data[0], bufSize, &demodOutputData[0]); + for (int i = 0; i < bufSize; i++) { + ampmodem_demodulate(demodAM_DSB, input->data[i], &demodOutputData[i]); + } buildAudioOutput(amkit, audioOut, true); } From af2710ff37bdf11db7814f79c9ac18745d829a8e Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 20 Nov 2015 19:32:53 -0500 Subject: [PATCH 23/28] Ubuntu fixes --- src/modules/modem/Modem.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/modem/Modem.h b/src/modules/modem/Modem.h index e11e18d..035bbe4 100644 --- a/src/modules/modem/Modem.h +++ b/src/modules/modem/Modem.h @@ -3,6 +3,7 @@ #include "liquid/liquid.h" #include "IOThread.h" #include "AudioThread.h" +#include class ModemKit { public: @@ -48,4 +49,4 @@ public: virtual void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) = 0; private: static ModemFactoryList modemFactories; -}; \ No newline at end of file +}; From 7e856988a26f71bfd2f4dbff55a54d45da6cb154 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 20 Nov 2015 20:46:25 -0500 Subject: [PATCH 24/28] Fix spectrum/waveform display when higher than audio rate --- src/demod/DemodulatorThread.cpp | 28 ++++++++++++++++------------ src/modules/modem/ModemAnalog.cpp | 8 ++++++++ src/modules/modem/ModemAnalog.h | 2 ++ 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index 6986e65..7160ce8 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -117,7 +117,10 @@ void DemodulatorThread::run() { AudioThreadInput *ati = NULL; - if (cModem->getType() != "digital") { + ModemAnalog *modemAnalog = (cModem->getType() == "analog")?((ModemAnalog *)cModem):nullptr; + ModemDigital *modemDigital = (cModem->getType() == "digital")?((ModemDigital *)cModem):nullptr; + + if (modemAnalog != nullptr) { ati = outputBuffers.getBuffer(); ati->sampleRate = audioSampleRate; @@ -177,18 +180,19 @@ void DemodulatorThread::run() { } else { int numAudioWritten = ati->data.size(); ati_vis->channels = 1; - // if (numAudioWritten > bufSize) { - ati_vis->inputRate = audioSampleRate; - if (num_vis > numAudioWritten) { - num_vis = numAudioWritten; + std::vector *demodOutData = (modemAnalog != nullptr)?modemAnalog->getDemodOutputData():nullptr; + if ((numAudioWritten > bufSize) || (demodOutData == nullptr)) { + ati_vis->inputRate = audioSampleRate; + if (num_vis > numAudioWritten) { + num_vis = numAudioWritten; + } + ati_vis->data.assign(ati->data.begin(), ati->data.begin() + num_vis); + } else { + if (num_vis > demodOutData->size()) { + num_vis = demodOutData->size(); + } + ati_vis->data.assign(demodOutData->begin(), demodOutData->begin() + num_vis); } - ati_vis->data.assign(ati->data.begin(), ati->data.begin() + num_vis); - // } else { - // if (num_vis > bufSize) { - // num_vis = bufSize; - // } - // ati_vis->data.assign(ati->data.begin(), ati->data.begin() + num_vis); - // } // std::cout << "Signal: " << agc_crcf_get_signal_level(agc) << " -- " << agc_crcf_get_rssi(agc) << "dB " << std::endl; } diff --git a/src/modules/modem/ModemAnalog.cpp b/src/modules/modem/ModemAnalog.cpp index 58474e8..eed8d5c 100644 --- a/src/modules/modem/ModemAnalog.cpp +++ b/src/modules/modem/ModemAnalog.cpp @@ -81,3 +81,11 @@ void ModemAnalog::buildAudioOutput(ModemKitAnalog *akit, AudioThreadInput *audio audioOut->sampleRate = akit->audioSampleRate; audioOut->data.assign(resampledOutputData.begin(), resampledOutputData.begin() + numAudioWritten); } + +std::vector *ModemAnalog::getDemodOutputData() { + return &demodOutputData; +} + +std::vector *ModemAnalog::getResampledOutputData() { + return &resampledOutputData; +} diff --git a/src/modules/modem/ModemAnalog.h b/src/modules/modem/ModemAnalog.h index 2f80db7..f73a933 100644 --- a/src/modules/modem/ModemAnalog.h +++ b/src/modules/modem/ModemAnalog.h @@ -20,6 +20,8 @@ public: void disposeKit(ModemKit *kit); void initOutputBuffers(ModemKitAnalog *akit, ModemIQData *input); void buildAudioOutput(ModemKitAnalog *akit, AudioThreadInput *audioOut, bool autoGain); + std::vector *getDemodOutputData(); + std::vector *getResampledOutputData(); protected: int bufSize; std::vector demodOutputData; From 703e281d76631170d345c0b36379148a91f5ddda Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 20 Nov 2015 21:41:57 -0500 Subject: [PATCH 25/28] Fix demodulator init race --- src/demod/DemodulatorInstance.cpp | 3 ++- src/demod/DemodulatorWorkerThread.cpp | 16 ++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index 5f73a2e..112b97d 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -75,6 +75,7 @@ void DemodulatorInstance::run() { currentFrequency = demodulatorPreThread->getParams().frequency; currentAudioSampleRate = AudioThread::deviceSampleRate[getOutputDevice()]; demodulatorPreThread->getParams().audioSampleRate = currentAudioSampleRate; + setDemodulatorType(demodulatorPreThread->getParams().demodType); t_Audio = new std::thread(&AudioThread::threadMain, audioThread); @@ -101,7 +102,6 @@ void DemodulatorInstance::run() { t_Demod = new std::thread(&DemodulatorThread::threadMain, demodulatorThread); #endif - setDemodulatorType(demodulatorPreThread->getParams().demodType); active = true; audioTerminated = demodTerminated = preDemodTerminated = terminated = false; @@ -289,6 +289,7 @@ void DemodulatorInstance::setDemodulatorType(std::string demod_type_in) { demodulatorPreThread->getParams().demodType = currentDemodType; if (!active) { checkBandwidth(); + demodulatorPreThread->setDemodType(currentDemodType); } else if (demodulatorThread && threadQueueControl) { demodulatorPreThread->setDemodType(currentDemodType); } diff --git a/src/demod/DemodulatorWorkerThread.cpp b/src/demod/DemodulatorWorkerThread.cpp index 5eb7e93..4e63ca5 100644 --- a/src/demod/DemodulatorWorkerThread.cpp +++ b/src/demod/DemodulatorWorkerThread.cpp @@ -19,7 +19,7 @@ void DemodulatorWorkerThread::run() { while (!terminated) { bool filterChanged = false; bool makeDemod = false; - DemodulatorWorkerThreadCommand filterCommand; + DemodulatorWorkerThreadCommand filterCommand, demodCommand; DemodulatorWorkerThreadCommand command; bool done = false; @@ -32,7 +32,7 @@ void DemodulatorWorkerThread::run() { break; case DemodulatorWorkerThreadCommand::DEMOD_WORKER_THREAD_CMD_MAKE_DEMOD: makeDemod = true; - filterCommand = command; + demodCommand = command; break; default: break; @@ -52,15 +52,19 @@ void DemodulatorWorkerThread::run() { } if (makeDemod) { - cModem = Modem::makeModem(filterCommand.demodType); - cModemType = filterCommand.demodType; + cModem = Modem::makeModem(demodCommand.demodType); + cModemType = demodCommand.demodType; } result.modem = cModem; - if (filterCommand.bandwidth && filterCommand.audioSampleRate) { + if (makeDemod && demodCommand.bandwidth && demodCommand.audioSampleRate) { if (cModem != nullptr) { - cModemKit = cModem->buildKit(filterCommand.bandwidth, filterCommand.audioSampleRate); + cModemKit = cModem->buildKit(demodCommand.bandwidth, demodCommand.audioSampleRate); + } else { + cModemKit = nullptr; } + } else if (makeDemod) { + cModemKit = nullptr; } result.modemKit = cModemKit; From 63ea642c88b2eb408af21e28df94630eebc1a7b7 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 20 Nov 2015 21:55:37 -0500 Subject: [PATCH 26/28] Clean-up unused stereo states. --- src/AppFrame.cpp | 9 +-------- src/demod/DemodulatorInstance.cpp | 10 ---------- src/demod/DemodulatorInstance.h | 4 ---- src/demod/DemodulatorMgr.cpp | 12 +----------- src/demod/DemodulatorMgr.h | 7 ++----- src/visual/WaterfallCanvas.cpp | 16 ++-------------- 6 files changed, 6 insertions(+), 52 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 504e65e..6b00c74 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -642,7 +642,6 @@ void AppFrame::OnMenu(wxCommandEvent& event) { wxGetApp().getDemodMgr().setLastDemodulatorType("FM"); demodModeSelector->setSelection(1); wxGetApp().getDemodMgr().setLastMuted(false); - wxGetApp().getDemodMgr().setLastStereo(false); wxGetApp().getDemodMgr().setLastBandwidth(DEFAULT_DEMOD_BW); wxGetApp().getDemodMgr().setLastGain(1.0); wxGetApp().getDemodMgr().setLastSquelchLevel(0); @@ -1129,7 +1128,6 @@ void AppFrame::saveSession(std::string fileName) { *demod->newChild("type") = (*instance_i)->getDemodulatorType(); *demod->newChild("squelch_level") = (*instance_i)->getSquelchLevel(); *demod->newChild("squelch_enabled") = (*instance_i)->isSquelchEnabled() ? 1 : 0; - *demod->newChild("stereo") = (*instance_i)->isStereo() ? 1 : 0; *demod->newChild("output_device") = outputDevices[(*instance_i)->getOutputDevice()].name; *demod->newChild("gain") = (*instance_i)->getGain(); *demod->newChild("muted") = (*instance_i)->isMuted() ? 1 : 0; @@ -1179,7 +1177,6 @@ bool AppFrame::loadSession(std::string fileName) { std::string type = demod->hasAnother("type") ? string(*demod->getNext("type")) : "FM"; float squelch_level = demod->hasAnother("squelch_level") ? (float) *demod->getNext("squelch_level") : 0; int squelch_enabled = demod->hasAnother("squelch_enabled") ? (int) *demod->getNext("squelch_enabled") : 0; - int stereo = demod->hasAnother("stereo") ? (int) *demod->getNext("stereo") : 0; int muted = demod->hasAnother("muted") ? (int) *demod->getNext("muted") : 0; std::string output_device = demod->hasAnother("output_device") ? string(*(demod->getNext("output_device"))) : ""; float gain = demod->hasAnother("gain") ? (float) *demod->getNext("gain") : 1.0; @@ -1216,10 +1213,7 @@ bool AppFrame::loadSession(std::string fileName) { newDemod->setSquelchEnabled(true); newDemod->setSquelchLevel(squelch_level); } - if (stereo) { - newDemod->setStereo(true); - } - + bool found_device = false; std::map::iterator i; for (i = outputDevices.begin(); i != outputDevices.end(); i++) { @@ -1241,7 +1235,6 @@ bool AppFrame::loadSession(std::string fileName) { std::cout << "\t\tBandwidth: " << bandwidth << std::endl; std::cout << "\t\tSquelch Level: " << squelch_level << std::endl; std::cout << "\t\tSquelch Enabled: " << (squelch_enabled ? "true" : "false") << std::endl; - std::cout << "\t\tStereo: " << (stereo ? "true" : "false") << std::endl; std::cout << "\t\tOutput Device: " << output_device << std::endl; } diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index 112b97d..ecf2383 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -9,7 +9,6 @@ DemodulatorInstance::DemodulatorInstance() : preDemodTerminated.store(true); active.store(false); squelch.store(false); - stereo.store(false); muted.store(false); tracking.store(false); follow.store(false); @@ -195,15 +194,6 @@ void DemodulatorInstance::setActive(bool state) { active = state; } -bool DemodulatorInstance::isStereo() { - return stereo; -} - -void DemodulatorInstance::setStereo(bool state) { - stereo = state; -// demodulatorThread->setStereo(state); -} - void DemodulatorInstance::squelchAuto() { DemodulatorThreadControlCommand command; command.cmd = DemodulatorThreadControlCommand::DEMOD_THREAD_CMD_CTL_SQUELCH_ON; diff --git a/src/demod/DemodulatorInstance.h b/src/demod/DemodulatorInstance.h index 612cf07..818d72b 100644 --- a/src/demod/DemodulatorInstance.h +++ b/src/demod/DemodulatorInstance.h @@ -42,9 +42,6 @@ public: bool isActive(); void setActive(bool state); - bool isStereo(); - void setStereo(bool state); - void squelchAuto(); bool isSquelchEnabled(); void setSquelchEnabled(bool state); @@ -109,7 +106,6 @@ private: std::atomic_bool preDemodTerminated; std::atomic_bool active; std::atomic_bool squelch; - std::atomic_bool stereo; std::atomic_bool muted; std::atomic_llong currentFrequency; diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index bfb100e..9a0ffec 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -7,7 +7,7 @@ DemodulatorMgr::DemodulatorMgr() : activeDemodulator(NULL), lastActiveDemodulator(NULL), activeVisualDemodulator(NULL), lastBandwidth(DEFAULT_DEMOD_BW), lastDemodType( - DEFAULT_DEMOD_TYPE), lastSquelchEnabled(false), lastSquelch(0), lastGain(1.0), lastStereo(false), lastMuted(false) { + DEFAULT_DEMOD_TYPE), lastSquelchEnabled(false), lastSquelch(0), lastGain(1.0), lastMuted(false) { } @@ -166,7 +166,6 @@ void DemodulatorMgr::updateLastState() { lastSquelchEnabled = lastActiveDemodulator->isSquelchEnabled(); lastSquelch = lastActiveDemodulator->getSquelchLevel(); lastGain = lastActiveDemodulator->getGain(); - lastStereo = lastActiveDemodulator->isStereo(); } } @@ -224,15 +223,6 @@ void DemodulatorMgr::setLastSquelchEnabled(bool lastSquelchEnabled) { this->lastSquelchEnabled = lastSquelchEnabled; } -bool DemodulatorMgr::isLastStereo() const { - return lastStereo; -} - -void DemodulatorMgr::setLastStereo(bool lastStereo) { - this->lastStereo = lastStereo; -} - - bool DemodulatorMgr::isLastMuted() const { return lastMuted; } diff --git a/src/demod/DemodulatorMgr.h b/src/demod/DemodulatorMgr.h index 739c1c5..c57386a 100644 --- a/src/demod/DemodulatorMgr.h +++ b/src/demod/DemodulatorMgr.h @@ -39,10 +39,7 @@ public: bool isLastSquelchEnabled() const; void setLastSquelchEnabled(bool lastSquelchEnabled); - - bool isLastStereo() const; - void setLastStereo(bool lastStereo); - + bool isLastMuted() const; void setLastMuted(bool lastMuted); @@ -63,5 +60,5 @@ private: bool lastSquelchEnabled; float lastSquelch; float lastGain; - bool lastStereo, lastMuted; + bool lastMuted; }; diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index 85f4fc2..2270fa3 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -416,16 +416,6 @@ void WaterfallCanvas::OnKeyDown(wxKeyEvent& event) { } activeDemod->setMuted(!activeDemod->isMuted()); break; - case 'S': - if (!activeDemod) { - break; - } - if (activeDemod->isStereo()) { - activeDemod->setStereo(false); - } else { - activeDemod->setStereo(true); - } - break; case 'B': if (spectrumCanvas) { spectrumCanvas->setShowDb(!spectrumCanvas->getShowDb()); @@ -578,14 +568,14 @@ void WaterfallCanvas::OnMouseMoved(wxMouseEvent& event) { mouseTracker.setVertDragLock(true); mouseTracker.setHorizDragLock(false); - setStatusText("Click and drag to change demodulator bandwidth. SPACE for direct frequency input. M for mute, D to delete, S for stereo."); + setStatusText("Click and drag to change demodulator bandwidth. SPACE for direct frequency input. M for mute, D to delete."); } else { SetCursor(wxCURSOR_SIZING); nextDragState = WF_DRAG_FREQUENCY; mouseTracker.setVertDragLock(true); mouseTracker.setHorizDragLock(false); - setStatusText("Click and drag to change demodulator frequency; SPACE for direct input. M for mute, D to delete, S for stereo."); + setStatusText("Click and drag to change demodulator frequency; SPACE for direct input. M for mute, D to delete."); } } else { SetCursor(wxCURSOR_CROSS); @@ -671,7 +661,6 @@ void WaterfallCanvas::OnMouseReleased(wxMouseEvent& event) { demod->setBandwidth(mgr->getLastBandwidth()); demod->setSquelchLevel(mgr->getLastSquelchLevel()); demod->setSquelchEnabled(mgr->isLastSquelchEnabled()); - demod->setStereo(mgr->isLastStereo()); demod->setGain(mgr->getLastGain()); demod->setMuted(mgr->isLastMuted()); @@ -759,7 +748,6 @@ void WaterfallCanvas::OnMouseReleased(wxMouseEvent& event) { demod->setBandwidth(bw); demod->setSquelchLevel(mgr->getLastSquelchLevel()); demod->setSquelchEnabled(mgr->isLastSquelchEnabled()); - demod->setStereo(mgr->isLastStereo()); demod->setGain(mgr->getLastGain()); demod->run(); From a55dcad8be7348bb68801ce6123fd7093e6bbb37 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 20 Nov 2015 22:13:09 -0500 Subject: [PATCH 27/28] Remove unused demod buffer --- src/demod/DemodulatorThread.cpp | 4 +--- src/demod/DemodulatorThread.h | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index 7160ce8..cd6d5d2 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -87,10 +87,8 @@ void DemodulatorThread::run() { if (agcData.size() != bufSize) { if (agcData.capacity() < bufSize) { agcData.reserve(bufSize); - agcAMData.reserve(bufSize); } agcData.resize(bufSize); - agcAMData.resize(bufSize); } agc_crcf_execute_block(iqAutoGain, &(inp->data[0]), bufSize, &agcData[0]); @@ -118,7 +116,7 @@ void DemodulatorThread::run() { AudioThreadInput *ati = NULL; ModemAnalog *modemAnalog = (cModem->getType() == "analog")?((ModemAnalog *)cModem):nullptr; - ModemDigital *modemDigital = (cModem->getType() == "digital")?((ModemDigital *)cModem):nullptr; +// ModemDigital *modemDigital = (cModem->getType() == "digital")?((ModemDigital *)cModem):nullptr; if (modemAnalog != nullptr) { ati = outputBuffers.getBuffer(); diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index 6ada067..4cbc2ef 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -38,7 +38,6 @@ protected: ReBuffer outputBuffers; std::vector agcData; - std::vector agcAMData; agc_crcf iqAutoGain; From fb677d0ee2387bd52692aecf33899fbe6df1c32e Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 20 Nov 2015 22:29:04 -0500 Subject: [PATCH 28/28] Constructor init order warning fixes --- src/demod/DemodulatorPreThread.cpp | 2 +- src/demod/DemodulatorThread.cpp | 2 +- src/process/FFTDataDistributor.cpp | 2 +- src/util/DataTree.cpp | 13 ++++++++----- src/visual/WaterfallCanvas.cpp | 2 +- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/demod/DemodulatorPreThread.cpp b/src/demod/DemodulatorPreThread.cpp index a92d942..86bac7f 100644 --- a/src/demod/DemodulatorPreThread.cpp +++ b/src/demod/DemodulatorPreThread.cpp @@ -8,7 +8,7 @@ #include "DemodulatorPreThread.h" #include "CubicSDR.h" -DemodulatorPreThread::DemodulatorPreThread() : IOThread(), iqResampler(NULL), iqResampleRatio(1), iqInputQueue(NULL), iqOutputQueue(NULL), threadQueueNotify(NULL), commandQueue(NULL), cModem(nullptr), cModemKit(nullptr) +DemodulatorPreThread::DemodulatorPreThread() : IOThread(), iqResampler(NULL), iqResampleRatio(1), cModem(nullptr), cModemKit(nullptr), iqInputQueue(NULL), iqOutputQueue(NULL), threadQueueNotify(NULL), commandQueue(NULL) { initialized.store(false); diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index cd6d5d2..8047e5a 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -12,7 +12,7 @@ #include #endif -DemodulatorThread::DemodulatorThread(DemodulatorInstance *parent) : IOThread(), iqAutoGain(NULL), audioSampleRate(0), squelchLevel(0), signalLevel(0), squelchEnabled(false), iqInputQueue(NULL), audioOutputQueue(NULL), audioVisOutputQueue(NULL), threadQueueControl(NULL), threadQueueNotify(NULL), cModem(nullptr), cModemKit(nullptr) { +DemodulatorThread::DemodulatorThread(DemodulatorInstance *parent) : IOThread(), iqAutoGain(NULL), audioSampleRate(0), squelchLevel(0), signalLevel(0), squelchEnabled(false), cModem(nullptr), cModemKit(nullptr), iqInputQueue(NULL), audioOutputQueue(NULL), audioVisOutputQueue(NULL), threadQueueControl(NULL), threadQueueNotify(NULL) { demodInstance = parent; muted.store(false); diff --git a/src/process/FFTDataDistributor.cpp b/src/process/FFTDataDistributor.cpp index a2e10db..db121fe 100644 --- a/src/process/FFTDataDistributor.cpp +++ b/src/process/FFTDataDistributor.cpp @@ -1,6 +1,6 @@ #include "FFTDataDistributor.h" -FFTDataDistributor::FFTDataDistributor() : linesPerSecond(DEFAULT_WATERFALL_LPS), lineRateAccum(0.0), fftSize(DEFAULT_FFT_SIZE) { +FFTDataDistributor::FFTDataDistributor() : fftSize(DEFAULT_FFT_SIZE), linesPerSecond(DEFAULT_WATERFALL_LPS), lineRateAccum(0.0) { bufferedItems = 0; } diff --git a/src/util/DataTree.cpp b/src/util/DataTree.cpp index e150307..8fc1f85 100755 --- a/src/util/DataTree.cpp +++ b/src/util/DataTree.cpp @@ -33,7 +33,7 @@ using namespace std; #define STRINGIFY(A) #A -DataElement::DataElement() : data_type(DATA_NULL), data_val(NULL), data_size(0), unit_size(0) { +DataElement::DataElement() : data_type(DATA_NULL), data_size(0), unit_size(0), data_val(NULL) { } DataElement::~DataElement() { @@ -393,11 +393,11 @@ void DataElement::setSerialized(char *ser_str) { /* DataNode class */ -DataNode::DataNode(): ptr(0), parentNode(NULL) { +DataNode::DataNode(): parentNode(NULL), ptr(0) { data_elem = new DataElement(); } -DataNode::DataNode(const char *name_in): ptr(0), parentNode(NULL) { +DataNode::DataNode(const char *name_in): parentNode(NULL), ptr(0) { node_name = name_in; data_elem = new DataElement(); } @@ -1528,7 +1528,7 @@ bool DataTree::SaveToFileXML(const std::string& filename) { bool DataTree::SaveToFile(const std::string& filename, bool compress, int compress_level) { long dataSize, compressedSize, headerSize; - char *serialized, *hdr_serialized, *compressed; + char *serialized = nullptr, *hdr_serialized = nullptr, *compressed = nullptr; DataTree dtHeader; dataSize = getSerialized(&serialized); @@ -1580,7 +1580,10 @@ bool DataTree::SaveToFile(const std::string& filename, bool compress, int compre } bool DataTree::LoadFromFile(const std::string& filename) { - char *compressed, *serialized, *hdr_serialized; +#if USE_FASTLZ + char *compressed; +#endif + char *serialized, *hdr_serialized; long dataSize, headerSize, compressedSize; ifstream fin(filename.c_str(), ios::binary); diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index 2270fa3..ce4630e 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -36,7 +36,7 @@ wxEND_EVENT_TABLE() WaterfallCanvas::WaterfallCanvas(wxWindow *parent, int *attribList) : InteractiveCanvas(parent, attribList), dragState(WF_DRAG_NONE), nextDragState(WF_DRAG_NONE), fft_size(0), waterfall_lines(0), - dragOfs(0), mouseZoom(1), zoom(1), freqMove(0.0), freqMoving(false), hoverAlpha(1.0) { + dragOfs(0), mouseZoom(1), zoom(1), freqMoving(false), freqMove(0.0), hoverAlpha(1.0) { glContext = new PrimaryGLContext(this, &wxGetApp().GetContext(this)); linesPerSecond = 30;