WebRTC 拥塞控制 | Trendline 滤波器

news2024/11/15 23:23:08

1.指数平滑


1.1一次指数平滑法(Single Exponential Smoothing)

指数平滑法(Exponential Smoothing) 是在移动平均法基础上发展起来的一种时间序列分析预测法,它是通过计算指数平滑值,配合一定的时间序列预测模型对现象的未来进行预测。其原理是任一期的指数平滑值都是本期实际观察值与前一期指数平滑值的加权平均,因此也是一种特殊的加权平均法。一次指数平滑法预测公式如下:

  • 为 t+1 时刻的一次指数平滑趋势预测值

  • 为 t 时刻的一次指数平滑趋势预测值

  • 为 t 时刻的实际观察值

  • 为权重系数,也称为指数平滑系数

再来看百度百科对指数平滑法[1]的一段描述:

简单的全期平均法是对时间数列的过去数据一个不漏地全部加以同等利用;移动平均法则不考虑较远期的数据,并在加权移动平均法中给予近期数据更大的权重;而指数平滑法则兼容了全期平均和移动平均所长,不舍弃过去的数据,但是仅给予逐渐减弱的影响程度,即随着数据的远离,赋予逐渐收敛为零的权数。

同理,可以将 的表示代入公式 (3),最后得到的通用公式

1.2指数平滑系数(Smoothing Coeff)

指数平滑系数的选择的原则如下:

  1. 如果时间序列波动不大,比较平稳,则平滑系数应取小一点,以减少修正幅度,使预测模型能包含较长时间序列的信息。

  1. 如果时间序列具有迅速且明显的变动倾向,则平滑系数应取大一点,以使预测模型灵敏度高些,以便迅速跟上数据的变化。

在 WebRTC 发送端基于延迟的拥塞控制中,累计延迟梯度的指数平滑系数为 0.9。

2.最小二乘法求解线性回归


2.1线性回归(Linear Regression)

如果预测的变量是连续的,我们称其为回归。回归分析中,如果只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归或者简单线性回归。线性回归过程主要解决的就是如何通过样本来获取最佳的拟合线

2.2最小二乘法(Least Square)

也称最小平方法[2],是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。

简单线性回归最常用的方法便是最小二乘法,其数学推导过程如下:

3.源码分析


基于 WebRTC M71 版本。

3.1 Trendline 滤波器参数

Trendline 滤波器的三个重要参数分别是:窗口大小、平滑系数、延迟梯度趋势的增益。

窗口大小决定收到多少包组之后开始计算延迟梯度趋势;平滑系数用于累计延迟梯度的一次指数平滑计算;对累计延迟梯度平滑值进行最小二乘法线性回归之后求得延迟梯度趋势,会乘以增益并和阈值作比较,以检测带宽使用状态。下面是 WebRTC 中这三个参数的默认值。

constexpr size_t

kDefaultTrendlineWindowSize = 20;

constexpr double

kDefaultTrendlineSmoothingCoeff = 0.9;

constexpr double

kDefaultTrendlineThresholdGain = 4.0;

3.2 LinearFitSlope 函数

该函数使用最小二乘法求解线性回归,输入 window_size_ 个样本点(arrival_time_ms, smoothed_delay),输出延迟梯度变化趋势的拟合直线斜率 trendline_slope。

absl::optional<double> LinearFitSlope(

const std::deque<std::pair<double, double>>& points);

求解过程完全参照公式 (7)。

3.3 Update 函数

该函数输入包组间到达时间差与发送时间差以及包组的到达时间,并估计延迟梯度的趋势。

class TrendlineEstimator {

public:

void Update(

double recv_delta_ms,

double send_delta_ms,

int64_t arrival_time_ms);

};

该函数是 Trendline 滤波器的核心实现,包括:

  1. 计算延迟梯度

  1. 计算累计延迟梯度的一次指数平滑值

  1. 最小二乘法线性回归求延迟梯度趋势斜率

  1. 检测带宽使用状态,比如是否过载

  1. 更新延迟梯度趋势动态阈值

本篇介绍前 3 个实现过程。

  • 计算延迟梯度

const double delta_ms =

recv_delta_ms - send_delta_ms;

