public void Acquire(int input_device, Signal_Type ST, int output_device) { Running = true; Channels_in = NAudio.Wave.WaveIn.GetCapabilities(input_device).Channels; Response = new List <short> [Channels_in]; block = 2 * Channels_in; WI = new NAudio.Wave.WaveInEvent(); WI.WaveFormat = new NAudio.Wave.WaveFormat(SampleFreq, 16, Channels_in); WI.DeviceNumber = input_device; WI.BufferMilliseconds = 100; WI.NumberOfBuffers = 3; WI.RecordingStopped += WI_RecordingStopped; WI.DataAvailable += WI_DataAvailable; WO.DeviceNumber = output_device; for (int c = 0; c < Channels_in; c++) { Response[c] = new List <short>(); } SignalProvider Signal; switch (ST) { case Signal_Type.Pink_Noise: Signal = new Noise_Provider(1, (int)CT_Averages, SampleFreq); break; case Signal_Type.MLS: throw new NotImplementedException(); case Signal_Type.Swept_Sine: Signal = new Sweep_Provider((float)Signal_Length, CT_Averages, 63, 20000, SampleFreq); break; case Signal_Type.Logarithmic_Swept_Sine: throw new NotImplementedException(); default: System.Windows.Forms.MessageBox.Show("Select a Signal..."); return; } TD_Signal = Signal.Signal; WO.NumberOfBuffers = 1; WO.DesiredLatency = 3000 * CT_Averages; WO.Volume = 1.0f; WO.Init(Signal); WI.StartRecording(); WO.Play(); System.Threading.Thread.Sleep((int)(Signal_Time_s * (3 + CT_Averages) * 1000)); WO.Stop(); WI.StopRecording(); System.Threading.Thread.Sleep(100); WI_RecordingStopped(this, null); }
/// <summary> /// 生成信号序列 /// </summary> /// <param name="signal_type">信号类型</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 MWNumericArray GenerateSignal_MW(Signal_Type signal_type, double[] ray_angles, double[] ray_strengths, double[] ray_taus, int N, double[] args) { if (ray_angles.Length != ray_strengths.Length || ray_strengths.Length != ray_taus.Length) throw new Exception("波束角度、强度和延时数组必须具有相同长度!"); if (ray_angles.Length == 0) return null; MWNumericArray len = new MWNumericArray(N); 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]); MWNumericArray sum = (MWNumericArray)sptb.GenerateSignal_PseudoDoppler(new MWNumericArray(ray_strengths[0]), fl, fc, fs, fswitch, R, NA, new MWNumericArray(ray_angles[0]), new MWNumericArray(ray_taus[0]), len); for (int i = 1; i < ray_angles.Length; i++) { MWNumericArray sub = (MWNumericArray)sptb.GenerateSignal_PseudoDoppler(new MWNumericArray(ray_strengths[i]), fl, fc, fs, fswitch, R, NA, new MWNumericArray(ray_angles[i]), new MWNumericArray(ray_taus[i]), len); sum = (MWNumericArray)sptb.Add(sum, sub); } return sum; } } return null; }
private MWNumericArray[][] wrap_func(int num, int ray_num, Transmitter.EMIT_OPTION emit_opt, Signal_Type signal_type, int sample_cnt) { MWNumericArray[][] signals = new MWNumericArray[num][]; while (num-- > 0) { foreach (Transmitter trans in this.viz_rps.Map.Transmitters) { trans.Reset(); trans.EmitRays(ray_num, emit_opt); //各发射机辐射波束 foreach (Receiver rec in this.viz_rps.Map.Receivers) { rec.Reset(); if (this.viz_rps.Map.IsLOS(trans.Location, rec.Location)) //若存在LOS情况 { LineSegment segLOS = new LineSegment(trans.Location, rec.Location); Ray rayLOS = new Ray(trans, new LineSegment[] { segLOS }, segLOS.DirectionRadian, trans.CenterFrequency, trans.EmitPower * trans.Gain, trans.EmitPower * trans.Gain, true); rec.AcceptRay(rayLOS, this.viz_rps.Map); } } foreach (Ray ray in trans.Rays) //更新每条ray, 若被接收,则更新接收它的接收机 { Receiver rec = null; while (!ray.Update(this.viz_rps.Map, out rec)) ; if (rec != null) rec.AcceptRay(ray, this.viz_rps.Map); } } FingerprintGenerator fg = new FingerprintGenerator(); Dictionary<Fingerprint_Name, Fingerprint> result = new Dictionary<Fingerprint_Name, Fingerprint>(); List<double>[] ray_angles = new List<double>[this.viz_rps.Map.ReceiverCount]; List<double>[] ray_strengths = new List<double>[this.viz_rps.Map.ReceiverCount]; List<double>[] ray_taus = new List<double>[this.viz_rps.Map.ReceiverCount]; int kk = 0; foreach (Receiver rec in this.viz_rps.Map.Receivers) { ray_angles[kk] = new List<double>(); ray_strengths[kk] = new List<double>(); ray_taus[kk] = new List<double>(); foreach (Ray ray in rec.Rays) { ray_angles[kk].Add(ray.CurrentDirection); ray_strengths[kk].Add(ray.FadedPower(this.viz_rps.Map.MeterPixelRatio)); ray_taus[kk].Add(ray.GetLifeSpan(this.viz_rps.Map.MeterPixelRatio)); } kk++; } double[] args = null; switch (signal_type) { case Signal_Type.PSEUDO_DOPPLER: //if (this.receivers.First().Value.Antenna.AntType != AntennaType.PSEUDO_DOPPLER) // return null; Antenna_PseudoDoppler ant = this.viz_rps.Map.receivers.First().Value.Antenna as Antenna_PseudoDoppler; args = fg.PackArgs_PseudoDoppler(this.viz_rps.Map.receivers.First().Value.FrequencyLow, this.viz_rps.Map.receivers.First().Value.CenterFrequency, this.viz_rps.Map.receivers.First().Value.SampleFrequency, ant.SwitchFrequency, ant.Radius, ant.AntennaNumber); break; } signals[num - 1] = new MWNumericArray[ray_angles.GetLength(0)]; for (int i = 0; i < signals.Length; i++) { signals[num - 1][i] = new FingerprintGenerator().GenerateSignal_MW(signal_type, ray_angles[i].ToArray(), ray_strengths[i].ToArray(), ray_taus[i].ToArray(), sample_cnt, args); } } return signals; }
public void reset(double frequency, Signal_Type s) { f = frequency; S = s; Generate_Signal(); }
public Signal_Driver_Compact(Signal_Type S_in, double freq, double w_in, Rhino.Geometry.Point3d[] Loc_in) { S = S_in; f = freq; Loc = Loc_in; w = w_in; }
/// <summary> /// 运行单次仿真 /// </summary> public Dictionary<Fingerprint_Name, Fingerprint> RunSingleSimulation(int num_rays, Transmitter.EMIT_OPTION emit_option, Signal_Type signal_type, Noise_Type noise_type, double[] noise_params, int N) { foreach(Transmitter trans in this.Transmitters) { trans.Reset(); trans.EmitRays(num_rays, emit_option); //各发射机辐射波束 foreach(Receiver rec in this.Receivers) { rec.Reset(); if(this.IsLOS(trans.Location, rec.Location)) //若存在LOS情况 { LineSegment segLOS = new LineSegment(trans.Location, rec.Location); Ray rayLOS = new Ray(trans, new LineSegment[] { segLOS }, segLOS.DirectionRadian, trans.CenterFrequency, trans.EmitPower * trans.Gain, trans.EmitPower * trans.Gain, true); rec.AcceptRay(rayLOS, this); } } foreach(Ray ray in trans.Rays) //更新每条ray, 若被接收,则更新接收它的接收机 { Receiver rec = null; while (!ray.Update(this, out rec)) ; if (rec != null) rec.AcceptRay(ray, this); } } FingerprintGenerator fg = new FingerprintGenerator(); Dictionary<Fingerprint_Name, Fingerprint> result = new Dictionary<Fingerprint_Name,Fingerprint>(); List<double>[] ray_angles = new List<double>[this.receivers.Count]; List<double>[] ray_strengths = new List<double>[this.receivers.Count]; List<double>[] ray_taus = new List<double>[this.receivers.Count]; int i = 0; foreach(Receiver rec in this.Receivers) { ray_angles[i] = new List<double>(); ray_strengths[i] = new List<double>(); ray_taus[i] = new List<double>(); foreach(Ray ray in rec.Rays) { ray_angles[i].Add(ray.CurrentDirection); ray_strengths[i].Add(ray.FadedPower(this.MeterPixelRatio)); ray_taus[i].Add(ray.GetLifeSpan(this.MeterPixelRatio)); } i++; } double[] args = null; switch (signal_type) { case Signal_Type.PSEUDO_DOPPLER: if (this.receivers.First().Value.Antenna.AntType != AntennaType.PSEUDO_DOPPLER) return null; Antenna_PseudoDoppler ant = this.receivers.First().Value.Antenna as Antenna_PseudoDoppler; args = fg.PackArgs_PseudoDoppler(this.receivers.First().Value.FrequencyLow, this.receivers.First().Value.CenterFrequency, this.receivers.First().Value.SampleFrequency, ant.SwitchFrequency, ant.Radius, ant.AntennaNumber); break; } for (int j = 0; j < Enum.GetNames(new Fingerprint_Name().GetType()).Length; j++ ) result[(Fingerprint_Name)j] = fg.SingleFingerprintSim(signal_type, noise_type, noise_params, (Fingerprint_Name)j, ray_angles, ray_strengths, ray_taus, N, args); return result; }
/// <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; }
/// <summary> /// 生成信号序列 /// </summary> /// <param name="signal_type">信号类型</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 double[][] GenerateSignal(Signal_Type signal_type, double[] ray_angles, double[] ray_strengths, double[] ray_taus, int N, double[] args) { MWNumericArray arr = GenerateSignal_MW(signal_type, ray_angles, ray_strengths, ray_taus, N, args); if (arr == null) return null; double[][] result = new double[2][]; result[0] = (double[])arr.ToVector(MWArrayComponent.Real); result[1] = (double[])arr.ToVector(MWArrayComponent.Imaginary); return result; }