using System; using System.Collections.Generic; 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 { dto.file1 = GetLocalFile(dto.file1); List list = new List(); List dmcResults = new List(); if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.DAMA)) { var dmcResult = await CheckHelper.DmcCheckAsync(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); dmcResults.AddRange(dmcResult); } if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.Ky5758)) { var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.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); } return Success(list); } catch (Exception ex) { Serilog.Log.Error(ex, $"{dto.dmcType}检测异常"); return Error>($"{dto.dmcType}检测异常"); } } /// /// 文件变采样(需要先上传文件) /// /// /// public async Task> Resample(ResampleRequestDto dto) { var res = await Task.Run(() => { 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) { Serilog.Log.Error(ex, "变采样算法执行异常"); return Error("变采样算法执行异常"); } }); return res; } /// /// 信号识别(调制类型、调制速率、频偏) /// /// 信号检测参数 /// [HttpPost] public async Task>> SignalProc(SignalProcDto dto) { return await Task.Run(() => { 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() { Ffc = item.Ffc, Rate = item.Rate, ModType = (EnumSignalTypeDto)(int)item.SignalType }; list.Add(resItem); } return Success(list); } catch (Exception ex) { Serilog.Log.Error(ex, "信号识别算法执行异常"); return Error>($"信号识别算法执行异常"); } }); } //求最大公约数 private int Gcd(int M, int N) { int Rem; while (N > 0) { Rem = M % N; M = N; N = Rem; } return M; } } }