上一篇已经介绍过延迟梯度的计算公式:

d(i) = inter-arrival - inter-depature

那么延迟梯度为何能作为网络拥塞的标志呢?

当网络没有拥塞,延迟梯度:t2 - t1- (T2 - T1) = 0,如下图所示。

网络正常

当网络存在拥塞,数据包经过 router 节点时经历排队等待,导致到达时间比原本要晚,延迟梯度:t2 - t1- (T2 - T1) > 0,如下图所示。

网络拥塞

因此,延迟梯度可以作为网络拥塞的指示。把一段时间内的数据包组的延迟梯度累加平滑回归,最终得到延迟梯度的趋势,这就是 Trendline 滤波器要做的事情。

  • 累计延迟梯度一次指数平滑

// Exponential backoff filter.

accumulated_delay_ += delta_ms;

smoothed_delay_ = smoothing_coef_ * smoothed_delay_ +

(1 - smoothing_coef_) * accumulated_delay_;

注意,计算一次指数平滑值的公式为 ,实际观测值前面的系数为 。而上述源码的计算公式的实际观测值 accumulated_delay_ 的平滑系数为

,形式不一,但本质不变。

smoothing_coef_ 取 0.9,那么 accumulated_delay_ 前的平滑系数为 0.1,这意味着新的延迟梯度观测值的变化对平滑值的影响较小,减少了修正幅度。

上面提到的指数平滑系数的选择的原则:当时间序列波动不大,比较平稳的时候会选择较小的系数。

  • 最小二乘法线性回归求延迟梯度趋势斜率

累计延迟梯度平滑值 smoothed_delay_ 计算出来之后将作为 y 轴的数据与作为 x 轴数据的到达时间序列存入队列。当样本点的数量达到滤波器的窗口大小,开始使用最小二乘法求解线性回归,LinearFitSlope 函数实现了这个过程。

// Simple linear regression.

// Update trend_ if it is possible to fit a line to the data. The delay

// trend can be seen as an estimate of (send_rate - capacity)/capacity.

delay_hist_.push_back(std::make_pair(

static_cast<double>(arrival_time_ms - first_arrival_time_ms_),

smoothed_delay_));

trend = LinearFitSlope(delay_hist_).value_or(trend);

最终得到了线性回归的解:延迟梯度的变化趋势 trend,其实就是很多离散的样本点的拟合直线斜率。这个预测的斜率值 trend 可以表征网络的拥塞程度(网络缓冲区,即路由器数据包排队的消涨情况):

  1. 0 < trend < 1,数据包延迟不断加大,路由器缓冲队列长度持续增加,直到网络缓冲区被填满。

  1. trend == 0,数据包延迟恒定,路由器缓冲区队列长度不变。

  1. trend < 0,数据包延迟不断减少,路由器缓冲区队列长度不断减少,直到队列为空。

4.测试用例


下面进行简单的测试,将 Trendline 滤波器窗口设置为 20,平滑系数设置为 0.9,增益设置为 1。按照 slope = 0.5 的期望延迟梯度趋势斜率构造了 41 个包组,测试输出如下:

测试输出

当样本点到达窗口大小 20 时,开始线性回归求解延迟梯度趋势斜率,x 代表包组到达时间与首个包组到达时间的差值,y 代表延迟梯度平滑值。可以看到,随着样本数量增多,斜率值逼近期望值 0.5。

为了有更直观的认识,我将测试数据导入 Minitab Express,进行一次指数平滑计算,如下图:

一次指数平滑

可以看到,一次指数平滑法进行预测,预测趋势与实际变动趋势一致,但预测值比实际值滞后,这是指数平滑法的一个缺点。一次指数平滑法优点在于它在计算中将所有的观察值考虑在内,对各期按时期的远近赋予不同的权重,使预测值更接近实际观察值。

继续对计算完成的延迟梯度的平滑值进行简单的线性回归,如下图:

简单线性回归

回归公式(Regression Equation):C3 = − 27.641 + 0.416902C1,求得的拟合直线的斜率为 0.416902,加大样本的数据量,线性回归模型的预测会更加接近 0.5。

