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; } }
//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(); } }