CheckController.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. 
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using System.Web.Http;
  8. using XdCxRhDW.Dto;
  9. using XdCxRhDW.WebApi;
  10. namespace CheckServer.Controllers
  11. {
  12. /// <summary>
  13. /// 信号检测、识别、变采样接口
  14. /// </summary>
  15. public class CheckController : BaseController
  16. {
  17. /// <summary>
  18. /// 信号检测(支持DAMA、IBS、能量检测)(需要先上传文件)
  19. /// </summary>
  20. /// <param name="dto">信号检测参数</param>
  21. /// <returns></returns>
  22. [HttpPost]
  23. public async Task<AjaxResult<List<DetectResDto>>> Calc(DetectDto dto)
  24. {
  25. try
  26. {
  27. dto.file1 = GetLocalFile(dto.file1);
  28. List<DetectResDto> list = new List<DetectResDto>();
  29. List<DmcResult> dmcResults = new List<DmcResult>();
  30. if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.DAMA))
  31. {
  32. var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band);
  33. dmcResults.AddRange(dmcResult);
  34. }
  35. if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.IBS))
  36. {
  37. var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.IBS, dto.band);
  38. dmcResults.AddRange(dmcResult);
  39. }
  40. if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.Ky5758))
  41. {
  42. var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.Ky5758, dto.band);
  43. dmcResults.AddRange(dmcResult);
  44. }
  45. foreach (var dmcItem in dmcResults)
  46. {
  47. DetectResDto detectRes = new DetectResDto(dmcItem.Start, dmcItem.Length, dmcItem.UserName);
  48. detectRes.ModType = dmcItem.ModType;
  49. detectRes.DmcType = dmcItem.DmcType;
  50. detectRes.File1 = dto.file1;
  51. detectRes.TimeMs = dmcItem.Times;
  52. list.Add(detectRes);
  53. }
  54. return Success(list);
  55. }
  56. catch (Exception ex)
  57. {
  58. Serilog.Log.Error(ex, $"{dto.dmcType}检测异常");
  59. return Error<List<DetectResDto>>($"{dto.dmcType}检测异常");
  60. }
  61. }
  62. /// <summary>
  63. /// 文件变采样(需要先上传文件)
  64. /// </summary>
  65. /// <param name="dto"></param>
  66. /// <returns></returns>
  67. public async Task<AjaxResult<ResampleResponseDto>> Resample(ResampleRequestDto dto)
  68. {
  69. var res = await Task.Run(() =>
  70. {
  71. try
  72. {
  73. string fileIn = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", dto.File);
  74. string fileOut = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", Guid.NewGuid() + ".dat");
  75. var val = Gcd(dto.FsHz, dto.OutFsHz);//最大公约数
  76. var insertFactor = dto.OutFsHz / val;
  77. var extFactor = dto.FsHz / val;
  78. var outFile = ReSampleHelper.Resample(fileIn, fileOut, insertFactor, extFactor, dto.TimeoutSeconds);
  79. if (!string.IsNullOrWhiteSpace(outFile))
  80. {
  81. if (!File.Exists(outFile))
  82. return Error<ResampleResponseDto>("变采样后的文件未能生成");
  83. else
  84. return Success(new ResampleResponseDto() { File = Path.GetFileName(outFile), OutFsHz = dto.OutFsHz });
  85. }
  86. else
  87. {
  88. return Error<ResampleResponseDto>("变采样算法返回失败");
  89. }
  90. }
  91. catch (Exception ex)
  92. {
  93. Serilog.Log.Error(ex, "变采样算法执行异常");
  94. return Error<ResampleResponseDto>("变采样算法执行异常");
  95. }
  96. });
  97. return res;
  98. }
  99. /// <summary>
  100. /// 信号识别(调制类型、调制速率、频偏)
  101. /// </summary>
  102. /// <param name="dto">信号检测参数</param>
  103. /// <returns></returns>
  104. [HttpPost]
  105. public async Task<AjaxResult<List<SignalProcResDto>>> SignalProc(SignalProcDto dto)
  106. {
  107. return await Task.Run(() =>
  108. {
  109. try
  110. {
  111. dto.File = GetLocalFile(dto.File);
  112. List<SignalProcResDto> list = new List<SignalProcResDto>();
  113. var res = SignalProcHelper.SigalEst(dto.File, dto.Fs
  114. , dto.Smps.Select(p => (int)p.smpStart).ToArray()
  115. , dto.Smps.Select(p => (int)p.smpCount).ToArray());
  116. foreach (var item in res)
  117. {
  118. SignalProcResDto resItem = new SignalProcResDto()
  119. {
  120. Ffc = item.Ffc,
  121. Rate = item.Rate,
  122. ModType = (EnumSignalTypeDto)(int)item.SignalType
  123. };
  124. list.Add(resItem);
  125. }
  126. return Success(list);
  127. }
  128. catch (Exception ex)
  129. {
  130. Serilog.Log.Error(ex, "信号识别算法执行异常");
  131. return Error<List<SignalProcResDto>>($"信号识别算法执行异常");
  132. }
  133. });
  134. }
  135. //求最大公约数
  136. private int Gcd(int M, int N)
  137. {
  138. int Rem;
  139. while (N > 0)
  140. {
  141. Rem = M % N;
  142. M = N;
  143. N = Rem;
  144. }
  145. return M;
  146. }
  147. }
  148. }