Moving signal ceil/floor for squelch

This commit is contained in:
Charles J. Cliffe 2016-08-10 14:02:25 -04:00
parent a8c4621c82
commit dedac01709
5 changed files with 53 additions and 2 deletions

View File

@ -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());

View File

@ -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);

View File

@ -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();

View File

@ -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;

View File

@ -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;