/// <summary> /// Метод моделирования генератора по двухосцилляторной схеме /// </summary> /// <param name="length">Длина выходной последовательности</param> /// <returns>Массив битов, выданный генератором</returns> public BitArray IntelOscillate(int length) { //double workTime = length * time * 2; Gauss gen = new Gauss(time, sigma); int n = length; double[] ar = gen.GenArray(n); double[] takts = new double[n]; takts[0] = ar[0]; for (int i = 1; i < n; ++i) { takts[i] = takts[i - 1] + ar[i]; } double now; int count = length; bool[] bits = new bool[count]; int pos; for (int j = 0; j < count; ++j) { now = takts[j]; pos = (int)(now / freq) + 1; if (now <= freq * pos - freq / 2) bits[j] = false; else bits[j] = true; } BitArray osc = new BitArray(bits); return osc; }
/// <summary> /// Метод моделирования процесса осциллирования /// </summary> /// <param name="length">Длина выходной последовательности</param> /// <returns>Массив битов, выданный осциллятором</returns> public BitArray Oscilate(int length) { double workTime = length * freq; Gauss gen = new Gauss(time, sigma); int n = (int)(workTime / time) * 2; //берётся с запасом, в два раза больше if (n == 0) throw new Exception("Невозможно смоделировать последовательность с заданными параметрами"); double[] ar = gen.GenArray(n); double[] takts = new double[n + 1]; takts[0] = 0; for (int i = 1; i < takts.Length; ++i) { takts[i] = takts[i - 1] + ar[i - 1]; if (takts[i] > workTime) { Array.Resize(ref takts, i + 1); break; } } double now = freq; //частота считываний int count = length; bool[] bits = new bool[count]; int pos, where = 1; for (int j = 0; j < count; ++j) { pos = FindRead(now, takts, ref where); if (now <= takts[pos] - (takts[pos] - takts[pos - 1]) / 2) bits[j] = false; else bits[j] = true; now += freq; } BitArray osc = new BitArray(bits); return osc; }