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;
}
}
}