Ejemplo n.º 1
0
        public void Calculate()
        {
            T a0  = 1 - _aq;
            T uc  = 0;
            T unl = 0;

            _gen.Reset();

            for (int i = 0; i < (N / _minDisc); i++)
            {
                var x = _gen.NextValue() * 2 - 1;
                for (int j = 0; j < _minDisc; j++)
                {
                    var arrI = i * _minDisc + j;
                    if (arrI < OnePer)
                    {
                        Mls[arrI] = x;
                    }
                    ResponseE[arrI]  = uc;
                    ResponseNL[arrI] = unl;

                    uc += (x - uc) * _exp;
                    unl = a0 * uc + _aq * SignPow(uc, _q);
                }
            }

            for (int i = 0; i < (N + OnePer); i++)
            {
                T ce  = 0;
                T cnl = 0;
                for (int j = 0; j < OnePer; j++)
                {
                    int k = i + j - OnePer;
                    if (k >= 0 && k < N)
                    {
                        ce  += Mls[j] * ResponseE[k];
                        cnl += Mls[j] * ResponseNL[k];
                    }
                }
                CorrelationE[i]  = ce;
                CorrelationNL[i] = cnl;
            }
        }
Ejemplo n.º 2
0
        //public float[] Correct(float[] data)
        //{
        //    var res = new float[ArrSz];
        //    for (int i = 1; i < N; i++)
        //    {
        //        res[i] = data[i] - data[N - i];
        //    }
        //    res[0] = data[0];
        //    return res;
        //}

        //public int GetPeak()
        //{
        //    int maxI = Correlation.Length/2;
        //    for (int i = 2; i < Correlation.Length; i++)
        //    {
        //        if (Correlation[i].CompareTo(Correlation[maxI]) > 0) maxI = i;
        //    }
        //    return maxI;
        //}

        //public void Normalize()
        //{
        //    int n = Correlation.Length;
        //    Correlation = Correlation.Select(x => (float)Math.Round(x + 1)).ToArray();
        //}

        //public float[] DeltaCalculate()
        //{
        //    var mlsInt = new int[ArrSz];
        //    var responseNlInt = new int[ArrSz];
        //    int amp = (int)Math.Round(Math.Pow(10, 180 / 20.0));

        //    double uc = 0;
        //    _gen.Reset();

        //    for (int i = 0; i < N; i++)
        //    {
        //        var x = _gen.NextValue() * 2 - 1;
        //        var unl = (1 - aq) * uc + aq * uc * Math.Abs(Math.Pow(uc, q - 1));
        //        mlsInt[i] = i < _gen.Period ? x : 0;
        //        responseNlInt[i] = (int)Math.Round(unl * amp);
        //        uc += (x - uc) * exp;
        //    }

        //    real.SetData(mlsInt.Select((x)=>(float)x).ToArray());
        //    forward.Execute();
        //    var fftMls = complex.GetData_Complex();

        //    real.SetData(responseNlInt.Select((x) => (float)x).ToArray());
        //    forward.Execute();

        //    complex.SetData(complex.GetData_Complex().Zip(fftMls, (x, y) => Complex.Conjugate(y) * x / N).ToArray());
        //    backward.Execute();
        //    var fftCorr = real.GetData_float();

        //    var delta = new float[ArrSz];
        //    for (int i = 0; i < N; i++)
        //    {
        //        long res = 0;
        //        for (int j = 0; j < N; j++)
        //        {
        //            int k = i + j - N;
        //            if (k < 0) k += N;
        //            res += mlsInt[j] *1L* responseNlInt[k];
        //        }
        //        delta[i] = (long)Math.Round(fftCorr[i]) - res;
        //    }
        //    return delta;
        //}



        public void Calculate()
        {
            double uc  = 0;
            double unl = 0;

            _gen.Reset();

            if (_isFastMode)
            {
                for (int i = 0; i < N; i++)
                {
                    var x = _gen.NextValue() * 2 - 1;
                    Mls[i]        = x;
                    ResponseNL[i] = (T)unl;
                    uc           += (x - uc) * _exp;
                    unl           = uc + (Math.Abs(Math.Pow(uc, _q - 1)) - 1) * _aq * uc;
                }
            }
            else
            {
                for (int i = 0; i < N / _minDisc; i++)
                {
                    var x = _gen.NextValue() * 2 - 1;
                    for (int j = 0; j < _minDisc; j++)
                    {
                        var arrI = i * _minDisc + j;
                        if (arrI < OnePer)
                        {
                            Mls[arrI] = x;
                        }
                        ResponseE[arrI]  = (T)uc;
                        ResponseNL[arrI] = (T)unl;
                        uc += (x - uc) * _exp;
                        unl = uc + (Math.Abs(Math.Pow(uc, _q - 1)) - 1) * _aq * uc;
                    }
                }
            }


            real.SetData(Mls);
            forward.Execute();
            var fftMls = complex.GetData_Complex();

            if (!_isFastMode)
            {
                real.SetData(ResponseE);
                forward.Execute();
                complex.SetData(complex.GetData_Complex()
                                .Zip(fftMls, (x, y) => Complex.Conjugate(y) * x / N)
                                .ToArray());
                backward.Execute();
                CorrelationE = real.GetData_double();
            }
            real.SetData(ResponseNL);
            forward.Execute();
            complex.SetData(complex.GetData_Complex().Zip(fftMls, (x, y) => Complex.Conjugate(y) * x / N).ToArray());
            backward.Execute();
            if (_isFastMode)
            {
                ResponseNL = real.GetData_double();
            }
            else
            {
                CorrelationNL = real.GetData_double();
            }
        }