clsDPC.vb
上传用户:qzhengtong
上传日期:2022-07-16
资源大小:1669k
文件大小:39k
源码类别:

手机短信编程

开发平台:

Visual Basic

  1. 'Imports System.Windows.Forms
  2. '不考虑AMR情况
  3. '不进行滤波
  4. '900频段 MS发射功率[5~33]
  5. '1800频段 MS发射功率 [0~31]
  6. '所有参数取值范围和默认值都来源于Ericsson AlexUser Description
  7. '部分取值范围可能超过硬件的能力范围,因为各种硬件在各种频段下的能力都不一样
  8. '
  9. Public Class clsDPC
  10.     'Private FilterLength() As Single = {0.1, 0.3162, 0.4642, 0.5623, 0.631, 0.6813, 0.7197, 0.7499, 0.7743, 0.7943, 0.8111, 0.8254, 0.8377, 0.8483, 0.8577, 0.866, 0.8733, 0.8799, 0.8859, 0.8913, 0.8962, 0.9006, 0.9047, 0.9085, 0.912, 0.9152, 0.9183, 0.9211, 0.9237, 0.9261}
  11.     'FilterLength 是根据L用来寻找系数a的,现在没有滤波,还没有用到
  12.     Public Class MS_DPC
  13.         Inherits clsDPC.DPC_SubFunction
  14.         Public MS_DPC_Arr(7, 63) As Integer
  15.         Private pUPDWNRATIO As Integer = 200               ''默认值200 取值范围[100~700]
  16.         Public Property UPDWNRATIO() As Integer
  17.             Get
  18.                 Return pUPDWNRATIO
  19.             End Get
  20.             Set(ByVal value As Integer)
  21.                 If value < 100 Then
  22.                     MessageBox.Show("UPDWNRATIO属性值应该在100~700之间." & vbNewLine & "您现在设置的属性小于100!", "该属性不符合规范!")
  23.                 Else
  24.                     If value > 700 Then
  25.                         MessageBox.Show("UPDWNRATIO属性值应该在100~700之间." & vbNewLine & "您现在设置的属性大于700!", "该属性不符合规范!")
  26.                     Else
  27.                         pUPDWNRATIO = value
  28.                     End If
  29.                 End If
  30.             End Set
  31.         End Property
  32. #Region "MS功控参数,{SSDESUL,QDESUL,LCOMPUL,QCOMPUL,SSLENUL,QLENUL,MSPWRMAX,MSPWRMIN,MSTXPWR}"
  33.         Private pSSDESUL As Integer = 92             '默认92 取值范围[47~110] dBm (取负值)
  34.         Public Property SSDESUL() As Integer
  35.             Get
  36.                 Return pSSDESUL
  37.             End Get
  38.             Set(ByVal value As Integer)
  39.                 If value < 47 Then
  40.                     MessageBox.Show("SSDESUL属性值应该在47~110之间." & vbNewLine & "您现在设置的属性小于47!", "该属性不符合规范!")
  41.                 Else
  42.                     If value > 110 Then
  43.                         MessageBox.Show("SSDESUL属性值应该在47~110之间." & vbNewLine & "您现在设置的属性大于110!", "该属性不符合规范!")
  44.                     Else
  45.                         pSSDESUL = value
  46.                     End If
  47.                 End If
  48.             End Set
  49.         End Property
  50.         Private pQDESUL As Integer = 30                  '默认值30 取值范围 [0~76],单位dtqu
  51.         Public Property QDESUL() As Integer
  52.             Get
  53.                 Return pQDESUL
  54.             End Get
  55.             Set(ByVal value As Integer)
  56.                 If value < 0 Then
  57.                     MessageBox.Show("QDESUL属性值应该在0~76之间." & vbNewLine & "您现在设置的属性小于0!", "该属性不符合规范!")
  58.                 Else
  59.                     If value > 76 Then
  60.                         MessageBox.Show("QDESUL属性值应该在0~76之间." & vbNewLine & "您现在设置的属性大于76!", "该属性不符合规范!")
  61.                     Else
  62.                         pQDESUL = value
  63.                     End If
  64.                 End If
  65.             End Set
  66.         End Property
  67.         Private pLCOMPUL As Integer = 6                '默认值6 取值范围[0~100] 单位 %
  68.         Public Property LCOMPUL() As Integer
  69.             Get
  70.                 Return pLCOMPUL
  71.             End Get
  72.             Set(ByVal value As Integer)
  73.                 If value < 0 Then
  74.                     MessageBox.Show("LCOMPUL属性值应该在0~100之间." & vbNewLine & "您现在设置的属性小于0!", "该属性不符合规范!")
  75.                 Else
  76.                     If value > 100 Then
  77.                         MessageBox.Show("LCOMPUL属性值应该在0~100之间." & vbNewLine & "您现在设置的属性大于100!", "该属性不符合规范!")
  78.                     Else
  79.                         pLCOMPUL = value
  80.                     End If
  81.                 End If
  82.             End Set
  83.         End Property
  84.         Private pQCOMPUL As Integer = 75          '默认值75 取值范围 [0~100] 单位 %
  85.         Public Property QCOMPUL() As Integer
  86.             Get
  87.                 Return pQCOMPUL
  88.             End Get
  89.             Set(ByVal value As Integer)
  90.                 If value < 3 Then
  91.                     MessageBox.Show("QCOMPUL属性值应该在3~15之间." & vbNewLine & "您现在设置的属性小于3!", "该属性不符合规范!")
  92.                 Else
  93.                     If value > 15 Then
  94.                         MessageBox.Show("QCOMPUL属性值应该在3~15之间." & vbNewLine & "您现在设置的属性大于15!", "该属性不符合规范!")
  95.                     Else
  96.                         pQCOMPUL = value
  97.                     End If
  98.                 End If
  99.             End Set
  100.         End Property
  101.         Private pSSLENUL As Integer = 3
  102.         Public Property SSLENUL() As Integer     '默认值3
  103.             Get
  104.                 Return pSSLENUL
  105.             End Get
  106.             Set(ByVal value As Integer)
  107.                 If value < 3 Then
  108.                     MessageBox.Show("SSLENUL属性值应该在3~15之间." & vbNewLine & "您现在设置的属性小于3!", "该属性不符合规范!")
  109.                 Else
  110.                     If value > 15 Then
  111.                         MessageBox.Show("SSLENUL属性值应该在3~15之间." & vbNewLine & "您现在设置的属性大于15!", "该属性不符合规范!")
  112.                     Else
  113.                         pSSLENUL = value
  114.                     End If
  115.                 End If
  116.             End Set
  117.         End Property
  118.         Private pQLENUL As Integer = 3           '默认值3 取值范围[1~20],单位 SACCH周期(480毫秒
  119.         Public Property QLENUL() As Integer
  120.             Get
  121.                 Return pQLENUL
  122.             End Get
  123.             Set(ByVal value As Integer)
  124.                 If value < 1 Then
  125.                     MessageBox.Show("QLENUL属性值应该在1~20之间." & vbNewLine & "您现在设置的属性小于1!", "该属性不符合规范!")
  126.                 Else
  127.                     If value > 20 Then
  128.                         MessageBox.Show("QLENUL属性值应该在1~20之间." & vbNewLine & "您现在设置的属性大于20!", "该属性不符合规范!")
  129.                     Else
  130.                         pQLENUL = value
  131.                     End If
  132.                 End If
  133.             End Set
  134.         End Property
  135.         Private pMSPWRMAX As Integer = 33            'MS最大发射功率
  136.         Public Property MSPWRMAX() As Integer
  137.             Get
  138.                 Return pMSTXPWR
  139.             End Get
  140.             Set(ByVal value As Integer)
  141.                 If value < pMSPWRMIN Then
  142.                     MessageBox.Show("MSPWRMAX必须比MSPWRMIN大!", "该属性不符合规范!")
  143.                 Else
  144.                     If value < 5 Then
  145.                         MessageBox.Show("MSPWRMAX属性值应该在5~30之间." & vbNewLine & "您现在设置的属性小于5!", "该属性不符合规范!")
  146.                     Else
  147.                         If value > 33 Then
  148.                             MessageBox.Show("MSPWRMAX属性值应该在5~33之间." & vbNewLine & "您现在设置的属性大于33!", "该属性不符合规范!")
  149.                         Else
  150.                             pMSPWRMAX = value
  151.                             If pMSPWRMAX < pMSTXPWR Then
  152.                                 pMSTXPWR = pMSPWRMAX
  153.                             End If
  154.                         End If
  155.                     End If
  156.                 End If
  157.             End Set
  158.         End Property
  159.         Private pMSPWRMIN As Integer = 5            'MS最小发射功率 [0~14]
  160.         Public Property MSPWRMIN() As Integer
  161.             Get
  162.                 Return pMSPWRMIN
  163.             End Get
  164.             Set(ByVal value As Integer)
  165.                 If value > pMSPWRMAX Then
  166.                     MessageBox.Show("MSPWRMAX必须比MSPWRMIN大!", "该属性不符合规范!")
  167.                 Else
  168.                     If value < 0 Then
  169.                         MessageBox.Show("MSPWRMIN属性值应该在0~14之间." & vbNewLine & "您现在设置的属性小于0!", "该属性不符合规范!")
  170.                     Else
  171.                         If value > 14 Then
  172.                             MessageBox.Show("MSPWRMIN属性值应该在0~14之间." & vbNewLine & "您现在设置的属性大于14!", "该属性不符合规范!")
  173.                         Else
  174.                             pMSPWRMIN = value
  175.                         End If
  176.                     End If
  177.                 End If
  178.             End Set
  179.         End Property
  180.         Private pMSTXPWR As Integer = 33             'MS发射功率
  181.         Public Property MSTXPWR() As Integer
  182.             Get
  183.                 Return pMSTXPWR
  184.             End Get
  185.             Set(ByVal value As Integer)
  186.                 If value < 5 Then
  187.                     MessageBox.Show("MSTXPWR属性值应该在5~30之间." & vbNewLine & "您现在设置的属性小于5!", "该属性不符合规范!")
  188.                 Else
  189.                     If value > 33 Then
  190.                         MessageBox.Show("MSTXPWR属性值应该在5~33之间." & vbNewLine & "您现在设置的属性大于33!", "该属性不符合规范!")
  191.                     Else
  192.                         pMSTXPWR = value
  193.                         If pMSPWRMAX < pMSTXPWR Then
  194.                             pMSTXPWR = pMSPWRMAX
  195.                         End If
  196.                     End If
  197.                 End If
  198.             End Set
  199.         End Property
  200. #End Region
  201. #Region "calculate_MS_DPC"
  202.         Public Sub calculate_MS_DPC()
  203.             '如果没有设置任何参数,就使用默认值,后者前面已经设置的值
  204.             calculate_MS_DPC(pSSDESUL, pQDESUL, pLCOMPUL, pQCOMPUL)
  205.         End Sub
  206.         Public Sub calculate_MS_DPC(ByVal fSSDESUL As Integer, ByVal fQDESUL As Integer, ByVal fLCOMPUL As Integer, ByVal fQCOMPUL As Integer)
  207.             Dim I As Integer, J As Integer, K As Integer
  208.             For I = 0 To 7
  209.                 For J = 0 To 63
  210.                     K = J - 110
  211.                     MS_DPC_Arr(I, J) = DPC_MS_dB(K, I, -fSSDESUL, fQDESUL, fLCOMPUL, fQCOMPUL)
  212.                 Next
  213.             Next
  214.         End Sub
  215.         Public Sub calculate_MS_DPC(ByVal fSSDESUL As Integer, ByVal fQDESUL As Integer, ByVal fLCOMPUL As Integer, ByVal fQCOMPUL As Integer, _
  216.                                     ByVal fSSLENUL As Integer, ByVal fQLENUL As Integer, ByVal fMSPWRMAX As Integer, ByVal fMSPWRMIN As Integer, ByVal fMSTXPWR As Integer)
  217.             '如果全部参数都提供的话,就先设置相关属性,在求值
  218.             SSLENUL = fSSLENUL
  219.             QLENUL = fQLENUL
  220.             MSPWRMAX = fMSPWRMAX
  221.             MSPWRMIN = fMSPWRMIN
  222.             MSTXPWR = fMSTXPWR
  223.             calculate_MS_DPC(fSSDESUL, fQDESUL, fLCOMPUL, fQCOMPUL)
  224.         End Sub
  225. #End Region
  226.         Public Function DPC_MS_dB(ByVal Rxlev As Integer, ByVal Rxqual_GSM As Integer, ByVal fSSDESUL As Integer, ByVal fQDESUL As Integer, ByVal fLCOMPUL As Integer, ByVal fQCOMPUL As Integer) As Double
  227.             Dim PLused As Integer, PLnew As Integer, PLlast As Integer
  228.             Dim SS_FILTERED As Single, Q_FILTERED As Single
  229.             Dim SS_TCH As Integer, SS_COMP As Integer, Q_COMP As Integer, RXQUAL_dB As Integer
  230.             Dim QDES_dB As Single
  231.             'Dim PowerOrder As Integer
  232.             Dim bReachedMaxValue As Boolean
  233.             Dim PWR_U As Integer
  234.             bReachedMaxValue = False
  235.             PLused = 0 : PLlast = -1
  236.             PWR_U = pMSTXPWR  '当前使用的发射功率
  237.             QDES_dB = dtquTodB(fQDESUL)
  238.             '根据fQDESUL计算出C/I的dB值
  239.             SS_TCH = Rxlev
  240.             SS_COMP = SS_TCH + (pMSTXPWR - PWR_U)
  241.             '这里是SS补偿值,假设当前使用功率为33dBm
  242.             SS_FILTERED = SS_COMP
  243.             '假设没有滤波,因为没法估计两个测量报告
  244.             RXQUAL_dB = dtquTodB(Rxqual_GSM * 10)
  245.             '根据接收到的QDES计算出C/I的dB值
  246.             Q_COMP = RXQUAL_dB + (pMSTXPWR - PWR_U)
  247.             '这里是SQ补偿值
  248.             Q_FILTERED = Q_COMP
  249.             '假设没有滤波,因为没法估计两个测量报告
  250.             'Maximum down regulation
  251.             Do Until bReachedMaxValue
  252.                 '是否达到最大值
  253.                 PLnew = PWR_O(SS_FILTERED, Q_FILTERED, fSSDESUL, QDES_dB, fLCOMPUL, fQCOMPUL)
  254.                 If PLnew = PLlast Then
  255.                     bReachedMaxValue = True
  256.                     DPC_MS_dB = pMSTXPWR - PWR_U   'PowerOrder *2 dB
  257.                     Exit Do
  258.                 End If
  259.                 PLlast = PLnew
  260.                 PWR_U = Max(PLnew, pMSPWRMIN)
  261.                 SS_COMP = SS_TCH + (pMSTXPWR - PWR_U)
  262.                 SS_FILTERED = SS_COMP
  263.                 Q_COMP = RXQUAL_dB + (pMSTXPWR - PWR_U)
  264.                 Q_FILTERED = Q_COMP
  265.             Loop
  266.         End Function
  267.         Private Function PWR_O(ByVal SS_FILTERED As Integer, ByVal Q_FILTERED As Single, _
  268.             ByVal fSSDES As Integer, ByVal QDES_dB As Single, ByVal fLCOMPUL As Integer, ByVal fQCOMPUL As Integer) As Double
  269.             Dim pu1 As Double, pu2 As Double
  270.             Dim PUint As Double
  271.             pu1 = (fLCOMPUL / 100) * (fSSDES - SS_FILTERED) + (fQCOMPUL / 100) * (QDES_dB - Q_FILTERED)
  272.             pu2 = 0.3 * (fSSDES - SS_FILTERED) + 0.4 * (QDES_dB - Q_FILTERED)
  273.             PUint = Max(pu1, pu2)
  274.             'PUint = (fLCOMPUL / 100) * (fSSDES - SS_FILTERED) + (fQCOMPUL / 100) * (QDES_dB - Q_FILTERED)     '-XXXXXXX
  275.             'PUint = (0.3 * (fSSDES - SS_FILTERED) + 0.4 * (QDES_dB - Q_FILTERED))   '-XXXXXXX
  276.             PUint = Int(PUint / 2) * 2
  277.             If PUint >= 0 Then
  278.                 PWR_O = pMSTXPWR
  279.             Else
  280.                 PWR_O = pMSTXPWR + PUint
  281.             End If
  282.         End Function
  283.     End Class
  284.     Public Class BTS_DPC
  285.         Inherits clsDPC.DPC_SubFunction
  286.         Private BTS_LAPO As Integer = 30   'BTS  lowest allowed power order
  287.         Public BTS_DPC_Arr(7, 63) As Integer
  288. #Region "BTS功控参数,{BSPWRMIN,BSPWRT,BSPWR,BSTXPWR,Nf,SSDESDL,QDESDL,LCOMPDL,QCOMPDL,SSLENDL,QLENDL }"
  289.         Private pBSPWRMIN As Integer = -20            '默认-20 取值范围[-20~50] dBm 
  290.         Public Property BSPWRMIN() As Integer
  291.             Get
  292.                 Return pBSPWRMIN
  293.             End Get
  294.             Set(ByVal value As Integer)
  295.                 If value < -20 Then
  296.                     MessageBox.Show("BSPWR属性值应该在-20~50之间." & vbNewLine & "您现在设置的属性小于-20!", "该属性不符合规范!")
  297.                 Else
  298.                     If value > 50 Then
  299.                         MessageBox.Show("BSPWR属性值应该在-20~50之间." & vbNewLine & "您现在设置的属性大于50!", "该属性不符合规范!")
  300.                     Else
  301.                         pBSPWRMIN = value
  302.                         'bts最大改变电平
  303.                         If pBSTXPWR - pBSPWRMIN > 30 Then
  304.                             BTS_LAPO = 30
  305.                         Else
  306.                             BTS_LAPO = pBSTXPWR - pBSPWRMIN
  307.                         End If
  308.                     End If
  309.                 End If
  310.             End Set
  311.         End Property
  312.         Private pBSPWRT As Integer = 45             '默认45 取值范围[0~63] dBm 
  313.         Public Property BSPWRT() As Integer
  314.             Get
  315.                 Return pBSPWRT
  316.             End Get
  317.             Set(ByVal value As Integer)
  318.                 If value < 0 Then
  319.                     MessageBox.Show("BSPWR属性值应该在0~63之间." & vbNewLine & "您现在设置的属性小于0!", "该属性不符合规范!")
  320.                 Else
  321.                     If value > 63 Then
  322.                         MessageBox.Show("BSPWR属性值应该在0~63之间." & vbNewLine & "您现在设置的属性大于63!", "该属性不符合规范!")
  323.                     Else
  324.                         pBSPWRT = value
  325.                         If pBSTXPWR - pBSPWRMIN > 30 Then
  326.                             BTS_LAPO = 30
  327.                         Else
  328.                             ''bts最大改变电平
  329.                             BTS_LAPO = pBSTXPWR - pBSPWRMIN
  330.                         End If
  331.                     End If
  332.                 End If
  333.             End Set
  334.         End Property
  335.         Private pBSPWR As Integer = 45             '默认45 取值范围[0~80] dBm 
  336.         Public Property BSPWR() As Integer
  337.             Get
  338.                 Return pBSPWR
  339.             End Get
  340.             Set(ByVal value As Integer)
  341.                 If value < 0 Then
  342.                     MessageBox.Show("BSPWR属性值应该在0~80之间." & vbNewLine & "您现在设置的属性小于0!", "该属性不符合规范!")
  343.                 Else
  344.                     If value > 80 Then
  345.                         MessageBox.Show("BSPWR属性值应该在0~80之间." & vbNewLine & "您现在设置的属性大于80!", "该属性不符合规范!")
  346.                     Else
  347.                         pBSPWR = value
  348.                     End If
  349.                 End If
  350.             End Set
  351.         End Property
  352.         Private pBSTXPWR As Integer = 45             '默认45 取值范围[0~80] dBm 
  353.         Public Property BSTXPWR() As Integer
  354.             Get
  355.                 Return pBSTXPWR
  356.             End Get
  357.             Set(ByVal value As Integer)
  358.                 If value < 0 Then
  359.                     MessageBox.Show("BSTXPWR属性值应该在0~80之间." & vbNewLine & "您现在设置的属性小于0!", "该属性不符合规范!")
  360.                 Else
  361.                     If value > 80 Then
  362.                         MessageBox.Show("BSTXPWR属性值应该在0~80之间." & vbNewLine & "您现在设置的属性大于80!", "该属性不符合规范!")
  363.                     Else
  364.                         pBSTXPWR = value
  365.                     End If
  366.                 End If
  367.             End Set
  368.         End Property
  369.         Private pNf As Integer = 1             '默认1 取值范围[1~16] 跳频频点个数
  370.         Public Property Nf() As Integer
  371.             Get
  372.                 Return pNf
  373.             End Get
  374.             Set(ByVal value As Integer)
  375.                 If value < 1 Then
  376.                     MessageBox.Show("SSDESDL属性值应该在1~16之间." & vbNewLine & "您现在设置的属性小于1!", "该属性不符合规范!")
  377.                 Else
  378.                     If value > 16 Then
  379.                         MessageBox.Show("SSDESDL属性值应该在1~16之间." & vbNewLine & "您现在设置的属性大于16!", "该属性不符合规范!")
  380.                     Else
  381.                         pNf = value
  382.                     End If
  383.                 End If
  384.             End Set
  385.         End Property
  386.         Private pSSDESDL As Integer = 90             '默认90 取值范围[47~110] dBm (取负值)
  387.         Public Property SSDESDL() As Integer
  388.             Get
  389.                 Return pSSDESDL
  390.             End Get
  391.             Set(ByVal value As Integer)
  392.                 If value < 47 Then
  393.                     MessageBox.Show("SSDESDL属性值应该在47~110之间." & vbNewLine & "您现在设置的属性小于47!", "该属性不符合规范!")
  394.                 Else
  395.                     If value > 110 Then
  396.                         MessageBox.Show("SSDESDL属性值应该在47~110之间." & vbNewLine & "您现在设置的属性大于110!", "该属性不符合规范!")
  397.                     Else
  398.                         pSSDESDL = value
  399.                     End If
  400.                 End If
  401.             End Set
  402.         End Property
  403.         Private pQDESDL As Integer = 30                  '默认值30 取值范围 [0~76],单位dtqu
  404.         Public Property QDESDL() As Integer
  405.             Get
  406.                 Return pQDESDL
  407.             End Get
  408.             Set(ByVal value As Integer)
  409.                 If value < 0 Then
  410.                     MessageBox.Show("QDESDL属性值应该在0~76之间." & vbNewLine & "您现在设置的属性小于0!", "该属性不符合规范!")
  411.                 Else
  412.                     If value > 76 Then
  413.                         MessageBox.Show("QDESDL属性值应该在0~76之间." & vbNewLine & "您现在设置的属性大于76!", "该属性不符合规范!")
  414.                     Else
  415.                         pQDESDL = value
  416.                     End If
  417.                 End If
  418.             End Set
  419.         End Property
  420.         Private pLCOMPDL As Integer = 5                '默认值5 取值范围[0~100] 单位 %
  421.         Public Property LCOMPDL() As Integer
  422.             Get
  423.                 Return pLCOMPDL
  424.             End Get
  425.             Set(ByVal value As Integer)
  426.                 If value < 0 Then
  427.                     MessageBox.Show("LCOMPDL属性值应该在0~100之间." & vbNewLine & "您现在设置的属性小于0!", "该属性不符合规范!")
  428.                 Else
  429.                     If value > 100 Then
  430.                         MessageBox.Show("LCOMPDL属性值应该在0~100之间." & vbNewLine & "您现在设置的属性大于100!", "该属性不符合规范!")
  431.                     Else
  432.                         pLCOMPDL = value
  433.                     End If
  434.                 End If
  435.             End Set
  436.         End Property
  437.         Private pQCOMPDL As Integer = 55          '默认值55 取值范围 [0~100] 单位 %
  438.         Public Property QCOMPDL() As Integer
  439.             Get
  440.                 Return pQCOMPDL
  441.             End Get
  442.             Set(ByVal value As Integer)
  443.                 If value < 3 Then
  444.                     MessageBox.Show("QCOMPDL属性值应该在3~15之间." & vbNewLine & "您现在设置的属性小于3!", "该属性不符合规范!")
  445.                 Else
  446.                     If value > 15 Then
  447.                         MessageBox.Show("QCOMPDL属性值应该在3~15之间." & vbNewLine & "您现在设置的属性大于15!", "该属性不符合规范!")
  448.                     Else
  449.                         pQCOMPDL = value
  450.                     End If
  451.                 End If
  452.             End Set
  453.         End Property
  454.         Private pSSLENDL As Integer                   '默认值3 [3~15]
  455.         Public Property SSLENDL() As Integer
  456.             Get
  457.                 Return pSSLENDL
  458.             End Get
  459.             Set(ByVal value As Integer)
  460.                 If value < 3 Then
  461.                     MessageBox.Show("SSLENDL属性值应该在3~15之间." & vbNewLine & "您现在设置的属性小于3!", "该属性不符合规范!")
  462.                 Else
  463.                     If value > 15 Then
  464.                         MessageBox.Show("SSLENDL属性值应该在3~15之间." & vbNewLine & "您现在设置的属性大于15!", "该属性不符合规范!")
  465.                     Else
  466.                         pSSLENDL = value
  467.                     End If
  468.                 End If
  469.             End Set
  470.         End Property
  471.         Private pQLENDL As Integer             '默认值3 取值范围[1~20],单位 SACCH周期(480毫秒
  472.         Public Property QLENDL() As Integer
  473.             Get
  474.                 Return pQLENDL
  475.             End Get
  476.             Set(ByVal value As Integer)
  477.                 If value < 1 Then
  478.                     MessageBox.Show("QLENDL属性值应该在1~20之间." & vbNewLine & "您现在设置的属性小于1!", "该属性不符合规范!")
  479.                 Else
  480.                     If value > 20 Then
  481.                         MessageBox.Show("QLENDL属性值应该在1~20之间." & vbNewLine & "您现在设置的属性大于20!", "该属性不符合规范!")
  482.                     Else
  483.                         pQLENDL = value
  484.                     End If
  485.                 End If
  486.             End Set
  487.         End Property
  488. #End Region
  489.         Private pUPDWNRATIO As Integer = 200               ''默认值200 取值范围[100~700]
  490.         Public Property UPDWNRATIO() As Integer
  491.             Get
  492.                 Return pUPDWNRATIO
  493.             End Get
  494.             Set(ByVal value As Integer)
  495.                 If value < 100 Then
  496.                     MessageBox.Show("UPDWNRATIO属性值应该在100~700之间." & vbNewLine & "您现在设置的属性小于100!", "该属性不符合规范!")
  497.                 Else
  498.                     If value > 700 Then
  499.                         MessageBox.Show("UPDWNRATIO属性值应该在100~700之间." & vbNewLine & "您现在设置的属性大于700!", "该属性不符合规范!")
  500.                     Else
  501.                         pUPDWNRATIO = value
  502.                     End If
  503.                 End If
  504.             End Set
  505.         End Property
  506. #Region "calculate_BTS_DPC"
  507.         Public Sub calculate_BTS_DPC()
  508.             '如果没有设置任何参数,就使用默认值,后者前面已经设置的值
  509.             calculate_BTS_DPC(pSSDESDL, pQDESDL, pLCOMPDL, pQCOMPDL)
  510.         End Sub
  511.         Public Sub calculate_BTS_DPC(ByVal fSSDESDL As Integer, ByVal fQDESDL As Integer, ByVal fLCOMPDL As Integer, ByVal fQCOMPDL As Integer)
  512.             Dim I As Integer, J As Integer, K As Integer
  513.             For I = 0 To 7
  514.                 For J = 0 To 63
  515.                     K = J - 110
  516.                     BTS_DPC_Arr(I, J) = DPC_BTS_dB(K, I, -fSSDESDL, fQDESDL, fLCOMPDL, fQCOMPDL)
  517.                 Next
  518.             Next
  519.         End Sub
  520.         Public Sub calculate_BTS_DPC(ByVal fSSDESUL As Integer, ByVal fQDESUL As Integer, ByVal fLCOMPUL As Integer, ByVal fQCOMPUL As Integer, _
  521.                                      ByVal fSSLENDL As Integer, ByVal fQLENDL As Integer, _
  522.                                      ByVal fBSPWRMIN As Integer, ByVal fBSPWRT As Integer, ByVal fBSPWR As Integer, ByVal fBSTXPWR As Integer, ByVal fNf As Integer)
  523.             '如果全部参数都提供的话,就先设置相关属性,在求值
  524.             'BSPWRMIN,BSPWRT,BSPWR,BSTXPWR,Nf,SSDESDL,QDESDL,LCOMPDL,QCOMPDL,SSLENDL,QLENDL
  525.             BSPWRMIN = fBSPWRMIN
  526.             BSPWRT = fBSPWRT
  527.             BSPWR = fBSPWR
  528.             BSTXPWR = fBSTXPWR
  529.             Nf = fNf
  530.             SSLENDL = fSSLENDL
  531.             QLENDL = fQLENDL
  532.             calculate_BTS_DPC(fSSDESUL, fQDESUL, fLCOMPUL, fQCOMPUL)
  533.         End Sub
  534. #End Region
  535.         Public Function DPC_BTS_dB(ByVal Rxlev As Integer, ByVal Rxqual_GSM As Integer, ByVal fSSDESDL As Integer, ByVal fQDESDL As Integer, ByVal fLCOMPDL As Integer, ByVal fQCOMPDL As Integer) As Double
  536.             Dim PLused As Integer, PLnew As Integer, PLlast As Integer
  537.             Dim SS_FILTERED As Single, Q_FILTERED As Single
  538.             Dim SS_TCH As Integer, SS_COMP As Integer, Q_COMP As Integer, RXQUAL_dB As Integer, QDES_dB As Single
  539.             'Dim oldSS_FILTERED As Single
  540.             'Dim PowerOrder As Integer
  541.             Dim bReachedMaxValue As Boolean
  542.             'BSPWRT = 45
  543.             bReachedMaxValue = False
  544.             PLused = 0
  545.             PLlast = -1
  546.             QDES_dB = dtquTodB(fQDESDL)
  547.             'BTS (TRU) output power (k) (dBm) = BSPWRT - 2 * PLused
  548.             '手机实际发射功率的算法
  549.             SS_TCH = Rxlev - (BSPWR - BSTXPWR + 2 * PLused) / Nf
  550.             '跳频和非BCCH补偿
  551.             SS_COMP = SS_TCH + 2 * PLused
  552.             '功控补偿
  553.             SS_FILTERED = SS_COMP
  554.             '假设信号稳定,不需要滤波
  555.             RXQUAL_dB = dtquTodB(Rxqual_GSM * 10)
  556.             Q_COMP = RXQUAL_dB + 2 * PLused
  557.             Q_FILTERED = Q_COMP
  558.             'Q_FILTERED = fQDESDL
  559.             'Maximum down regulation
  560.             Do Until bReachedMaxValue
  561.                 PLnew = pu(SS_FILTERED, Q_FILTERED, fSSDESDL, QDES_dB, fLCOMPDL, fQCOMPDL)
  562.                 If PLnew = PLlast Then 'PLnew = PLlast
  563.                     bReachedMaxValue = True
  564.                     DPC_BTS_dB = PLused * 2 'PowerOrder *2 dB
  565.                     If DPC_BTS_dB > BTS_LAPO Then DPC_BTS_dB = BTS_LAPO
  566.                     Exit Do
  567.                 End If
  568.                 PLlast = PLnew
  569.                 PLused = Max(PLnew, 0)
  570.                 SS_COMP = SS_TCH + 2 * PLused
  571.                 SS_FILTERED = SS_COMP
  572.                 'oldSS_FILTERED = SS_FILTERED
  573.                 Q_COMP = RXQUAL_dB + 2 * PLused
  574.                 Q_FILTERED = Q_COMP
  575.             Loop
  576.         End Function
  577.         Private Function pu(ByVal SS_FILTERED As Integer, ByVal Q_FILTERED As Single, _
  578.                             ByVal SSDES As Integer, ByVal QDES_dB As Single, ByVal LCOMP As Integer, ByVal QCOMP As Integer) As Double
  579.             Dim pu1 As Double, pu2 As Double
  580.             pu1 = (LCOMP / 100) * (SSDES - SS_FILTERED) + (QCOMP / 100) * (QDES_dB - Q_FILTERED)
  581.             pu2 = 0.3 * (SSDES - SS_FILTERED) + 0.4 * (QDES_dB - Q_FILTERED)
  582.             pu = Max(pu1, pu2)
  583.             pu = Int(-pu / 2)
  584.         End Function
  585.     End Class
  586.     Public Class GPRS_MS_DPC
  587.         Inherits clsDPC.DPC_SubFunction
  588.         Public GPRS_BTS_DPC_Arr(31, 63) As Integer
  589.         Private MsMaxPower As Integer
  590. #Region "GPRS/EGPRS手机功控参数{ALPHA,GAMMA,GAMMA0,CCHPWR,GPRS_MS_TXPWR_MAX_CCH,P_min,CellType}"
  591.         Private pALPHA As Single = 0.6              '默认值0 取值范围[0~1]
  592.         Public Property ALPHA() As Single
  593.             Get
  594.                 Return pALPHA
  595.             End Get
  596.             Set(ByVal value As Single)
  597.                 If value < 0 Then
  598.                     MessageBox.Show("ALPHA属性值应该在0~1之间." & vbNewLine & "您现在设置的属性小于0!", "该属性不符合规范!")
  599.                 Else
  600.                     If value > 1 Then
  601.                         MessageBox.Show("ALPHA属性值应该在0~1之间." & vbNewLine & "您现在设置的属性大于1!", "该属性不符合规范!")
  602.                     Else
  603.                         pALPHA = Int(value * 10) / 10
  604.                     End If
  605.                 End If
  606.             End Set
  607.         End Property
  608.         Private pGAMMA As Integer = 0              ''默认值0 取值范围[0~62],偶数
  609.         Public Property GAMMA() As Integer
  610.             Get
  611.                 Return pGAMMA
  612.             End Get
  613.             Set(ByVal value As Integer)
  614.                 If value < 0 Then
  615.                     MessageBox.Show("GAMMA属性值应该在0~62之间." & vbNewLine & "您现在设置的属性小于0!", "该属性不符合规范!")
  616.                 Else
  617.                     If value > 62 Then
  618.                         MessageBox.Show("GAMMA属性值应该在0~62之间." & vbNewLine & "您现在设置的属性大于62!", "该属性不符合规范!")
  619.                     Else
  620.                         If value Mod 2 = 1 Then
  621.                             MessageBox.Show("GAMMA属性值只能为偶数!", "该属性不符合规范!")
  622.                         Else
  623.                             pGAMMA = value
  624.                         End If
  625.                     End If
  626.                 End If
  627.             End Set
  628.         End Property
  629.         Private pGAMMA0 As Integer = 39              '默认值39 取值范围[39/26],偶数
  630.         Public Property GAMMA0() As Integer
  631.             Get
  632.                 Return pGAMMA0
  633.             End Get
  634.             Set(ByVal value As Integer)
  635.                 If value = 39 Then
  636.                     pGAMMA0 = 39
  637.                 Else
  638.                     If value = 36 Then
  639.                         pGAMMA0 = 36
  640.                     Else
  641.                         MessageBox.Show("GAMMA0属性值只能是39或者36.", "该属性不符合规范!")
  642.                     End If
  643.                 End If
  644.             End Set
  645.         End Property
  646.         Private pCCHPWR As Integer = 33              ''默认值33 取值范围[4~43]
  647.         Public Property CCHPWR() As Integer
  648.             Get
  649.                 Return pCCHPWR
  650.             End Get
  651.             Set(ByVal value As Integer)
  652.                 If value < 4 Then
  653.                     MessageBox.Show("CCHPWR属性值应该在4~43之间." & vbNewLine & "您现在设置的属性小于4!", "该属性不符合规范!")
  654.                 Else
  655.                     If value > 43 Then
  656.                         MessageBox.Show("CCHPWR属性值应该在4~43之间." & vbNewLine & "您现在设置的属性大于43!", "该属性不符合规范!")
  657.                     Else
  658.                         pCCHPWR = value
  659.                         MsMaxPower = Min(pCCHPWR, pPmax)
  660.                     End If
  661.                 End If
  662.             End Set
  663.         End Property
  664.         Private pGPRS_MS_TXPWR_MAX_CCH As Integer = 33             ''默认值33 取值范围[4~43]
  665.         Public Property GPRS_MS_TXPWR_MAX_CCH() As Integer
  666.             Get
  667.                 Return pGPRS_MS_TXPWR_MAX_CCH
  668.             End Get
  669.             Set(ByVal value As Integer)
  670.                 If value < 4 Then
  671.                     MessageBox.Show("GPRS_MS_TXPWR_MAX_CCH属性值应该在4~43之间." & vbNewLine & "您现在设置的属性小于4!", "该属性不符合规范!")
  672.                 Else
  673.                     If value > 43 Then
  674.                         MessageBox.Show("GPRS_MS_TXPWR_MAX_CCH属性值应该在4~43之间." & vbNewLine & "您现在设置的属性大于43!", "该属性不符合规范!")
  675.                     Else
  676.                         pGPRS_MS_TXPWR_MAX_CCH = value
  677.                     End If
  678.                 End If
  679.             End Set
  680.         End Property
  681.         Private pPmin As Integer = 13              ''默认值13 取值范围[4~43]
  682.         '                                             'GSM800/900 []
  683.         '13 到 43 步长为 2  (GSM 800). 
  684.         '13 到 43 步长为 2  (GSM 900). 
  685.         '4  到 30 步长为 2  (GSM 1800). 
  686.         '4  到 30 步长为 2  (GSM 1900)
  687.         Public Property Pmin() As Integer
  688.             Get
  689.                 Return pPmin
  690.             End Get
  691.             Set(ByVal value As Integer)
  692.                 If value < 4 Then
  693.                     MessageBox.Show("Pmin属性值应该在4~43之间." & vbNewLine & "您现在设置的属性小于4!", "该属性不符合规范!")
  694.                 Else
  695.                     If value > 700 Then
  696.                         MessageBox.Show("Pmin属性值应该在4~43之间." & vbNewLine & "您现在设置的属性大于43!", "该属性不符合规范!")
  697.                     Else
  698.                         pPmin = value
  699.                     End If
  700.                 End If
  701.             End Set
  702.         End Property
  703.         Private pPmax As Integer = 33              ''默认值33 取值范围[13~43]
  704.         Public Property Pmax() As Integer
  705.             Get
  706.                 Return pPmax
  707.             End Get
  708.             Set(ByVal value As Integer)
  709.                 If value < 13 Then
  710.                     MessageBox.Show("Pmax属性值应该在13~43之间." & vbNewLine & "您现在设置的属性小于13!", "该属性不符合规范!")
  711.                 Else
  712.                     If value > 700 Then
  713.                         MessageBox.Show("Pmax属性值应该在13~43之间." & vbNewLine & "您现在设置的属性大于43!", "该属性不符合规范!")
  714.                     Else
  715.                         pPmax = value
  716.                         MsMaxPower = Min(pCCHPWR, pPmax)
  717.                     End If
  718.                 End If
  719.             End Set
  720.         End Property
  721.         Private pCellType As String = "GSM900"      '[GSM900,GSM1800,GSM800,GSM1900]
  722.         Public Property CellType() As String
  723.             Get
  724.                 Return pCellType
  725.             End Get
  726.             Set(ByVal value As String)
  727.                 Select Case value
  728.                     Case "GSM800", "GSM900"
  729.                         pGAMMA0 = 39
  730.                         pCellType = value
  731.                     Case "GSM1800", "GSM1900"
  732.                         pGAMMA0 = 36
  733.                         pCellType = value
  734.                     Case Else
  735.                         MessageBox.Show("CellType(小区类型)属性值应该在[GSM900,GSM1800,GSM800,GSM1900]之间的一个.", "该属性不符合规范!")
  736.                 End Select
  737.             End Set
  738.         End Property
  739. #End Region
  740.         Public Sub calculate_GPRS_MS_DPC()
  741.             For I As Integer = 0 To 62 Step 2
  742.                 pGAMMA = I
  743.                 For J As Integer = 0 To 63
  744.                     GPRS_BTS_DPC_Arr(I / 2, J) = GPRS_DPC_BTS_dB(J - 110)
  745.                     'Debug.Print("J-110: GAMMA=" & pGAMMA & " C=" & J - 110 & " dB=" & GPRS_DPC_BTS_dB(J - 110))
  746.                     'Debug.Print("J    : GAMMA=" & pGAMMA & " C=" & J - 110 & " dB=" & GPRS_DPC_BTS_dB(J))
  747.                 Next
  748.             Next
  749.         End Sub
  750.         Public Sub calculate_GPRS_MS_DPC(ByVal fGAMMA As Integer, ByVal fALPHA As Single)
  751.             GAMMA = fGAMMA
  752.             ALPHA = fALPHA
  753.             calculate_GPRS_MS_DPC()
  754.         End Sub
  755.         Public Sub calculate_GPRS_MS_DPC(ByVal fGAMMA As Integer, ByVal fALPHA As Single, ByVal fGAMMA0 As Integer)
  756.             GAMMA = fGAMMA
  757.             ALPHA = fALPHA
  758.             GAMMA0 = fGAMMA0
  759.             calculate_GPRS_MS_DPC()
  760.         End Sub
  761.         Public Sub calculate_GPRS_MS_DPC(ByVal fGAMMA As Integer, ByVal fALPHA As Single, ByVal fGAMMA0 As Integer _
  762.                                        , ByVal fPmax As Integer, ByVal fPmin As Integer)
  763.             GAMMA = fGAMMA
  764.             ALPHA = fALPHA
  765.             GAMMA0 = fGAMMA0
  766.             Pmax = fPmax
  767.             Pmin = fPmin
  768.             calculate_GPRS_MS_DPC()
  769.         End Sub
  770.         Public Function GPRS_DPC_BTS_dB(ByVal C As Single) As Single
  771.             'P=min(Pmax,GAMMA0-GAMMA-ALPHA(C+48))
  772.             'GAMMA=GAMMA0-BSPWRB-SStarget-48
  773.             GPRS_DPC_BTS_dB = Min(MsMaxPower, pGAMMA0 - pGAMMA - pALPHA * (C + 48))
  774.             GPRS_DPC_BTS_dB = Int(Max(GPRS_DPC_BTS_dB, pPmin))
  775.         End Function
  776.         Public Function GPRS_DPC_BTS_dB(ByVal C As Integer, ByVal fGAMMA As Integer, ByVal fALPHA As Single) As Single
  777.             GAMMA = fGAMMA
  778.             ALPHA = fALPHA
  779.             Return GPRS_DPC_BTS_dB(C)
  780.         End Function
  781.         Public Function GPRS_DPC_BTS_dB(ByVal C As Integer, ByVal fGAMMA As Integer, ByVal fALPHA As Single, ByVal fGAMMA0 As Integer) As Single
  782.             GAMMA = fGAMMA
  783.             ALPHA = fALPHA
  784.             GAMMA0 = fGAMMA0
  785.             Return GPRS_DPC_BTS_dB(C)
  786.         End Function
  787.         Public Function GPRS_DPC_BTS_dB(ByVal C As Integer, ByVal fGAMMA As Integer, ByVal fALPHA As Single, ByVal fGAMMA0 As Integer _
  788.                         , ByVal fPmax As Integer, ByVal fPmin As Integer) As Single
  789.             GAMMA = fGAMMA
  790.             ALPHA = fALPHA
  791.             GAMMA0 = fGAMMA0
  792.             Pmax = fPmax
  793.             Pmin = fPmin
  794.             Return GPRS_DPC_BTS_dB(C)
  795.         End Function
  796.     End Class
  797.     Public Class DPC_SubFunction
  798.         '提取最大值
  799.         Public Function Max(ByVal A As Double, ByVal B As Double) As Double
  800.             If A >= B Then
  801.                 Max = A
  802.             Else
  803.                 Max = B
  804.             End If
  805.         End Function
  806.         '提取最小值
  807.         Public Function Min(ByVal A As Double, ByVal B As Double) As Double
  808.             If A >= B Then
  809.                 Min = B
  810.             Else
  811.                 Min = A
  812.             End If
  813.         End Function
  814.         'Table 2    Table with relations due to non-linear rxqual to C/I mapping
  815.         'QDESDL [dtqu] 0 10 20 30 40 50 60 70
  816.         'rxqual 0 1 2 3 4 5 6 7
  817.         'C/I [dB] 23 19 17 15 13 11 8 4
  818.         '由QUAL(dtqu)估算出C/I的dB值
  819.         'R10,R12采用非线性的算法,跟R9等算法不一样
  820.         Public Function dtquTodB(ByVal RXQUAL_dtqu As Double) As Double
  821.             Select Case RXQUAL_dtqu
  822.                 Case 0 To 10
  823.                     dtquTodB = Interpolation_dB(RXQUAL_dtqu, 0, 10, 23, 19)
  824.                 Case 10 To 20
  825.                     dtquTodB = Interpolation_dB(RXQUAL_dtqu, 10, 20, 19, 17)
  826.                 Case 20 To 30
  827.                     dtquTodB = Interpolation_dB(RXQUAL_dtqu, 20, 30, 17, 15)
  828.                 Case 30 To 40
  829.                     dtquTodB = Interpolation_dB(RXQUAL_dtqu, 30, 40, 15, 13)
  830.                 Case 40 To 50
  831.                     dtquTodB = Interpolation_dB(RXQUAL_dtqu, 40, 50, 13, 11)
  832.                 Case 50 To 60
  833.                     dtquTodB = Interpolation_dB(RXQUAL_dtqu, 50, 60, 11, 8)
  834.                 Case 60 To 70
  835.                     dtquTodB = Interpolation_dB(RXQUAL_dtqu, 60, 70, 8, 4)
  836.             End Select
  837.         End Function
  838.         '在查表得出最大值和最小值的基础上再进行修改,得出比价精确的C/I值(dB)
  839.         Private Function Interpolation_dB(ByVal QDES As Double, ByVal QDESmax As Double, ByVal QDESmin As Double, ByVal CImax As Double, ByVal CImin As Double) As Double
  840.             Interpolation_dB = (QDES - QDESmin) / (QDESmax - QDESmin) * (CImax - CImin) + CImin
  841.             'Interpolation_dB = CImax + (QDES - QDESmax) / (QDESmax - QDESmin) * (CImax - CImin))
  842.             'dtqu转换到C/I(dB)是非线性的,但是在查表的到的1/8*8的部分是线性的
  843.             '上面两个算法都可以得出正确的估算值,使用一个即可
  844.         End Function
  845.     End Class
  846. End Class