e-model算法

转载自:   http://blog.csdn.net/chidaidl/article/details/4809671


 

[置顶] Java source code for calculating E-Model R value

  269人阅读  评论(0)  收藏  举报

The Mean Opinion Score (MOS) test is a well acccepted standard which is defined in the ITU-T Rec.P.800. The value of MOS test is generated by letting large number of listeners to evaluate the quality of the test sentences.  The test scores are averaged to a mean score which range from 1 to 5, 1 being the worst and 5 being the best.


The E-model which is defined by ITU-T Rec.G.107 is a computational model converting all parameters that affect a voice call into a single rating value R.

 

A VB source code was provided in G.107 for calculating R value. But considering not everybody knows VB, I would like to share some java code I used before.

 

[java]  view plain copy
  1. public class VoIPCalculator {  
  2.     /** 
  3.      * This function returns R value calculated by using the passed in parameters 
  4.      * See detail of each parameter in ITU-T G.107  
  5.      * @param T 
  6.      * @param Ppl 
  7.      * @param SLR 
  8.      * @param RLR 
  9.      * @param Ds 
  10.      * @param STMR 
  11.      * @param Dr 
  12.      * @param TELR 
  13.      * @param WEPL 
  14.      * @param Ie 
  15.      * @param BPL 
  16.      * @param BurstR 
  17.      * @param A 
  18.      * @param Nc 
  19.      * @param Ps 
  20.      * @param Pr 
  21.      * @param qdu 
  22.      * @param Nfor 
  23.      * @return 
  24.      */  
  25.     private static double calRValue(double T, double Ppl, double SLR,  
  26.             double RLR, double Ds, double STMR, double Dr, double TELR,  
  27.             double WEPL, double Ie, double BPL, double BurstR, double A,  
  28.             double Nc, double Ps, double Pr, double qdu, double Nfor) {  
  29.         double LSTR = STMR + Dr,  
  30.         Tr = 2*T,  
  31.         Ta = T;  
  32.         double Nfo = Nfor + RLR;  
  33.         double OLR = SLR+RLR;  
  34.         double Pre = Pr + 10*Math.log10(1+Math.pow(10,   
  35.                 ((double)(10-LSTR))/(double)10));  
  36.         double Nor = RLR - 121 +Pre   
  37.                     + 0.008*Math.pow((Pre-35),2);  
  38.         double Nos = Ps - SLR -Ds   
  39.                     - 100 +0.004*Math.pow((Ps-OLR -Ds - 14),2);  
  40.         double No = 10*Math.log10((Math.pow(10, (double)Nc/(double)10))  
  41.                 +Math.pow(10, (double)Nos/(double)10)  
  42.                 +Math.pow(10, (double)Nor/(double)10)  
  43.                 +Math.pow(10, (double)Nfo/(double)10));  
  44.         double Ro = 15 - 1.5*(SLR+No);  
  45.           
  46.         double Q = 37 - 15*(Math.log10(qdu));  
  47.         double G = 1.07+0.258*Q+0.0602*Math.pow(Q, 2);  
  48.         double Z = (double)46/(double)30-G/(double)40;  
  49.         double Y = (double)(Ro-100)/(double)15+46/8.4-G/9;  
  50.         double Iq = 15*Math.log10(1+Math.pow(10, Y)  
  51.                     +Math.pow(10, Z));  
  52.         double STMRo = -10*Math.log10(Math.pow(10, -STMR/(double)10)  
  53.                 + Math.exp(-T/(double)4)*Math.pow(10, -TELR/10));  
  54.         double Ist = 12*Math.pow((1+Math.pow((STMRo-13)/(double)68)),  
  55.                     1/(double)8)  
  56.                         -28*Math.pow((1+Math.pow((STMRo+1)/19.435)),   
  57.                                 1/(double)35)  
  58.                         -13*Math.pow((1+Math.pow((STMRo-3)/3313)),   
  59.                                 1/(double)13)  
  60.                         +29;  
  61.         double Xolr = OLR+0.2*(64+No-RLR);  
  62.         double Iolr = 20* (Math.pow((1+Math.pow((Xolr/8),(double)8)),  
  63.                 ((double)1/(double)8))-Xolr/(double)8);  
  64.         double Is = Iolr + Ist + Iq;  
  65.         double TERV = TELR - 40*Math.log10((1+T/10)/(1+T/150)  
  66.                 +6*Math.exp(-0.3*Math.pow(T,2)));  
  67.         double Idd = 0;  
  68.         if (Ta>100)  
  69.         {  
  70.             double X = Math.log10(Ta/(double)100)/Math.log10(2);  
  71.             Idd = 25 * (Math.pow((1+Math.pow(X, 6)),  
  72.                     1/(double)6)-3*Math.pow((1+Math.pow(X/(double)36)),   
  73.                             1/(double)6)+2);  
  74.         }  
  75.           
  76.         if (STMR<9)  
  77.             TERV = TERV + 0.5*Ist;  
  78.           
  79.         double Rle = 10.5 * (WEPL+7)*Math.pow(Tr+1, -0.25);  
  80.         double Idle = (Ro-Rle)/(double)2   
  81.                 + Math.sqrt(Math.pow(Ro-Rle, 2)/4+169);  
  82.         double Roe = -1.5*(No-RLR);  
  83.         double Re = 80+2.5*(TERV-14);  
  84.         double Idte = ((Roe-Re)/2   
  85.                 + Math.sqrt(Math.pow(Roe-Re, 2)/(double)4+100) -1)*(1-Math.exp(-T));  
  86.         if (STMR > 20)  
  87.             Idte = Math.sqrt(Math.pow(Idte,2)+Math.pow(Ist,2));  
  88.         double Id = Idte + Idle + Idd;  
  89.           
  90.         double Ieef = Ie+(95-Ie)*(Ppl/((Ppl/BurstR)+BPL));  
  91.           
  92.         double R = Ro - Is - Id - Ieef +A;    
  93.         return R;  
  94.     }  
  95.     /** 
  96.      * Using default values recommended by ITU-T in G.107 
  97.      * @param T  mean one-way delay 
  98.      * @param Ppl packet-loss probability 
  99.      * @return 
  100.      */  
  101.     public static double calRValue(double T, double Ppl)  
  102.     {  
  103.         double SLR = 8,  
  104.         RLR = 2,  
  105.         Ds = 3,  
  106.         STMR = 15,  
  107.         Dr = 3,  
  108.           
  109.         TELR = 65,  
  110.         WEPL = 110,  
  111.         Ie = 0,  
  112.         BPL = 1,  
  113.         BurstR = 1,  
  114.         A = 0,  
  115.         Nc = -70,  
  116.         Ps = 35,  
  117.         Pr = 35,  
  118.         qdu = 1,  
  119.         Nfor = -64;  
  120.            
  121.         return calRValue(T, Ppl, SLR, RLR, Ds, STMR, Dr, TELR, WEPL, Ie, BPL,  
  122.                 BurstR, A, Nc, Ps, Pr, qdu, Nfor);  
  123.     }     
  124.       
  125.     /** 
  126.      * This function calculates MOS value from R value 
  127.      * @param R 
  128.      * @return 
  129.      */  
  130.     public static double calMOSValue(double R)  
  131.     {  
  132.         double mos = 0;  
  133.         if (R<0)  
  134.             mos  =1;  
  135.         else if (R>100)  
  136.             mos = 4.5;  
  137.         else  
  138.             mos = 1 + 0.035*R +R*(R-60)*(100-R)*7*Math.pow(10, -6);  
  139.         return mos;  
  140.     }  
  141.       
  142.     public static void main(String... Args)  
  143.     {  
  144.         //assume mean one way dealy is 150ms, Packet-loss Probability is 0.01  
  145.         double T=150;  
  146.         double Ppl=0.01;  
  147.         double R = calRValue(T,Ppl);  
  148.         double MOSValue = calMOSValue(R);  
  149.         System.out.println("when one way delay is "+T+" and Packet-loss Probability is "+Ppl  
  150.                 +", R vlaue is "+R+", MOS value is "+MOSValue);  
  151.     }  
  152. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值