| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 | 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{    /// <summary>    /// 信号检测、识别、变采样接口    /// </summary>    public class CheckController : BaseController    {        /// <summary>        /// 信号检测(支持DAMA、IBS、能量检测)(需要先上传文件)        /// </summary>        /// <param name="dto">信号检测参数</param>        /// <returns></returns>        [HttpPost]        public async Task<AjaxResult<List<DetectResDto>>> Calc(DetectDto dto)        {            try            {                dto.file1 = GetLocalFile(dto.file1);                List<DetectResDto> list = new List<DetectResDto>();                List<DmcResult> listRes = new List<DmcResult>();                List<DmcResult> dmcResults = new List<DmcResult>();                List<DmcResult> ibsResults = new List<DmcResult>();                List<DmcResult> kyResults = new List<DmcResult>();                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);                    }                }                return Success(list);            }            catch (Exception ex)            {                Serilog.Log.Error(ex, $"{dto.dmcType}检测异常");                return Error<List<DetectResDto>>($"{dto.dmcType}检测异常");            }        }        /// <summary>        /// 文件变采样(需要先上传文件)        /// </summary>        /// <param name="dto"></param>        /// <returns></returns>        public async Task<AjaxResult<ResampleResponseDto>> 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<ResampleResponseDto>("变采样后的文件未能生成");                        else                            return Success(new ResampleResponseDto() { File = Path.GetFileName(outFile), OutFsHz = dto.OutFsHz });                    }                    else                    {                        return Error<ResampleResponseDto>("变采样算法返回失败");                    }                }                catch (Exception ex)                {                    Serilog.Log.Error(ex, "变采样算法执行异常");                    return Error<ResampleResponseDto>("变采样算法执行异常");                }            });            return res;        }        /// <summary>        /// 信号识别(调制类型、调制速率、频偏)        /// </summary>        /// <param name="dto">信号检测参数</param>        /// <returns></returns>        [HttpPost]        public async Task<AjaxResult<List<SignalProcResDto>>> SignalProc(SignalProcDto dto)        {            Serilog.Log.Information($"正在识别文件{dto.File}");            return await Task.Run(() =>            {                try                {                    dto.File = GetLocalFile(dto.File);                    List<SignalProcResDto> list = new List<SignalProcResDto>();                    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);                    }                    return Success(list);                }                catch (Exception ex)                {                    Serilog.Log.Error(ex, "信号识别算法执行异常");                    return Error<List<SignalProcResDto>>($"信号识别算法执行异常");                }            });        }        //求最大公约数        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;        }    }}
 |