上海建设行政主管部门网站,海口网站运营托管报价,免费下载app软件的网站,个人网站能做什么webrtc QOS笔记一 Neteq直方图算法浅读 文章目录webrtc QOS笔记一 Neteq直方图算法浅读Histogram Algorithm获取目标延迟遗忘因子曲线Histogram Algorithm
DelayManager::Update()-Histogram::Add() 会根据计算的iat_packet(inter arrival times, 实际包间间隔 / 打包时长…webrtc QOS笔记一 Neteq直方图算法浅读 文章目录webrtc QOS笔记一 Neteq直方图算法浅读Histogram Algorithm获取目标延迟遗忘因子曲线Histogram Algorithm
DelayManager::Update()-Histogram::Add() 会根据计算的iat_packet(inter arrival times, 实际包间间隔 / 打包时长)将该iat_packet插入IATVector直方图对应数组下标内。并更新该直方图的数据下标下概率参数。[M88 SRC]
一共有四步操作
1、用遗忘因子对历史数据的出现概率进行遗忘, 并统计概率合 buckets_[i]buckets_[i]∗forget_factorbuckets\_[i] buckets\_[i] * forget\_factorbuckets_[i]buckets_[i]∗forget_factor
vector_sum∑0buckets.size()buckets_[i]∗forget_factorvector\_sum\sum_{0}^{buckets.size()} buckets\_[i] * forget\_factorvector_sum∑0buckets.size()buckets_[i]∗forget_factor
2、增大本次计算到的IAT的概率值。
buckets_[value]buckets_[value](1−forgetfactor_)buckets\_[value]buckets\_[value](1−forget_factor\_)buckets_[value]buckets_[value](1−forgetfactor_)
vector_sumvector_sum(1−forget_factor_)vector\_sum vector\_sum (1-forget\_factor\_)vector_sumvector_sum(1−forget_factor_)
例
假如历史bucket 数据为:
buckets_ {0010}遗忘因子为 0.9:
forget_factor 0.9新来的抖动延迟数据为66ms 桶间为20ms一个单位, 那插入位置为 66 / 20 3则更新后buckets {000.90.1}假若使用%95分位的值作为目标延迟 则更新后的目标延迟为 60ms.
3、调整本次计算到的IAT的概率使整个IAT的概率分布之和近似为1。调整方式为假设当前概率分布之和为tempSum则
vectorsum1−vectorsumvector_sum1−vector_sumvectorsum1−vectorsum
buckets[n]{buckets_[n]−Min(∣vector_sum∣,buckets_[n]/16)if(vectorsum0)buckets_[n]Min(∣vector_sum∣,buckets_[n]/16)if(vectorsum0)buckets_[n] \begin{cases} buckets\_[n]−Min(∣vector\_sum∣,buckets\_[n]/16) if(vector_sum0) \\ buckets\_[n]Min(∣vector\_sum∣,buckets\_[n]/16) if(vector_sum0) \\ \end{cases} buckets[n]{buckets_[n]−Min(∣vector_sum∣,buckets_[n]/16)if(vectorsum0)buckets_[n]Min(∣vector_sum∣,buckets_[n]/16)if(vectorsum0)
4、更新forget_factor_, 使遗忘因子forget_factor_逼近base_forget_factor_
a.使用start_forget_weight_更新(默认初始值start_forget_weight_ 2base_forget_factor_0.9993)
add_count_add\_count\_add_count_ forget_factor_1−(start_forget_weight_/(add_count_1))forget\_factor\_1−(start\_forget\_weight\_/(add\_count\_1))forget_factor_1−(start_forget_weight_/(add_count_1)) forget_factor_Max(0,Min(base_forget_factor_,forget_factor))forget\_factor\_Max(0,Min(base\_forget\_factor\_,forget\_factor))forget_factor_Max(0,Min(base_forget_factor_,forget_factor))
b. 其中的3是Q30的值没有多大 0.000091552734375 forget_factor_forgetfactor_(base_forget_factor_−forget_factor_3)/4forget\_factor\_forget_factor\_(base\_forget\_factor\_−forget\_factor\_3)/4forget_factor_forgetfactor_(base_forget_factor_−forget_factor_3)/4
获取目标延迟
依据probability获取此百分位的值作为目标延迟(初始值0.97)
∑0nbuckets_[n]probability\sum_{0}^{n} buckets\_[n] probability∑0nbuckets_[n]probability
int Histogram::Quantile(int probability) {// Find the bucket for which the probability of observing an// inter-arrival time larger than or equal to |index| is larger than or// equal to |probability|. The sought probability is estimated using// the histogram as the reverse cumulant PDF, i.e., the sum of elements from// the end up until |index|. Now, since the sum of all elements is 1// (in Q30) by definition, and since the solution is often a low value for// |iat_index|, it is more efficient to start with |sum| 1 and subtract// elements from the start of the histogram.int inverse_probability (1 30) - probability;size_t index 0; // Start from the beginning of |buckets_|.int sum 1 30; // Assign to 1 in Q30.sum - buckets_[index];while ((sum inverse_probability) (index buckets_.size() - 1)) {// Subtract the probabilities one by one until the sum is no longer greater// than |inverse_probability|.index;sum - buckets_[index];}return static_castint(index);
}
遗忘因子曲线
测试曲线,调整遗忘因子提高抖动估计灵敏度:
#include iostream
#include cstdint
#include vectoruint32_t packet_loss_rate_ 0;int main()
{std::vectorint input;std::vectorfloat buckets;float forget_factor 0.9993;float val 0;for (size_t k 0; k 1000; k ) {val val * forget_factor (1-forget_factor);buckets.push_back(val);}for (int i 0; i 1000; i) {std::cout buckets[i] ;}return 0;
}