mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2024-11-15 16:41:54 -05:00
Moving signal ceil/floor for squelch
This commit is contained in:
parent
a8c4621c82
commit
dedac01709
@ -1402,7 +1402,11 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
demodWaterfallCanvas->setBandwidth(demodBw);
|
demodWaterfallCanvas->setBandwidth(demodBw);
|
||||||
demodSpectrumCanvas->setBandwidth(demodBw);
|
demodSpectrumCanvas->setBandwidth(demodBw);
|
||||||
}
|
}
|
||||||
|
|
||||||
demodSignalMeter->setLevel(demod->getSignalLevel());
|
demodSignalMeter->setLevel(demod->getSignalLevel());
|
||||||
|
demodSignalMeter->setMin(demod->getSignalFloor());
|
||||||
|
demodSignalMeter->setMax(demod->getSignalCeil());
|
||||||
|
|
||||||
demodGainMeter->setLevel(demod->getGain());
|
demodGainMeter->setLevel(demod->getGain());
|
||||||
if (demodSignalMeter->inputChanged()) {
|
if (demodSignalMeter->inputChanged()) {
|
||||||
demod->setSquelchLevel(demodSignalMeter->getInputValue());
|
demod->setSquelchLevel(demodSignalMeter->getInputValue());
|
||||||
|
@ -257,6 +257,14 @@ float DemodulatorInstance::getSignalLevel() {
|
|||||||
return demodulatorThread->getSignalLevel();
|
return demodulatorThread->getSignalLevel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float DemodulatorInstance::getSignalFloor() {
|
||||||
|
return demodulatorThread->getSignalFloor();
|
||||||
|
}
|
||||||
|
|
||||||
|
float DemodulatorInstance::getSignalCeil() {
|
||||||
|
return demodulatorThread->getSignalCeil();
|
||||||
|
}
|
||||||
|
|
||||||
void DemodulatorInstance::setSquelchLevel(float signal_level_in) {
|
void DemodulatorInstance::setSquelchLevel(float signal_level_in) {
|
||||||
demodulatorThread->setSquelchLevel(signal_level_in);
|
demodulatorThread->setSquelchLevel(signal_level_in);
|
||||||
wxGetApp().getDemodMgr().setLastSquelchLevel(signal_level_in);
|
wxGetApp().getDemodMgr().setLastSquelchLevel(signal_level_in);
|
||||||
|
@ -63,6 +63,8 @@ public:
|
|||||||
void setSquelchEnabled(bool state);
|
void setSquelchEnabled(bool state);
|
||||||
|
|
||||||
float getSignalLevel();
|
float getSignalLevel();
|
||||||
|
float getSignalFloor();
|
||||||
|
float getSignalCeil();
|
||||||
void setSquelchLevel(float signal_level_in);
|
void setSquelchLevel(float signal_level_in);
|
||||||
float getSquelchLevel();
|
float getSquelchLevel();
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
DemodulatorThread::DemodulatorThread(DemodulatorInstance *parent)
|
DemodulatorThread::DemodulatorThread(DemodulatorInstance *parent)
|
||||||
: IOThread(), outputBuffers("DemodulatorThreadBuffers"), squelchLevel(-100),
|
: IOThread(), outputBuffers("DemodulatorThreadBuffers"), squelchLevel(-100),
|
||||||
signalLevel(-100), squelchEnabled(false) {
|
signalLevel(-100), signalFloor(-30), signalCeil(30), squelchEnabled(false) {
|
||||||
|
|
||||||
demodInstance = parent;
|
demodInstance = parent;
|
||||||
muted.store(false);
|
muted.store(false);
|
||||||
@ -114,6 +114,33 @@ void DemodulatorThread::run() {
|
|||||||
currentSignalLevel = DEMOD_SIGNAL_MIN+1;
|
currentSignalLevel = DEMOD_SIGNAL_MIN+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float sampleTime = float(inp->data.size()) / float(inp->sampleRate);
|
||||||
|
float sf = signalFloor.load(), sc = signalCeil.load(), sl = squelchLevel.load();
|
||||||
|
|
||||||
|
if (currentSignalLevel > sc) {
|
||||||
|
sc = currentSignalLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentSignalLevel < sf) {
|
||||||
|
sf = currentSignalLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sl+1.0f > sc) {
|
||||||
|
sc = sl+1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((sf+2.0f) > sc) {
|
||||||
|
sc = sf+2.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
sc -= (sc - (currentSignalLevel + 2.0f)) * sampleTime * 0.15f;
|
||||||
|
sf += ((currentSignalLevel - 5.0f) - sf) * sampleTime * 0.15f;
|
||||||
|
|
||||||
|
signalFloor.store(sf);
|
||||||
|
signalCeil.store(sc);
|
||||||
|
|
||||||
|
// std::cout << "sf:" << sf << "sc: " << sc << std::endl;
|
||||||
|
|
||||||
std::vector<liquid_float_complex> *inputData;
|
std::vector<liquid_float_complex> *inputData;
|
||||||
|
|
||||||
inputData = &inp->data;
|
inputData = &inp->data;
|
||||||
@ -330,6 +357,14 @@ float DemodulatorThread::getSignalLevel() {
|
|||||||
return signalLevel.load();
|
return signalLevel.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float DemodulatorThread::getSignalFloor() {
|
||||||
|
return signalFloor.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
float DemodulatorThread::getSignalCeil() {
|
||||||
|
return signalCeil.load();
|
||||||
|
}
|
||||||
|
|
||||||
void DemodulatorThread::setSquelchLevel(float signal_level_in) {
|
void DemodulatorThread::setSquelchLevel(float signal_level_in) {
|
||||||
if (!squelchEnabled) {
|
if (!squelchEnabled) {
|
||||||
squelchEnabled = true;
|
squelchEnabled = true;
|
||||||
|
@ -30,6 +30,8 @@ public:
|
|||||||
bool isMuted();
|
bool isMuted();
|
||||||
|
|
||||||
float getSignalLevel();
|
float getSignalLevel();
|
||||||
|
float getSignalCeil();
|
||||||
|
float getSignalFloor();
|
||||||
void setSquelchLevel(float signal_level_in);
|
void setSquelchLevel(float signal_level_in);
|
||||||
float getSquelchLevel();
|
float getSquelchLevel();
|
||||||
|
|
||||||
@ -46,7 +48,7 @@ protected:
|
|||||||
std::atomic_bool muted;
|
std::atomic_bool muted;
|
||||||
|
|
||||||
std::atomic<float> squelchLevel;
|
std::atomic<float> squelchLevel;
|
||||||
std::atomic<float> signalLevel;
|
std::atomic<float> signalLevel, signalFloor, signalCeil;
|
||||||
bool squelchEnabled, squelchBreak;
|
bool squelchEnabled, squelchBreak;
|
||||||
|
|
||||||
Modem *cModem = nullptr;
|
Modem *cModem = nullptr;
|
||||||
|
Loading…
Reference in New Issue
Block a user