Exemplo n.º 1
0
Arquivo: Map.cs Projeto: Yinzhe-Qi/RPS
        /// <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;
        }