Exemple #1
0
                    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;
        }
Exemple #3
0
 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;
 }
Exemple #6
0
        /// <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;
 }