Emodel.pm
上传用户:wzkunzhan
上传日期:2022-04-23
资源大小:2618k
文件大小:6k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. # File: Emodel.pm
  2. #
  3. # Modified OpenPhone based Voice Evaluation Tool (MOBVET) Version 0.1
  4. # --------------------------------------------------------------------
  5. # Voice Over IP Laboratory (http://www.voip.nce.ufrj.br)
  6. # Federal University of Rio de Janeiro
  7. # Copyright (c) 2002-2004 UFRJ (Federal University of Rio de Janeiro).
  8. # The contents of this file are subject to the Mozilla Public License
  9. # Version 1.0 (the "License"); you may not use this file except in
  10. # compliance with the License. You may obtain a copy of the License at
  11. # http://www.mozilla.org/MPL/
  12. package VoIP::Emodel;
  13. #Inicializa as variaveis com os valores default 
  14. set_default();
  15. #****************************
  16. # Sub set_default
  17. #****************************
  18. #Default Parameter Values, according to Tab.3/G.107 (lines 29-60)
  19. sub set_default
  20. {
  21. $SLR = 8;
  22. $RLR = 2;
  23. $STMRs = 15;
  24. $Ds = 3;
  25. $STMR = 15;
  26. $Dr = 3;
  27. $LSTR = 18;
  28. $TELR = 65;
  29. $T = 0;
  30. $WEPL = 110;
  31. $Tr = 0;
  32. $Ta = 0;
  33. $Ie = 0;
  34. $Bpl = 1;
  35. $Ppl = 0;
  36. $A = 0;
  37. $Nc = -70;
  38. $Ps = 35;
  39. $Pr = 35;
  40. $qdu = 1;
  41. $Nfor = -64;
  42. $OLR = $SLR + $RLR;
  43. $Id = 0;
  44. $Ieef = 0;
  45. }
  46. #****************************
  47. # Sub r
  48. #****************************
  49. #Compute R
  50. sub r
  51. {
  52. $Nr1 = 0;
  53. $Nr2 = 0;
  54. $Pro = 0;
  55. $Pr1 = 0;
  56. $Nfo = 0;
  57. $No = 0;
  58. $Nt = 0;
  59. $Ro = 0;
  60. $Xolr = 0;
  61. $Iolr = 0;
  62. $STMRo = 0;
  63. $Ist = 0;
  64. $Q = 0;
  65. $G = 0;
  66. $Iq = 0;
  67. $TERV = 0;
  68. $Re = 0;
  69. $Ro = 0;
  70. $Xdt = 0;
  71. $Idte = 0;
  72. $Rle = 0;
  73. $Idd = 0;
  74. $X = 0;
  75. $R = 0;
  76. $Isyn = 0;
  77. # Noise Summation, formulas (3) to (7)
  78. $Nr1 = $Ps - $SLR - $Ds - 100;
  79. $Nr1 = $Nr1 + 0.004 * ($Ps - $SLR - $Ds - 14) ** 2;
  80. $LSTR = $STMR + $Dr;
  81. $Pro = $Pr + 10 * log(1 + 10 ** ((10 - $LSTR) / 10)) / log(10);
  82. $Pr1 = $Pro + 0.008 * ($Pro - 35)**2;
  83. $Nr2 = $Pr1 - 121 + $RLR;
  84. $Nfo = $Nfor + $RLR;
  85. $No = 10 * log(10**($Nr1 / 10) + 10 ** ($Nr2 / 10) + 10 ** ($Nc / 10) + 10 ** ($Nfo / 10)) / log(10);
  86. $Nt = $No - $RLR;
  87. # Ro, formula (2)
  88. $Ro = 15 - 1.5 * ($SLR + $No);
  89. # Iolr, formulas (9) and (10)
  90. $Xolr = $SLR + $RLR + 0.2 * (64 + $Nt);
  91. $Iolr = 20 * ((1 + ($Xolr / 8) ** 8) ** (1 / 8) - $Xolr / 8);
  92. # Ist, formulas (11) and (12)
  93. $STMRo = - 10 * log(10 ** (- $STMR / 10) + 10 ** (- $TELR / 10) * exp( - $T / 4)) / log(10);
  94. $Ist = 10 * (1 + (($STMRo - 12) / 5) ** 6) ** (1 / 6) - 10;
  95. $Ist = $Ist - 46 * (1 + ($STMRo / 23) ** 10) ** (1 / 10) + 46;
  96. # Iq, formulas (13) to (17)
  97. if ($qdu < 1) { $qdu = 1 }
  98. $Q = 37 - 15 * log($qdu) / log(10);
  99. $G = 1.07 + 0.258 * $Q + 0.0602 * $Q ** 2;
  100. $Iq = 15 * log(1 + 10 ** (($Ro - 100) / 15) * 10 ** (46 / 8.4 - $G / 9) + 10 ** (46 / 30 - $G / 40)) / log(10);
  101. # Is, formula (8)
  102. $Isyn = $Iolr + $Ist + $Iq;
  103. # TERV, formula (22)
  104. $TERV = $TELR + 6 * exp(- 0.3 * $T ** 2) - 40 * log((1 + $T / 10) / (1 + $T / 150)) / log(10);
  105. # Modifications to satisfy formula (23)
  106. if ($STMR < 9) { $TERV = $TERV + 0.5 * $Ist }
  107. # Idte, formulas (19) to (21)
  108. $Re = 80 + 2.5 * ($TERV - 14);
  109. $Roe = -1.5 * ($No - $RLR);
  110. $Xdt = ($Roe - $Re) / 2;
  111. $Idte = $Xdt + sqrt($Xdt ** 2 + 100);
  112. $Idte = ($Idte - 1) * (1 - exp(- $T));
  113. # Modifications to satisfy formula (24)
  114. if ($STMR > 15) { $Idte = sqrt($Idte ** 2 + $Ist ** 2) }
  115. # Idle, formulas (25) and (26)        
  116. $Rle = 10.5 * ($WEPL + 7) * ($Tr + 1) ** (-1 / 4);
  117. $Xdl = ($Ro - $Rle) / 2;
  118. $Idle = $Xdl + sqrt($Xdl ** 2 + 169);
  119. #Idd, formulas (27) and (28)
  120. if ($Ta < 100) { $Idd = 0 }
  121. if ($Ta == 100) { $Idd = 0 }
  122. if ($Ta > 100) 
  123. {
  124.         $X = (log($Ta / 100)) / log(2);
  125.         $Idd = 25 * ((1 + $X ** 6) ** (1 / 6) - 3 * (1 + ($X / 3) ** 6) ** (1 / 6) + 2);
  126. }
  127. # Id
  128. $Id = $Idte + $Idle + $Idd;
  129. # Inclusion of packet-loss: Ieef, formula (29)
  130. $Ieef = $Ie + (95 - $Ie) * ($Ppl / ($Ppl + $Bpl));
  131. # R, formula (1)
  132. $R = $Ro - $Isyn - $Id - $Ieef + $A;
  133. #Truncando o Valor de R
  134. $R = int($R * 10 + 0.5) / 10;
  135. if ($R < 0) {
  136. $R = 0;
  137. }
  138. return $R;
  139. }
  140. #****************************
  141. # Sub gob
  142. #****************************
  143. # Compute GOB, formula (B.2)
  144. sub gob
  145. {
  146. $R = pop(@_);
  147. $Z = 0;
  148. $GOB = 0;
  149. $Z = ($R - 60) / 16;
  150. f($Z);
  151. $GOB = 100 * $F;
  152. $GOB = int($GOB * 10 + 0.5) / 10;
  153. return $GOB;
  154. }
  155. #****************************
  156. # Sub pow
  157. #****************************
  158. # Compute POW, formula (B.3)
  159. sub pow
  160. {
  161. $Z = 0;
  162. $POW = 0;
  163. $F = 0;
  164. $R = pop(@_);
  165. $Z = ($R - 45) / 16;
  166. $F = f($Z);
  167. $POW = 100 * (1 - $F);
  168. $POW = int($POW * 10 + 0.5) / 10;
  169. return $POW;
  170. }
  171. #****************************
  172. # Sub mos
  173. #****************************
  174. # Compute MOS, formula (B.4)
  175. sub mos
  176. {
  177. $R = pop(@_);
  178. $MOS = 0;
  179. $MOS = 1 + $R * 0.035 + $R * ($R - 60) * (100 - $R) * 7 * 10 ** (-6);
  180. $MOS = int($MOS * 100 + 0.5) / 100;
  181. if ($R < 0) { $MOS = 1 }
  182. if ($MOS < 1) { $MOS = 1 }
  183. if ($R > 100) { $MOS = 4.5 }
  184. return $MOS;
  185. }
  186. #****************************
  187. # Sub f
  188. #****************************
  189. # Norm Distr F(Z), formula (B.1)
  190. sub f
  191. {
  192. $Z = pop(@_);
  193. $S = 0;
  194. $N = 0;
  195. $H = $Z;
  196. $F = 0;
  197. do
  198. {
  199. $S = $S + $H;
  200. $H = $H * (-1) * ($Z) ** 2 * (2 * $N + 1) / (($N + 1) * 2 * (2 * $N + 3));
  201. $N = $N + 1;
  202. }while ( abs($H) > 10** (-6) );
  203. $S = $S / (sqrt(2 * 3.14159265));
  204. $F = 0.5 + $S;
  205. return int($F * 10 ** 5 + 0.5) / 10 ** 5;
  206. }
  207. sub setSLR { $SLR = pop(@_); $OLR = $SLR + $RLR }
  208. sub setRLR { $RLR = pop(@_); $OLR = $SLR + $RLR }
  209. sub setDs { $Ds = pop(@_); }
  210. sub setSTMR {  $STMR = pop(@_); $LSTR = $STMR + $Dr }
  211. sub setDr {  $Dr = pop(@_); $LSTR = $STMR + $Dr }
  212. sub setTELR { $TELR = pop(@_); }
  213. sub setT {  $T = pop(@_); }
  214. sub setWEPL {  $WEPL = pop(@_); }
  215. sub setTr {  $Tr = pop(@_); }
  216. sub setTa {  $Ta = pop(@_); }
  217. sub setIe {  $Ie = pop(@_); }
  218. sub setBpl { $Bpl = pop(@_); }
  219. sub setPpl { $Ppl = 100 * pop(@_); }
  220. sub setA {  $A = pop(@_); }
  221. sub setNc { $Nc = pop(@_); }
  222. sub setPs { $Ps = pop(@_); }
  223. sub setPr { $Pr = pop(@_); }
  224. sub setqdu { $qdu = pop(@_); }
  225. sub setNfor {  $Nfor = pop(@_); }
  226. sub getSLR { return $SLR }
  227. sub getRLR { return $RLR }
  228. sub getDs { return $Ds }
  229. sub getSTMR { return $STMR }
  230. sub getDr { return $Dr }
  231. sub getTELR { return $TELR }
  232. sub getT { return $T }
  233. sub getWEPL { return $WEPL}
  234. sub getTr { return $Tr}
  235. sub getTa { return $Ta}
  236. sub getIe {
  237. if ($Ie < 100) {
  238. return $Ie;
  239. }
  240. else {
  241. return 100;
  242. }
  243. }
  244. sub getBpl { return $Bpl }
  245. sub getPpl { return $Ppl}
  246. sub getA { return $A }
  247. sub getNc { return $Nc }
  248. sub getPs { return $Ps }
  249. sub getPr { return $Pr }
  250. sub getqdu { return $qdu }
  251. sub getNfor { return $Nfor }
  252. sub getId { return $Id }
  253. sub getIeef { return $Ieef }
  254. 1;