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<int>(); 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<int>(); 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 中移动相关 } }