基于De-Jitter Buffer算法的无线网络业务调度matlab仿真,对比RR调度算法

目录

1.引言

2.算法测试效果

3.算法涉及理论知识概要

3.1 RR调度

3.2 De-Jitter Buffer去抖动缓存调度原理

3.2.1 基础参数定义

3.2.2 De-Jitter Buffer调度

终端滑动窗口时延抖动实时统计上报

基站计算用户抖动调度优先级权重

时隙资源动态分配决策

接收端缓存自适应播放时延调整

多时隙全局抖动与时延迭代收敛

4.核心程序

5.完整算法代码文件获得


1.引言

无线网络传输存在多径衰落、信道随机抖动、排队时延波动、空口竞争冲突等问题,语音、视频等实时业务对端到端时延、时延抖动敏感度极高。轮询调度(RR,Round Robin)是无线网络最经典的均等分时调度方案,逻辑简单、易于硬件落地,但无法适配业务时延抖动差异,易造成实时业务卡顿、非实时业务带宽浪费。De-Jitter Buffer(去抖动缓存)调度以时延抖动抑制为核心,将缓存队列状态、历史时延波动纳入调度决策,兼顾带宽公平性与时延稳定性,广泛应用于5G、WiFi、工业无线专网的流媒体业务调度。

2.算法测试效果

3.算法涉及理论知识概要

3.1 RR调度

RR调度属于无状态均等轮询调度,核心逻辑为:将无线网络内所有接入用户终端按固定顺序循环遍历,每个用户获得一次调度机会,单次调度分配最大可传输数据块,遍历完成后开启下一轮循环。该算法不区分业务类型、时延需求、信道质量,所有用户调度优先级完全均等,本质是时间资源均分,优势是逻辑极简、无复杂统计计算,适配低成本无线通信芯片;短板是对抖动零适配,高速抖动信道下实时业务时延剧烈波动。无线网络场景中,基站空口以无线帧时隙为调度最小单位,RR按时隙轮询分配时隙使用权。

3.2 De-Jitter Buffer去抖动缓存调度原理

De-Jitter Buffer调度分为基站发送侧协同调度 + 终端接收侧去抖动缓存两级联动调度。核心思想:终端统计历史空口传输时延抖动,向基站上报抖动统计参数;基站结合终端抖动缓存占用、业务时延阈值、排队队列长度动态调整调度优先级,优先调度抖动余量不足、缓存即将溢出或空缓存的用户,利用缓存平滑无线随机时延,同时依靠调度降低缓存溢出概率,从传输和缓存两端抑制抖动。该算法面向抖动敏感业务设计,兼顾缓存防溢出、时延上限约束、带宽资源合理分配。

3.2.1 基础参数定义

3.2.2 De-Jitter Buffer调度

终端滑动窗口时延抖动实时统计上报

终端持续接收基站下发数据包,维护长度为W的滑动窗口,不断更新窗口内所有数据包传输时延。窗口内平均时延:

终端将Li(t)、Ji(t)、Bufocc(i,t)周期性上报基站,上报周期匹配无线帧周期。基站依据上报数据区分三类用户:抖动超标用户、缓存濒临溢出用户、缓存空闲用户。

基站计算用户抖动调度优先级权重

De-Jitter调度不固定轮询顺序,依靠动态权重决定调度先后。权重综合抖动超标程度、缓存占用率、时延超标余量,权重越高调度优先级越高。

alpha、beta、gamma为人工配置权重系数,分别对应缓存、平均时延、抖动三项指标的重要程度,实时视频场景gamma取值最大。当缓存接近打满,Rbuf趋近于1,第一项数值激增,基站优先调度避免数据包溢出丢包;抖动超标时第三项为正数,拉高优先级快速下发数据平滑接收侧时延。

时隙资源动态分配决策

与RR固定轮询不同,De-Jitter完全打破顺序,每一次调度都由实时缓存、抖动状态决定。若多个用户权重一致,启用短轮询兜底,保证公平下限。

接收端缓存自适应播放时延调整

终端De-Jitter缓存除配合基站调度,自身通过调整数据包播放时刻抵消时延波动。设置缓存初始播放水位Buf_init,当缓存占用高于初始水位,适当延后播放;低于水位加快播放。

补偿时延等于平均时延加最大抖动区间,保证所有乱序到达数据包全部进入缓存后再播放,无线传输快的数据包在缓存等待,传输慢的数据包到达直接播放,消除时延抖动带来的播放断层。

多时隙全局抖动与时延迭代收敛

基站持续循环执行 “终端上报-权重计算-优先级调度-缓存适配-状态回传”闭环,信道波动发生时权重实时更新,调度策略自适应跟随信道抖动变化。

4.核心程序

MTKL            = 100;
Num_People      = [2:2:30];
Throughput      = 0;
Ind             = 0;
%计算吞吐量
for All_user = Num_People
    Ind = Ind + 1;
    Throughput  = 0;
  
    %利用蒙特卡罗的思想,对一个情况进行多次计算,结果用平均值表示
    for k = 1:MTKL
        rng(All_user*k);
        [k,All_user]
        
        traffic    = func_Stream_traffic(All_user);
        %DE-JITTER-BUFFER调度
        [throughput_user,throughput_times] = func_DE_Jitter_Buffer(traffic,All_user);
        %计算吞吐量
        Throughput = Throughput + sum(throughput_user);
    end
    ALL_throughput(Ind) = Throughput/MTKL;
end

figure;
subplot(211);
plot(Num_People,ALL_throughput,'b-o','LineWidth',1);
title('用户吞吐量');
grid on;
xlabel('用户数量');
ylabel('用户吞吐量');
subplot(212);
plot(throughput_times,'b','LineWidth',1);
title('用户吞吐量');
grid on;
xlabel('时间');
ylabel('用户吞吐量');


save Result.mat Num_People ALL_throughput throughput_times
 
posted @ 2026-08-02 21:37  我爱C编程  阅读(2)  评论(0)    收藏  举报