using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using System.Web.Http; using XdCxRhDW.Api; using XdCxRhDW.Dto; using XdCxRhDW.WebApi; namespace XdCxRhDW.App.Controllers { /// /// 检测参估功能相关接口 /// public class DetectCgController : BaseController { /// /// CPU参估计算(需要先上传文件) /// /// CPU参估参数 /// [HttpPost] public async Task> CpuCgCalc(CpuCgDto dto) { dto.file1 = GetLocalFile(dto.file1); dto.file2 = GetLocalFile(dto.file2); XcorrStruct xItem = new XcorrStruct(); xItem.file1 = dto.file1; xItem.file2 = dto.file2; xItem.samplingRate = dto.samplingRate; xItem.dtCenter = dto.dtCenter; xItem.dtRange = dto.dtRange; xItem.dfRange = dto.dfRange; FileInfo file1 = new FileInfo(dto.file1); FileInfo file2 = new FileInfo(dto.file2); long totalsamp = file1.Length < file2.Length ? file1.Length / 4 : file2.Length / 4; //样点数为0时计算所有样本 if (dto.smpCount == 0) { xItem.smpCount = (int)totalsamp - dto.smpStart; } else if (dto.smpCount > 0 && dto.smpCount < 1) { xItem.smpCount = (int)(totalsamp * dto.smpCount); } else { xItem.smpCount = dto.smpCount; } xItem.smpStart = dto.smpStart; xItem.snrThreshold = dto.snrThreshold; CpuCgResDto resDto = new CpuCgResDto(); try { XcorrUtils xcorr = new XcorrUtils(); var result = await xcorr.Calc(xItem); //开始计算 if (result.flag == -2) { Serilog.Log.Error("参估计算内部错误!"); return Error("参估计算内部错误!"); } else if (result.flag == -1) { Serilog.Log.Error("参估计算所需数据超出文件范围!"); return Error("参估计算所需数据超出文件范围!"); } resDto.TimeMs = result.tm; resDto.Smpstart = result.smpstart; resDto.Smplen = result.smplen; if (result.flag == 1) { resDto.Dt = result.dt.Value; resDto.Df = result.df.Value; resDto.Snr = result.snr.Value; } } catch (Exception ex) { Serilog.Log.Error(ex, "执行CPU参估异常"); return Error($"执行CPU参估异常"); } return Success(resDto); } /// /// CPU参估多样点位置计算(需要先上传文件) /// /// CPU参估多样点位置参数 /// [HttpPost] public async Task>> CpuCgMultiCalc(CpuCgMultiDto dto) { dto.file1 = GetLocalFile(dto.file1); dto.file2 = GetLocalFile(dto.file2); XcorrStruct xItem = new XcorrStruct(); xItem.file1 = dto.file1; xItem.file2 = dto.file2; xItem.samplingRate = dto.samplingRate; xItem.dtCenter = dto.dtCenter; xItem.dtRange = dto.dtRange; xItem.dfRange = dto.dfRange; xItem.snrThreshold = dto.snrThreshold; List resDtos = new List(); foreach (var smpItem in dto.smpPositions) { try { XcorrUtils xcorr = new XcorrUtils(); xItem.smpStart = smpItem.smpStart; xItem.smpCount = smpItem.smpCount; var result = await xcorr.Calc(xItem); //开始计算 if (result.flag == -2) { Serilog.Log.Error("参估计算内部错误!"); continue; } else if (result.flag == -1) { Serilog.Log.Error("参估计算所需数据超出文件范围!"); continue; } CpuCgResDto resDto = new CpuCgResDto(); resDto.TimeMs = result.tm; resDto.Smpstart = result.smpstart; resDto.Smplen = result.smplen; if (result.flag == 1) { resDto.Dt = result.dt.Value; resDto.Df = result.df.Value; resDto.Snr = result.snr.Value; resDtos.Add(resDto); } } catch (Exception ex) { Serilog.Log.Error(ex, "执行CPU参估异常"); continue; } } return Success(resDtos); } /// /// GPU参估计算(需要先上传文件) /// /// GPU参估参数 /// [HttpPost] public async Task>> GpuCgCalc(GpuCgRequestDto dto) { dto.file1 = GetLocalFile(dto.file1); dto.file2 = GetLocalFile(dto.file2); FileInfo file1 = new FileInfo(dto.file1); FileInfo file2 = new FileInfo(dto.file2); long totalsamp = file1.Length < file2.Length ? file1.Length / 4 : file2.Length / 4; //样点数为0时计算所有样本 if (dto.smpCount == 0) { dto.smpCount = totalsamp; } else if (dto.smpCount > 0 && dto.smpCount < 1) { dto.smpCount = (long)(totalsamp * dto.smpCount); } CpuCgResDto resDto = new CpuCgResDto(); try { var result = await Task.Run(() => { return GpuCgHelper.Calc(dto.file1, dto.file2, dto.samplingRate, dto.smpCount, dto.dtCenter, dto.dtRange, dto.dfRange, dto.snrThreshold, dto.TimeoutSeconds); }); return Success(result); } catch (Exception ex) { Serilog.Log.Error(ex, "执行GPU参估异常"); return Error>($"执行GPU参估异常"); } } /// /// 信号检测(支持DAMA、IBS、能量检测)(需要先上传文件) /// /// 信号检测参数 /// [HttpPost] public async Task>> DetectCalc(DetectDto dto) { dto.file1 = GetLocalFile(dto.file1); List list = new List(); try { List dmcResults = new List(); XcorrUtils xcorr = new XcorrUtils(); if (dto.dmcType.HasFlag(DmcType.DAMA)) { var dmcResult = await xcorr.DmcCheckAsync(dto.file1, dto.fsHz, DmcType.DAMA, dto.band); dmcResults.AddRange(dmcResult); } if (dto.dmcType.HasFlag(DmcType.IBS)) { var dmcResult = await xcorr.DmcCheckAsync(dto.file1, dto.fsHz, DmcType.IBS, dto.band); dmcResults.AddRange(dmcResult); } if (dto.dmcType.HasFlag(DmcType.Ky5758)) { var dmcResult = await xcorr.DmcCheckAsync(dto.file1, dto.fsHz, DmcType.Ky5758, dto.band); dmcResults.AddRange(dmcResult); } foreach (var dmcItem in dmcResults) { 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); } } catch (Exception ex) { return Error>($"执行检测计算异常,{ex.Message}"); } return Success(list); } /// /// 文件变采样(需要先上传文件) /// /// /// public async Task> Resample(ResampleRequestDto dto) { var res = await Task.Run(() => { 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("变采样算法调用失败"); } }); return res; } //求最大公约数 private int Gcd(int M, int N) { int Rem; while (N > 0) { Rem = M % N; M = N; N = Rem; } return M; } } }