至此,延迟梯度趋势的计算过程介绍完毕,这个趋势值要与动态阈值进行比较,以检测网络带宽使用是否过载,下一篇会介绍这个过程,感谢阅读。

原文链接:Trendline 滤波器 - 资料 - 我爱音视频网 - 构建全国最权威的音视频技术交流分享论坛

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

fiddler抓包实战(1),模拟手机弱网测试,判断BUG来自客户端还是服务端

手机app中常见的测试之一就是弱网测试&#xff0c;什么是弱网测试呢?顾名思义就是模拟弱网的时候用户对于手机的一些操作和响应是否成功&#xff0c;在使用的过程中是否能够正常的使用 手机端常见弱网测试方法就是切换5G、4G、3G、2G这样 Web中就可以直接模拟打开F12然后就可…

Linux C++ 内存映射文件及其应用

Linux C 内存映射文件及其应用一. 原理二. 应用场景1. 实现多进程通信2. 实现内存持久化3.实现读写大文件三. 问答参考链接一. 原理 内存映射文件&#xff0c;是从一个文件到一块内存的映射。 内存映射文件与虚拟内存有些类似&#xff0c;通过内存映射文件可以将文件与内存中一…

【ESP32+freeRTOS学习笔记-(十)任务通知机制】

目录1、任务通知&#xff08;Task Notifications&#xff09;概念1.1 概念1.2 使用任务通知的优势1.3 无法使用任务通知的场景2、使用任务通知2.1 xTaskNotifyGive()2.2 ulTaskNotifyTake()2.3 使用任务通知代替信号量&#xff0c;方法12.4 使用任务通知代替信号量&#xff0c;…

mtd和嵌入式系统分区

一. MTD介绍 嵌入式系统的磁盘分区情况&#xff0c;一般由mtd来表示。 MTD&#xff08;Memory Technology Device)&#xff1a;内存技术设备是Linux的存储设备中的一个子系统。其设计此系统的目的是&#xff0c;对于内存类的设备&#xff0c;提供一个抽象层&#xff0c;一个接口…

【计算机三级网络技术】 第五篇 局域网技术基础及应用

文章目录一、局域网组网基础知识1.局域网的主要特征2.局域网标准3.交换式局域网4.虚拟局域网技术二、综合布线基本概念1.综合布线系统的组成2.综合布线的优点3.综合布线的设计等级4综合布线系统标准三、局域网互联设备1.中继器2.集线器3.网桥&#xff08;Bridge&#xff09;4.交…

eKuiper 1.8.0 发布:零代码实现图像/视频流的实时 AI 推理

LF Edge eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源软件&#xff0c;可以运行在各类资源受限的边缘设备上。eKuiper 的主要目标是在边缘端提供一个流媒体软件框架&#xff08;类似于 Apache Flink &#xff09;。eKuiper 的规则引擎允许用户提供基于 SQL 或基…

10_创建和管理表

表操作基础1.1 一条数据存储的过程存储数据是处理数据的第一步 。只有正确地把数据存储起来&#xff0c;我们才能进行有效的处理和分析。否则&#xff0c;只能是一团乱麻&#xff0c;无从下手。那么&#xff0c;怎样才能把用户各种经营相关的、纷繁复杂的数据&#xff0c;有序、…

CIMCAI intelligent railway logistics world leading container AI

港航人工智能/集装箱人工智能领军企业CIMCAI&#xff0c;多式联运智能化铁路货运智能化方案&#xff0c;全自动化集装箱识别数字化海运铁路运输集装箱管理。CIMCAI中集飞瞳是世界应用落地最广&#xff0c;规模最大&#xff0c;最先进的的集装箱人工智能高科技企业。世界集装箱A…

一文读懂PaddleSpeech中英混合语音识别技术

语音识别技术能够让计算机理解人类的语音&#xff0c;从而支持多种语音交互的场景&#xff0c;如手机应用、人车协同、机器人对话、语音转写等。然而&#xff0c;在这些场景中&#xff0c;语音识别的输入并不总是单一的语言&#xff0c;有时会出现多语言混合的情况。例如&#…

PMP怎么对项目工程师的职业生涯产生影响?

