V1.2 2018-07-10:
1,增加UMTS GSM CDMA TDS部分计算功能。
2,暂时CDMA 只支持BC0,WCDMA不支持additional 频点
3,下方代码在新的代码中已经完全修改,留着只是参考。
链接: https://pan.baidu.com/s/1Qlboo38--EEGGU4-hQu9tg 密码: 3xyg
V1.1 2018-6-12:
1,增加了NR部分频点频率计算。
2,增加输入band计算频点频率上下限功能。
2018-5-13:代码稍微做了些修改,已经release出来分享在百度网盘,欢迎使用。
using System;using System.Collections;using System.Collections.Generic;namespace Helloworld{ class Earfcn { #region 频点频率对应关系 ////// 下行频率频点对应关系,36141-e10 /// private static double[,] lstFdlNdl = { { 0,0,0}, //Band0 { 2110,0,599}, { 1930,600,1199}, { 1805,1200,1949}, { 2110,1950,2399}, { 869,2400,2649}, //Band5 { 875,2650,2749}, { 2620,2750,3449}, { 925,3450,3799}, { 1844.9,3800,4149}, { 2110,4150,4749}, //Band10 { 1475.9,4750,4949}, { 729,5010,5179}, { 746,5180,5279}, { 758,5280,5379}, { 0,0,0}, { 0,0,0}, { 734,5730,5849}, //Band17 { 860,5850,5999}, { 875,6000,6149}, { 791,6150,6449}, //Band20 { 1495.9,6450,6599}, { 3510,6600,7399}, { 2180,7500,7699}, { 1525,7700,8039}, { 1930,8040,8689}, //Band25 { 859,8690,9039}, { 852,9040,9209}, { 758,9210,9659}, { 717,9660,9769}, { 2350,9770,9869}, //Band30 { 462.5,9870,9919}, { 1452,9920,10359}, { 1900,36000,36199}, { 2010,36200,36349}, { 1850,36350,36949}, //Band35 { 1930,36950,37549}, { 1910,37550,37749}, { 2570,37750,38249}, { 1880,38250,38649}, { 2300,38650,39649}, //Band40 { 2496,39650,41589}, { 3400,41590,43589}, { 3600,43590,45589}, { 703,45590,46589}, { 1447,46590,46789}, //Band45 { 5150,46790,54539}, { 5855,54540,55239}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 2110,65536,66435}, //Band65 { 2110,66436,67335}, { 738,67336,67535}, { 753,67536,67835}, { 2570,67836,68335}, { 1995,68336,68485} //Band70 }; ////// 上行频率频点对应关系,36141-e10 /// static double[,] lstFulNul = { { 0,0,0}, //Band0 { 1920,18000,18599}, { 1850,18600,19199}, { 1710,19200,19949}, { 1710,19950,20399}, { 824,20400,20649}, //Band5 { 830,20650,20749}, { 2500,20750,21449}, { 880,21450,21799}, { 1749.9,21800,22149}, { 1710,22150,22749}, //Band10 { 1427.9,22750,22949}, { 699,23010,23179}, { 777,23180,23279}, { 788,23280,23379}, { 0,0,0}, { 0,0,0}, { 704,23730,23849}, //Band17 { 815,23850,23999}, { 830,24000,24149}, { 832,24150,24449}, //Band20 { 1447.9,24450,24599}, { 3410,24600,25399}, { 2000,25500,25699}, { 1626.5,25700,26039}, { 1850,26040,26689}, //Band25 { 814,26690,27039}, { 807,27040,27209}, { 703,27210,27659}, { 0,0,0}, { 2305,27660,27759}, //Band30 { 452.5,27760,27809}, { 0,0,0}, { 1900,36000,36199}, { 2010,36200,36349}, { 1850,36350,36949}, //Band35 { 1930,36950,37549}, { 1910,37550,37749}, { 2570,37750,38249}, { 1880,38250,38649}, { 2300,38650,39649}, //Band40 { 2496,39650,41589}, { 3400,41590,43589}, { 3600,43590,45589}, { 703,45590,46589}, { 1447,46590,46789}, //Band45 { 5150,46790,54539}, { 5855,54540,55239}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 0,0,0}, { 1920,131072,131971}, //Band65 { 1710,131972,132671}, { 0,0,0}, { 698,132672,132971}, { 0,0,0}, { 1695,132972,133221}, //Band70 }; #endregion 频点频率对应关系 #region 通过频率获取其他信息 ////// 一次返回下行band 频率初始值 频点初始值,使用时需要注意返回值为ArrayList /// /// 下行频率 ///private static ArrayList dlfrequencyToBandFlowNlow(double _frequency) { ArrayList list = new ArrayList(); for (int i = 0; i < lstFdlNdl.GetLongLength(0); i++) { if (_frequency > lstFdlNdl[i, 0] && _frequency < (lstFdlNdl[i, 0] + (lstFdlNdl[i, 2] - lstFdlNdl[i, 1]) / 10)) { list.Add(i); list.Add(lstFdlNdl[i, 0]); list.Add(lstFdlNdl[i, 1]); } } return list; } /// /// 一次性返回上行band 频率初始值 频点初始值,使用时需要注意返回值为ArrayList /// /// 上行频点 ///private static ArrayList ulfrequencyToBandFlowNlow(double _frequency) { ArrayList list = new ArrayList(); for (int i = 0; i < lstFulNul.GetLongLength(0); i++) { if (_frequency > lstFulNul[i, 0] && _frequency < (lstFulNul[i, 0] + (lstFulNul[i, 2] - lstFulNul[i, 1]) / 10)) { list.Add(i); list.Add(lstFulNul[i, 0]); list.Add(lstFulNul[i, 1]); } } return list; } /// /// 根据下行频率计算下行频点 /// /// 下行频率 ///public static int[] GetearfcnDl(double _frequency) { ArrayList list = dlfrequencyToBandFlowNlow(_frequency); List earfcns = new List (); for (int i = 1; i < list.Count; i += 3) { earfcns.Add(Convert.ToInt32(list[i + 1]) + (int)((_frequency - (double)list[i]) * 10)); } return earfcns.ToArray(); } /// /// 根据上行频率计算上行频点 /// /// 上行频率 ///public static int[] GetearfcnUl(double _frequency) { ArrayList list = ulfrequencyToBandFlowNlow(_frequency); List earfcns = new List (); for (int i = 1; i < list.Count; i += 3) { earfcns.Add(Convert.ToInt32(list[i + 1]) + (int)((_frequency - (double)list[i]) * 10)); } return earfcns.ToArray(); } /// /// 根据下行频率计算Band /// /// ///public static int[] GetBandByDlFre(double _frequency) { ArrayList list = dlfrequencyToBandFlowNlow(_frequency); ArrayList Bands = new ArrayList(); for (int i = 0; i < list.Count; i += 3) { Bands.Add((int)list[i]); } return (int[])Bands.ToArray(typeof(Int32)); } /// /// 根据上行频率计算Band /// /// ///public static int[] GetBandByUlFre(double _frequency) { ArrayList list = ulfrequencyToBandFlowNlow(_frequency); ArrayList Bands = new ArrayList(); for (int i = 0; i < list.Count; i += 3) { Bands.Add((int)list[i]); } return (int[])Bands.ToArray(typeof(Int32)); } #endregion 通过频率获取其他信息 #region 通过频点获取其他信息 /// /// 一次返回下行band 频率初始值 频点初始值,使用时需要注意返回值为数组[band,起始频率,起始频点] /// /// 下行频点 ///private static double[] dlearfcnToBandFlowNlow(int _earfcn) { double[] list = new double[3]; for (int i = 0; i < lstFulNul.GetLongLength(0); i++) { if (_earfcn > lstFdlNdl[i, 1] && _earfcn < lstFdlNdl[i, 2]) { list[0] = (double)i; list[1] = lstFdlNdl[i, 0]; list[2] = lstFdlNdl[i, 1]; } } return list; } /// /// 一次性返回上行band 频率初始值 频点初始值,使用时需要注意返回值为数组[band,起始频率,起始频点] /// /// 上行频点 ///private static double[] ulearfcnToBandFlowNlow(int _earfcn) { double[] list = new double[3]; for (int i = 0; i < lstFulNul.GetLongLength(0); i++) { if (_earfcn > lstFulNul[i, 1] && _earfcn < lstFulNul[i, 2]) { list[0] = i; list[1] = lstFulNul[i, 0]; list[2] = lstFulNul[i, 1]; } } return list; } /// /// 根据下行频点获取物理频率 /// /// LTE下行频点 ///public static double GetFreDl(int _earfcn) { double[] list = dlearfcnToBandFlowNlow(_earfcn); double frequency = list[1] + (_earfcn - list[2]) / 10; return frequency; } /// /// 根据上行频点获取物理频率 /// /// LTE上行频点 ///public static double GetFreUl(int _earfcn) { double[] list = ulearfcnToBandFlowNlow(_earfcn); double frequency = list[1] + (_earfcn - list[2]) / 10; return frequency; } /// /// 根据下行频点获取Band /// /// LTE下行频点 ///public static int GetBandByDlearfcn(int _earfcn) { double[] list = dlearfcnToBandFlowNlow(_earfcn); return (int)list[0]; } /// /// 根据上行频点获取Band /// /// LTE上行频点 ///public static int GetBandByUlearfcn(int _earfcn) { double[] list = ulearfcnToBandFlowNlow(_earfcn); return (int)list[0]; } #endregion 通过频点获取其他信息 #region 中移动相关 /// /// 根据下行频点获取中移动规范子频段 /// /// LTE下行中心频点 ///public static string GetCmccBandByErcfcn(int _earfcn) { double frequency = GetFreDl(_earfcn); return GetCmccBandByFreDl(frequency); } /// /// 根据中移动频段划分,获取具体子频段 /// 这里需要注意连续子频段之间有重叠,实际重叠部分不应该规划为中心频点 /// /// 物理频率 ///子频段 public static string GetCmccBandByFreDl(double _frequency) { string result = "other"; if (_frequency > 2575 && _frequency < 2595) result = "D1"; else if (_frequency > 2594.8 && _frequency < 2614.8) result = "D2"; else if (_frequency > 2614.6 && _frequency < 2634.6) result = "D3"; else if (_frequency > 2320 && _frequency < 2340) result = "E1"; else if (_frequency > 2339.8 && _frequency < 2359.8) result = "E2"; else if (_frequency > 2359.2 && _frequency < 2369.2) result = "E3"; else if (_frequency > 1885 && _frequency < 1905) result = "F1"; else if (_frequency > 1904.4 && _frequency < 1914.4) result = "F2"; return result; } #endregion 中移动相关 }}