首页 > 其他分享 >neteq的peak detector解析

neteq的peak detector解析

时间:2024-02-05 20:23:06浏览次数:26  
标签:ElapsedMs period _- peak stopwatch iat detector neteq

neteq 中的峰值检测原理如下:

a) 当interval_arrival_iat_packet 超过 target_level + 2 || interval_arrival_iat_packet > 2 * target_level的时候,认为这是一个峰值点
b) 记录该峰值点的高度(iat_packet)和该峰值点离上一个峰值点的间隔(period), 然后放入记录数组

bool DelayPeakDetector::Update(uint16_t seq, int inter_arrival_time, bool reordered, int target_level) {
  current_iat_ = inter_arrival_time;
  iat_count++;
  if (reordered) {
    reordered_count++;
  }
  if (inter_arrival_time > max_peak_) {
    max_peak_ = inter_arrival_time;
  }
  if (ignore_reordered_packets_ && reordered) {
    return CheckPeakConditions();
  }
  int peak_height = -1;
  if (inter_arrival_time > target_level + peak_detection_threshold_ || inter_arrival_time > 2 * target_level) {
    // A delay peak is observed.
    if (!peak_period_stopwatch_) {
      // This is the first peak. Reset the period counter.
      peak_period_stopwatch_ = tick_timer_->GetNewStopwatch();
    } else if (peak_period_stopwatch_->ElapsedMs() > 0) {
      if (peak_period_stopwatch_->ElapsedMs() <= kMaxPeakPeriodMs) {
        // This is not the first peak, and the period is valid.
        // Store peak data in the vector.
        peak_count++;
        
        //  记录该峰值点的高度(iat_packet)和该峰值点离上一个峰值点的间隔(period), 然后放入记录数组
        Peak peak_data;
        peak_data.period_ms = peak_period_stopwatch_->ElapsedMs() > 1000 ? 1000 : peak_period_stopwatch_->ElapsedMs();
        peak_data.peak_height_packets = inter_arrival_time;
        peak_history_.push_back(peak_data);
        peak_height = peak_data.peak_height_packets;
        //LOGD("peak detect height %d,period %d", inter_arrival_time, peak_period_stopwatch_->ElapsedMs());
        while (peak_history_.size() > kMaxNumPeaks) {
          // Delete the oldest data point.
          peak_history_.pop_front();
        }
        peak_period_stopwatch_ = tick_timer_->GetNewStopwatch();
      } else if (peak_period_stopwatch_->ElapsedMs() <= 2 * kMaxPeakPeriodMs) {
        // Invalid peak due to too long period. Reset period counter and start
        // looking for next peak.
        peak_period_stopwatch_ = tick_timer_->GetNewStopwatch();
      } else {
        // More than 2 times the maximum period has elapsed since the last peak
        // was registered. It seams that the network conditions have changed.
        // Reset the peak statistics.
        Reset();
      }
    }
  }
  // LOGD("[Neteq] iat-peak seq %d,iat %d,peak %d", seq, inter_arrival_time, peak_height);
  MakeSmoothPeak();
  return CheckPeakConditions();
}

c) 当记录数组中出现了峰值点>2个,且此时离峰值点间隔没有超过 2倍的峰值点间隔,则认为还处于检测到峰值点的状态

bool DelayPeakDetector::CheckPeakConditions() {
  size_t s = peak_history_.size();
  if (s >= kMinPeaksToTrigger && peak_period_stopwatch_->ElapsedMs() <= 2 * MaxPeakPeriod()) {
    peak_found_ = true;
  } else {
    peak_found_ = false;
  }
  return peak_found_;
}

d) 每个采样点进来后,会不断判断记录数组中的max_height和当前进来的点的iat,如果进来的采样点的iat比较小,会对记录数组做插值插入新的峰值点,本质是对峰值点做平滑衰减,将peak渐渐平滑下来,知道平滑到接近当前的iat水平后,记录数组不会在加入新的值,就会出发c)的逻辑判断,认为此时不再处于峰值范围

void DelayPeakDetector::MakeSmoothPeak() {
  if (peak_found_) {
    if (peak_period_stopwatch_->ElapsedMs() >= MaxPeakPeriod()) {
      int maxPeakHeight = MaxPeakHeight();
      if (maxPeakHeight > (current_iat_ * 3 / 2) && current_iat_ != 0) {
        // 不断的对历史最高峰值点进行平滑衰减,插入新的峰值点
        // 直到不在高于 1.5的当前iat,既认为接近当前的iat时候,不再插值
        // peak_period_stopwatch_将不再更新,则CheckPeakConditions()认为
        // 不再判定最近有峰值点,脱离峰值状态
				Peak peak_data;
        peak_data.period_ms = peak_period_stopwatch_->ElapsedMs() >= 800 ? 800 : peak_period_stopwatch_->ElapsedMs();//todo 800?hardcode
        peak_data.peak_height_packets = maxPeakHeight * 1 / 2;
        peak_history_.push_back(peak_data);
        // LOGD("[DelayPeakDetector] MakeAutoSmoothPeak peak %d,make peakHeight %d,period %d, ElapsedMs %d",
        //     maxPeakHeight,
        //     peak_data.peak_height_packets,
        //     peak_data.period_ms,
        //     peak_period_stopwatch_->ElapsedMs());
        while (peak_history_.size() > kMaxNumPeaks) {
          // Delete the oldest data point.
          peak_history_.pop_front();
        }
        peak_period_stopwatch_ = tick_timer_->GetNewStopwatch();
      }
    }
  }
}

