/// <summary> /// 进行单次指纹生成仿真,包括信号生成、加噪和指纹生成 /// </summary> /// <param name="signal_type">信号类型</param> /// <param name="noise_type">噪声类型</param> /// <param name="noise_params">噪声参数集合,与噪声类型有关</param> /// <param name="fingerprint_name">指纹类型</param> /// <param name="ray_angles">波束方向集合</param> /// <param name="ray_strengths">波束强度集合</param> /// <param name="ray_taus">波束时延集合</param> /// <param name="N">信号点数</param> /// <param name="args">args参数集合,与信号类型有关</param> /// <returns></returns> public Fingerprint SingleFingerprintSim(Signal_Type signal_type, Noise_Type noise_type, double[] noise_params, Fingerprint_Name fingerprint_name, List<double>[] ray_angles, List<double>[] ray_strengths, List<double>[] ray_taus, int N, double[] args) { MWNumericArray[] signals = new MWNumericArray[ray_angles.GetLength(0)]; for(int i = 0; i < signals.Length; i++) { signals[i] = this.GenerateSignal_MW(signal_type, ray_angles[i].ToArray(), ray_strengths[i].ToArray(), ray_taus[i].ToArray(), N, args); signals[i] = this.AddNoise_MW(noise_type, signals[i], noise_params); } Fingerprint fp = this.GenerateFingerprint(signal_type, fingerprint_name, signals, args); return fp; }
/// <summary> /// 生成指纹 /// </summary> /// <param name="signal_type">信号类型</param> /// <param name="fingerprint_name">指纹类型</param> /// <param name="signals">各接收站的信号集合</param> /// <param name="args">args参数集合,与信号类型有关</param> /// <returns>指纹参数集合,与指纹类型有关</returns> public Fingerprint GenerateFingerprint(Signal_Type signal_type, Fingerprint_Name fingerprint_name, MWNumericArray[] signals, double[] args) { switch(fingerprint_name) { case Fingerprint_Name.S: { Fingerprint_S.S[] ss = new Fingerprint_S.S[signals.Length]; for (int i = 0; i < signals.Length; i++) { if (signals[i] == null) ss[i] = new Fingerprint_S.S(); else { MWNumericArray s = (MWNumericArray)sptb.CalcStrength(signals[i]); ss[i] = new Fingerprint_S.S(s.ToScalarDouble()); } } Fingerprint_S fp = new Fingerprint_S(ss); return fp; } case Fingerprint_Name.SA: { Fingerprint_SA.SA[] sas = new Fingerprint_SA.SA[signals.Length]; switch(signal_type) { case Signal_Type.PSEUDO_DOPPLER: { MWNumericArray fl = new MWNumericArray(args[0]); MWNumericArray fc = new MWNumericArray(args[1]); MWNumericArray fs = new MWNumericArray(args[2]); MWNumericArray fswitch = new MWNumericArray(args[3]); MWNumericArray R = new MWNumericArray(args[4]); MWNumericArray NA = new MWNumericArray(args[5]); for (int i = 0; i < signals.Length; i++) { if (signals[i] == null) sas[i] = new Fingerprint_SA.SA(); else { MWNumericArray s = (MWNumericArray)sptb.CalcStrength(signals[i]); MWNumericArray aoa = (MWNumericArray)sptb.CalcPseudoDopplerAOA(signals[i], fl, fc, fs, fswitch, R, NA); sas[i] = new Fingerprint_SA.SA(s.ToScalarDouble(), aoa.ToScalarDouble()); } } Fingerprint_SA fp = new Fingerprint_SA(sas); return fp; } } return null; } } return null; }