예제 #1
0
        public void Input(object sender, SNetTdEventArg e)
        {
            if (!this.IsEnalbed)
            {
                return;
            }
            var myea = e as SNetTdSignalSecSetF8EventArg;

            if (myea == null)
            {
                throw new SNetException("尚未無法處理此類資料: " + e.GetType().FullName);
            }



            if (!myea.PrevTime.HasValue)
            {
                return;
            }
            if (myea.Time == myea.PrevTime.Value)
            {
                return;
            }
            var t = myea.PrevTime.Value;

            this.Purge();//先Purge, 避免Exception造成沒有Purge


            //取得時間變更前的時間資料
            IList <double> signalData = myea.TSignalSource.GetOrCreate(t);

            signalData = CtkNumUtil.InterpolationForce(signalData, this.SampleRate);

            var ctkNumContext = CtkNumContext.GetOrCreate();
            var comp          = ctkNumContext.FftForward(signalData);

            var fftData = new double[comp.Length];

            Parallel.For(0, comp.Length, (idx) =>
            {
                fftData[idx] = comp[idx].Magnitude;
            });
            this.TSignalSet.Set(t, fftData.ToList());



            var ea = new SNetTdSignalSecSetF8EventArg();

            ea.Sender        = this;
            ea.PrevTime      = this.PrevTime;
            ea.Time          = t;
            ea.TSignalSource = this.TSignalSet;
            ea.TSignalNew    = new SNetTSignalSecSetF8(t, fftData);
            this.OnDataChange(ea);

            myea.InvokeResult = this.disposed ? SNetTdEnumInvokeResult.IsDisposed : SNetTdEnumInvokeResult.None;
        }
예제 #2
0
        public void Interpolation(int dataSize)
        {
            if (dataSize == this.signals.Count)
            {
                return;
            }
            var list = CtkNumUtil.Interpolation(this.signals.ToArray(), dataSize);

            this.signals.Clear();
            this.signals.AddRange(list);
        }
예제 #3
0
 public void Interpolation(int dataSize)
 {
     foreach (var kv in this.Signals)
     {
         var ss = kv.Value;
         if (dataSize == ss.Count)
         {
             continue;
         }
         var list = CtkNumUtil.InterpolationCanOneOrZero(ss, dataSize);
         kv.Value.Clear();
         kv.Value.AddRange(list);
     }
 }
예제 #4
0
        public void Input(object sender, SNetTdSignalEventArg e)
        {
            if (!this.IsEnalbed)
            {
                return;
            }
            var tsSetSecondEa = e as SNetTdSignalSecSetF8EventArg;

            if (tsSetSecondEa == null)
            {
                throw new SNetException("尚未無法處理此類資料: " + e.GetType().FullName);
            }


            if (!tsSetSecondEa.PrevTime.HasValue)
            {
                return;
            }
            if (tsSetSecondEa.Time == tsSetSecondEa.PrevTime.Value)
            {
                return;
            }
            var t = tsSetSecondEa.PrevTime.Value;

            //取得時間變更前的時間資料
            IList <double> signalData = tsSetSecondEa.TSignalSource.GetOrCreate(t);


            if (this.FilterArgs.Mode != CtkEnumPassFilterMode.None)
            {
                this.PassFilter.SetFilter(this.FilterArgs);
                signalData = CtkNumUtil.InterpolationCanOneOrZero(signalData, (int)this.FilterArgs.SampleRate);
                signalData = this.PassFilter.ProcessSamples(signalData);
            }

            this.ProcAndPushData(this.TSignal, new SNetTSignalSecF8(t, signalData));
            e.InvokeResult = this.disposed ? SNetTdEnumInvokeResult.IsDisposed : SNetTdEnumInvokeResult.None;
        }