标签:ElapsedMs,period,_-,peak,stopwatch,iat,detector,neteq
From: https://www.cnblogs.com/ishen/p/18008749

相关文章

  • neteq的RELATIVE_ARRIVAL_DELAY,INTER_ARRIVAL_TIME的抖动计算区别
    正文neteq两种模式:RELATIVE_ARRIVAL_DELAY,INTER_ARRIVAL_TIME,两者计算抖动方式的存在区别如上图所示:RELATIVE_ARRIVAL_DELAY(简称relative_delay)的计算相邻两个点的iat_ms,然后从区间头进行累加到当前(数学展开的话,可以发现是每个包和第一个包求传输延时different)INTER_A......
  • Android系统开发之TimeZoneDetectorService浅析--下
    TimeZoneDetectorService类图可以看出TimeZoneDetectorService类,其具体实现是由TimeZoneDetectorStrategy类完成的。在TimeZoneDetectorService类中,三种更新时区的接口分别为:suggestGeolocationTimeZone()//更新时区主要有三种方式,这是Geolocation方式+booleansuggestManualT......
  • TimeZoneDetectorService浅析--上
    一:问题描述:客户有一个关闭通话功能的需求,根据MTK的配置方法关闭了大概8个宏开关后,实现通话功能,但是导致插好sim卡开机后,时间和时区不能更新的问题。二:问题分析:(1).MTK的日志分析,可以确认为时间已经更新,但是时区确实是没有更新//收到NITZAT:[0]AT<+CTZEU:"+32",0,"2024/01......
  • 【题解 P4197】 Peaks
    Peaks题目描述在Bytemountains有\(n\)座山峰,每座山峰有他的高度\(h_i\)。有些山峰之间有双向道路相连,共\(m\)条路径,每条路径有一个困难值,这个值越大表示越难走。现在有\(q\)组询问,每组询问询问从点\(v\)开始只经过困难值小于等于\(x\)的路径所能到达的山峰中第\(......
  • 大话 JavaScript(Speaking JavaScript):第三十一章到第三十三章
    第三十一章:模块系统和包管理器原文:31.ModuleSystemsandPackageManagers译者:飞龙协议:CCBY-NC-SA4.0JavaScript没有内置模块支持,但社区已经创建了令人印象深刻的解决方法。要管理模块,可以使用所谓的包管理器,它们处理发现、安装、依赖管理等。模块系统JavaScript模......
  • 大话 JavaScript(Speaking JavaScript):第二十一章到第二十五章
    第二十一章:数学原文:21.Math译者:飞龙协议:CCBY-NC-SA4.0Math对象用作多个数学函数的命名空间。本章提供了一个概述。数学属性Math的属性如下:Math.E欧拉常数(e)Math.LN22的自然对数Math.LN1010的自然对数Math.LOG2Ee的底数2对数Math.LOG10Ee的十进制对数Ma......
  • 大话 JavaScript(Speaking JavaScript):第二十六章到第三十章
    第四部分:提示,工具和库原文:IV.Tips,Tools,andLibraries译者:飞龙协议:CCBY-NC-SA4.0本部分提供了使用JavaScript的技巧(最佳实践,高级技术和学习资源),并描述了一些重要的工具和库。第二十六章:元代码风格指南原文:26.AMetaCodeStyleGuide译者:飞龙协议:CCBY-NC-SA......
  • 大话 JavaScript(Speaking JavaScript):第十一章到第十五章
    第十一章:数字原文:11.Numbers译者:飞龙协议:CCBY-NC-SA4.0JavaScript对所有数字都使用单一类型:它将它们全部视为浮点数。但是,如果小数点后没有数字,则不显示小数点:>5.0005在内部,大多数JavaScript引擎都会优化并区分浮点数和整数(详情请参见JavaScript中的整数)。但这......
  • 大话 JavaScript(Speaking JavaScript):第十六章到第二十章
    第十六章:变量:作用域、环境和闭包原文:16.Variables:Scopes,Environments,andClosures译者:飞龙协议:CCBY-NC-SA4.0本章首先解释了如何使用变量,然后详细介绍了它们的工作方式(环境、闭包等)。声明变量在JavaScript中,您在使用变量之前通过var语句声明变量:varfoo;foo......
  • 大话 JavaScript(Speaking JavaScript):第一章到第五章
    第一部分:JavaScript快速入门原文:I.JavaScriptQuickStart译者:飞龙协议:CCBY-NC-SA4.0这部分是JavaScript的一个独立快速介绍。你可以在不阅读本书中的其他内容的情况下理解它,本书的其他部分也不依赖于它的内容。然而,阅读本书的提示在阅读本书的提示中适用。第一章:基......