using CheckServer.AddIns; using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Web.Http; using XdCxRhDW.Dto; using XdCxRhDW.WebApi; namespace CheckServer.Controllers { /// /// 信号检测、识别、变采样接口 /// public class CheckController : BaseController { /// /// 信号检测(支持DAMA、IBS、能量检测)(需要先上传文件、会根据信号带宽自动对文件进行滤波) /// /// 信号检测参数 /// [HttpPost] public async Task>> Calc(DetectDto dto) { try { GC.Collect(); dto.file1 = GetLocalFile(dto.file1); var bandHz = dto.band * 1e3; string outFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", $"{Path.GetFileNameWithoutExtension(dto.file1)}_filter.dat"); dto.file1 = await SigFilterHelper.SigFilter(new SigFilterDto() { BandHz = bandHz, File = dto.file1, FsHz = dto.fsHz, TimeoutSeconds = dto.TimeoutSeconds, }, outFile); if (!File.Exists(dto.file1)) { return Error>("滤波后的文件未能生成"); } List list = new List(); List listRes = new List(); List dmcResults = new List(); List ibsResults = new List(); List kyResults = new List(); if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.DAMA)) { var damaVersion = ConfigurationManager.AppSettings["DamaVersion"]; if (string.IsNullOrWhiteSpace(damaVersion) || damaVersion.Trim() == "1") { var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band); dmcResults.AddRange(dmcResult); } else if (damaVersion.Trim() == "2") { var dmcResult = await CheckHelper.DAMACheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band); dmcResults.AddRange(dmcResult); } else { var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band); dmcResults.AddRange(dmcResult); if (dmcResult == null || !dmcResult.Any()) { var dmcResult2 = await CheckHelper.DAMACheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band); dmcResults.AddRange(dmcResult); } } } if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.IBS)) { var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.IBS, dto.band); ibsResults.AddRange(dmcResult); } if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.Ky5758)) { var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.Ky5758, dto.band); kyResults.AddRange(dmcResult); } if (dto.mergeRes) { listRes.AddRange(dmcResults); var ibsCopy = ibsResults.Skip(0).ToList(); foreach (var item in ibsResults) { if (listRes.Any(p => CalcIntersecLen(p, item) > 500)) ibsCopy.Remove(item);//IBS结果在DAMA中重叠超过500长度,忽略 } listRes.AddRange(ibsCopy); var kyCopy = kyResults.Skip(0).ToList(); foreach (var item in kyResults) { if (listRes.Any(p => CalcIntersecLen(p, item) > 500)) kyCopy.Remove(item);//KY结果在DAMA或IBS中重叠超过500长度,忽略 } listRes.AddRange(kyCopy); foreach (var dmcItem in listRes) { DetectResDto detectRes = new DetectResDto(dmcItem.Start, dmcItem.Length, dmcItem.UserName); detectRes.ModType = dmcItem.ModType; detectRes.DmcType = dmcItem.DmcType; detectRes.File1 = dto.file1; detectRes.TimeMs = dmcItem.Times; list.Add(detectRes); } } else { listRes.AddRange(dmcResults); listRes.AddRange(ibsResults); listRes.AddRange(kyResults); foreach (var dmcItem in listRes) { DetectResDto detectRes = new DetectResDto(dmcItem.Start, dmcItem.Length, dmcItem.UserName); detectRes.ModType = dmcItem.ModType; detectRes.DmcType = dmcItem.DmcType; detectRes.File1 = dto.file1; detectRes.TimeMs = dmcItem.Times; list.Add(detectRes); } } await LogHelper.Info($"文件{Path.GetFileName(dto.file1)}检测完成"); return Success(list); } catch (Exception ex) { await LogHelper.Error($"文件【{Path.GetFileName(dto.file1)}】{dto.dmcType}检测异常", ex); return Error>($"{dto.dmcType}检测异常"); } } /// /// 文件变采样(需要先上传文件) /// /// /// public async Task> Resample(ResampleRequestDto dto) { var res = await Task.Run(async () => { try { string fileIn = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", dto.File); string fileOut = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", Guid.NewGuid() + ".dat"); var val = Gcd(dto.FsHz, dto.OutFsHz);//最大公约数 var insertFactor = dto.OutFsHz / val; var extFactor = dto.FsHz / val; var outFile = ReSampleHelper.Resample(fileIn, fileOut, insertFactor, extFactor, dto.TimeoutSeconds); if (!string.IsNullOrWhiteSpace(outFile)) { if (!File.Exists(outFile)) return Error("变采样后的文件未能生成"); else return Success(new ResampleResponseDto() { File = Path.GetFileName(outFile), OutFsHz = dto.OutFsHz }); } else { return Error("变采样算法返回失败"); } } catch (Exception ex) { await LogHelper.Error($"变采样算法执行异常", ex); return Error("变采样算法执行异常"); } }); return res; } /// /// 信号识别(调制类型、调制速率、频偏) /// /// 信号检测参数 /// [HttpPost] public async Task>> SignalProc(SignalProcDto dto) { await LogHelper.Info($"正在识别文件{dto.File}"); return await Task.Run(async () => { try { dto.File = GetLocalFile(dto.File); List list = new List(); var res = SignalProcHelper.SigalEst(dto.File, dto.Fs , dto.Smps.Select(p => (int)p.smpStart).ToArray() , dto.Smps.Select(p => (int)p.smpCount).ToArray()); foreach (var item in res) { SignalProcResDto resItem = new SignalProcResDto() { Snr = item.Snr, Ffc = item.Ffc, Rate = item.Rate, ModType = (EnumSignalTypeDto)(int)item.SignalType }; list.Add(resItem); } await LogHelper.Info($"文件{Path.GetFileName(dto.File)}识别完成"); return Success(list); } catch (Exception ex) { await LogHelper.Error($"文件{Path.GetFileName(dto.File)}识别异常", ex); return Error>($"信号识别算法执行异常"); } }); } /// /// 对信号文件进行滤波处理(需要先上传文件) /// /// 信号滤波参数 /// [HttpPost] public async Task> SigFilterProc(SigFilterDto dto) { try { await LogHelper.Info($"正在滤波处理文件{dto.File}"); dto.File = GetLocalFile(dto.File); string outFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", Guid.NewGuid() + "filter.dat"); outFile = await SigFilterHelper.SigFilter(dto, outFile); if (!File.Exists(outFile)) { return Error("滤波后的文件未能生成"); } else { await LogHelper.Info($"文件{Path.GetFileName(dto.File)}滤波完成"); return Success(new SigFilterResponseDto() { File = Path.GetFileName(outFile) }); } } catch (Exception ex) { await LogHelper.Error($"文件{Path.GetFileName(dto.File)}滤波异常", ex); return Error($"信号滤波算法执行异常"); } } //求最大公约数 private int Gcd(int M, int N) { int Rem; while (N > 0) { Rem = M % N; M = N; N = Rem; } return M; } //计算两个时隙交集的长度,无交集返回0 private int CalcIntersecLen(DmcResult dto1, DmcResult dto2) { if (dto2.Start >= dto1.Start + dto1.Length) return 0; if (dto1.Start >= dto2.Start + dto2.Length) return 0; int maxStart = Math.Max(dto1.Start, dto2.Start); int minEnd = Math.Min(dto1.Start + dto1.Length, dto2.Start + dto2.Length); return minEnd - maxStart + 1; } } }