职业生涯的影响无非两个&#xff1a; 工作能力增强升职加薪 考取证书你能获得&#xff1a; a、全面的、科学的、专业的项目管理架构理论知识; b、经过模拟实践题的联系&#xff0c;项目经验可以媲美拥有三年以上的项目管理经验的项目管理人士; c、所学的知识基础与实践已经获得…

flutter 优化检测工具

本篇内容主要结合我的另一篇文章flutter 开发App优化之旅同步补充的一篇文章&#xff0c;以供各位攻城狮借鉴共勉。 1、Flutter Inspector (debug模式下) Flutter Inspector有很多功能&#xff0c;其中有两个功能更值得我们去关注&#xff0c;例如&#xff1a;“Select Widget…

Python+Yolov5跌倒检测 摔倒检测 人物目标行为 人体特征识别

PythonYolov5跌倒检测 摔倒检测 人物目标行为 人体特征识别如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<PythonYolov5跌倒摔倒人体特征识别>>编写代码&#xff0c;代码整洁&…

Torch中常见插值方式及各自的优缺点

Pytorch常见插值方式及优缺点1 插值算法2 Pytorch中能看到的插值方式3 Nearest插值法3.1 方法介绍3.2 优缺点4 Linear插值法4.1 方法接受4.2 优缺点5 Bilinear插值法5.1 方法介绍5.2 优缺点6 Bicubic插值法6.1 方法介绍6.2 优缺点7 Trlinear插值法7.1 方法介绍7.2 优缺点8 图片…

C#窗体应用程序可能会遇到的一些奇怪问题

最近在上程序实训课&#xff0c;写一个管理程序&#xff0c;主要是用了C#&#xff0c;在VS2017平台&#xff0c;在开发过程中自然是少不了很多奇怪的问题&#xff0c;做个记录。 有下面几个问题: 问题1&#xff1a;.Conversion failed when converting from a character stri…

小红书“复刻”微信,微信“内造”小红书

配图来自Canva可画 随着互联网增长红利逐渐见顶&#xff0c;各大互联网平台对流量的争夺变得愈发激烈。而为了寻找新的业务可能性&#xff0c;各家都在不遗余力地拓宽自身边界。在此背景下&#xff0c;目前最为“吸睛”和“吸金”的社交、电商、种草、短视频等领域&#xff0c…

linux创建文件软连接和硬链接详解

前言linux系统中链接文件仔细区分可以分为软连接&#xff08;符号链接&#xff09;和硬链接。软链接比硬链接应用更广泛&#xff0c;所以也可以认为linux链接文件就是指软链接文件。本文将会在第2部分介绍创建软链接和硬链接的基本命令&#xff0c;在第3部分从linux文件系统的角…

Gated Activations门控激活单元

门控激活 在架构图的方框部分&#xff0c;您会注意到扩张卷积输出分成两个分支&#xff0c;随后通过逐元素乘法重新组合。这描绘了一个门控激活单元&#xff0c;其中我们将tanh激活分支解释为一个学习过滤器&#xff0c;将sigmoid激活分支解释为一个学习门&#xff0c;用于调节…

(五十五)大白话更新数据的时候,自动维护的聚簇索引到底是什么?

上一次我们给大家讲了一下基于主键如何组织一个索引&#xff0c;然后建立索引之后&#xff0c;如何基于主键在索引中快速定位到那行数据所在的数据页&#xff0c;再如何进入数据页快速到定位那行数据&#xff0c;大家看下面的图。 我们今天就先基于上面的图&#xff0c;把按照主…

·神经网络

目录11神经网络demo112神经网络demo213神经网络demo320tensorflow2.0 安装教程,所有安装工具&#xff08;神经网络&#xff09;21神经网络-线性回归- demo122神经网络-线性回归- demo228神经网络-多层感知- demo1目录11神经网络demo1 package com.example.xxx; import java.ut…

玩转qsort——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容还是我们的深度剖析指针呀&#xff0c;上篇博客我们学习了回调函数这个知识点&#xff0c;但是没有写完&#xff0c;因为&#xff1a;小雅兰觉得qsort值得单独写出来&#xff01;&#xff01;&#xff01;好啦&#xff0c;就…