From 9623226b0c2000335cfa88ce79e2fd4ff7bee60c Mon Sep 17 00:00:00 2001 From: Elliott Liggett Date: Wed, 24 Aug 2022 16:06:41 -0700 Subject: [PATCH] Added average metering. --- audioconverter.cpp | 2 +- meter.cpp | 16 ++++++++++++++++ meter.h | 1 + wfmain.cpp | 21 +++++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/audioconverter.cpp b/audioconverter.cpp index d97da05..d25f3f5 100644 --- a/audioconverter.cpp +++ b/audioconverter.cpp @@ -158,7 +158,7 @@ bool audioConverter::convert(audioPacket audio) { audio.amplitudePeak = samplesF.array().abs().maxCoeff(); - audio.amplitudeRMS = samplesF.squaredNorm(); + audio.amplitudeRMS = samplesF.array().abs().mean(); // Set the volume samplesF *= audio.volume; diff --git a/meter.cpp b/meter.cpp index 324136d..34dfa01 100644 --- a/meter.cpp +++ b/meter.cpp @@ -320,6 +320,22 @@ void meter::setLevel(int current) this->update(); } +void meter::setLevels(int current, int peak) +{ + this->current = current; + this->peak = peak; + + avgLevels[(avgPosition++)%averageBalisticLength] = current; + int sum=0; + for(unsigned int i=0; i < (unsigned int)std::min(avgPosition, (int)avgLevels.size()); i++) + { + sum += avgLevels.at(i); + } + this->average = sum / std::min(avgPosition, (int)avgLevels.size()); + + this->update(); +} + void meter::setLevels(int current, int peak, int average) { this->current = current; diff --git a/meter.h b/meter.h index 073a443..4e03ced 100644 --- a/meter.h +++ b/meter.h @@ -24,6 +24,7 @@ public slots: void updateDrawing(int num); void setLevels(int current, int peak, int average); + void setLevels(int current, int peak); // calculate avg void setLevel(int current); void clearMeterOnPTTtoggle(); void clearMeter(); diff --git a/wfmain.cpp b/wfmain.cpp index 1cc79a0..5a5ce6b 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -623,6 +623,26 @@ void wfmain::receiveStatusUpdate(networkStatus status) void wfmain::receiveNetworkAudioLevels(networkAudioLevels l) { + meterKind m2mtr = ui->meter2Widget->getMeterType(); + if(m2mtr == meterAudio) + { + if(amTransmitting) + { + if(l.haveTxLevels) + ui->meter2Widget->setLevels(l.txAudioRMS, l.txAudioPeak); + } else { + if(l.haveRxLevels) + ui->meter2Widget->setLevels(l.rxAudioRMS, l.rxAudioPeak); + } + } else if (m2mtr == meterTxMod) { + if(l.haveTxLevels) + ui->meter2Widget->setLevels(l.txAudioRMS, l.txAudioPeak); + } else if (m2mtr == meterRxAudio) { + if(l.haveRxLevels) + ui->meter2Widget->setLevels(l.rxAudioRMS, l.rxAudioPeak); + } + + /* meterKind m = meterNone; if(l.haveRxLevels) { @@ -634,6 +654,7 @@ void wfmain::receiveNetworkAudioLevels(networkAudioLevels l) m = meterTxMod; receiveMeter(m, l.txAudioRMS); } + */ } void wfmain::setupPlots()