UDPSink buffer: implemented R/W pointer skew auto compensation optimization with average pulling

This commit is contained in:
f4exb 2017-08-16 16:09:35 +02:00
parent 8f3473eede
commit c5343f4c99
4 changed files with 48 additions and 6 deletions

View File

@ -29,6 +29,8 @@ UDPSink::UDPSink(MessageQueue* uiMessageQueue, UDPSinkGUI* udpSinkGUI, BasebandS
m_spectrum(spectrum), m_spectrum(spectrum),
m_magsq(1e-10), m_magsq(1e-10),
m_movingAverage(16, 0), m_movingAverage(16, 0),
m_sampleRateSum(0),
m_sampleRateAvgCounter(0),
m_settingsMutex(QMutex::Recursive) m_settingsMutex(QMutex::Recursive)
{ {
setObjectName("UDPSink"); setObjectName("UDPSink");
@ -167,7 +169,38 @@ bool UDPSink::handleMessage(const Message& cmd)
{ {
UDPSinkMessages::MsgSampleRateCorrection& cfg = (UDPSinkMessages::MsgSampleRateCorrection&) cmd; UDPSinkMessages::MsgSampleRateCorrection& cfg = (UDPSinkMessages::MsgSampleRateCorrection&) cmd;
m_actualInputSampleRate += cfg.getCorrectionFactor() * m_actualInputSampleRate; m_actualInputSampleRate += cfg.getCorrectionFactor() * m_actualInputSampleRate;
qDebug("UDPSink::handleMessage: MsgSampleRateCorrection: corr: %f new rate: %f", cfg.getCorrectionFactor(), m_actualInputSampleRate);
if ((cfg.getRawDeltaRatio() > -0.05) || (cfg.getRawDeltaRatio() < 0.05))
{
if (m_sampleRateAvgCounter < m_sampleRateAverageItems)
{
m_sampleRateSum += m_actualInputSampleRate;
m_sampleRateAvgCounter++;
}
}
else
{
m_sampleRateSum = 0.0;
m_sampleRateAvgCounter = 0;
}
if (m_sampleRateAvgCounter == m_sampleRateAverageItems)
{
float avgRate = m_sampleRateSum / m_sampleRateAverageItems;
qDebug("UDPSink::handleMessage: MsgSampleRateCorrection: corr: %f new rate: %f: avg rate: %f",
cfg.getCorrectionFactor(),
m_actualInputSampleRate,
avgRate);
m_actualInputSampleRate = avgRate;
m_sampleRateSum = 0.0;
m_sampleRateAvgCounter = 0;
}
else
{
qDebug("UDPSink::handleMessage: MsgSampleRateCorrection: corr: %f new rate: %f",
cfg.getCorrectionFactor(),
m_actualInputSampleRate);
}
m_settingsMutex.lock(); m_settingsMutex.lock();
m_interpolatorDistanceRemain = 0; m_interpolatorDistanceRemain = 0;
@ -233,6 +266,8 @@ void UDPSink::apply(bool force)
m_interpolator.create(48, m_config.m_inputSampleRate, m_config.m_rfBandwidth / 2.2, 3.0); m_interpolator.create(48, m_config.m_inputSampleRate, m_config.m_rfBandwidth / 2.2, 3.0);
m_actualInputSampleRate = m_config.m_inputSampleRate; m_actualInputSampleRate = m_config.m_inputSampleRate;
m_udpHandler.resetReadIndex(); m_udpHandler.resetReadIndex();
m_sampleRateSum = 0.0;
m_sampleRateAvgCounter = 0;
m_settingsMutex.unlock(); m_settingsMutex.unlock();
} }

View File

@ -199,9 +199,13 @@ private:
UDPSinkUDPHandler m_udpHandler; UDPSinkUDPHandler m_udpHandler;
Real m_actualInputSampleRate; //!< sample rate with UDP buffer skew compensation Real m_actualInputSampleRate; //!< sample rate with UDP buffer skew compensation
double m_sampleRateSum;
int m_sampleRateAvgCounter;
QMutex m_settingsMutex; QMutex m_settingsMutex;
static const int m_sampleRateAverageItems = 17;
void apply(bool force); void apply(bool force);
void modulateSample(); void modulateSample();
}; };

View File

@ -30,18 +30,21 @@ public:
public: public:
float getCorrectionFactor() const { return m_correctionFactor; } float getCorrectionFactor() const { return m_correctionFactor; }
float getRawDeltaRatio() const { return m_rawDeltaRatio; }
static MsgSampleRateCorrection* create(float correctionFactor) static MsgSampleRateCorrection* create(float correctionFactor, float rawDeltaRatio)
{ {
return new MsgSampleRateCorrection(correctionFactor); return new MsgSampleRateCorrection(correctionFactor, rawDeltaRatio);
} }
private: private:
float m_correctionFactor; float m_correctionFactor;
float m_rawDeltaRatio;
MsgSampleRateCorrection(float correctionFactor) : MsgSampleRateCorrection(float correctionFactor, float rawDeltaRatio) :
Message(), Message(),
m_correctionFactor(correctionFactor) m_correctionFactor(correctionFactor),
m_rawDeltaRatio(rawDeltaRatio)
{ } { }
}; };
}; };

View File

@ -150,7 +150,7 @@ void UDPSinkUDPHandler::advanceReadPointer(int nbBytes)
float dd = d - m_d; // derivative float dd = d - m_d; // derivative
float c = (d / 15.0) + (dd / 20.0); // damping and scaling float c = (d / 15.0) + (dd / 20.0); // damping and scaling
c = c < -0.05 ? -0.05 : c > 0.05 ? 0.05 : c; // limit c = c < -0.05 ? -0.05 : c > 0.05 ? 0.05 : c; // limit
UDPSinkMessages::MsgSampleRateCorrection *msg = UDPSinkMessages::MsgSampleRateCorrection::create(c); UDPSinkMessages::MsgSampleRateCorrection *msg = UDPSinkMessages::MsgSampleRateCorrection::create(c, d);
if (m_feedbackMessageQueue) { if (m_feedbackMessageQueue) {
m_feedbackMessageQueue->push(msg); m_feedbackMessageQueue->push(msg);