diff --git a/Esiur.Analysis.Test/Program.cs b/Esiur.Analysis.Test/Program.cs index a59465e..fa0a47a 100644 --- a/Esiur.Analysis.Test/Program.cs +++ b/Esiur.Analysis.Test/Program.cs @@ -1,5 +1,6 @@ using System.Diagnostics; using Esiur.Analysis.DSP; +using Esiur.Analysis.Signals.Codes; namespace Esiur.Analysis.Test { @@ -18,6 +19,9 @@ namespace Esiur.Analysis.Test var cor = signalA.CrossCorrelation(signalB, true); Debug.WriteLine(cor); + var seq = Generators.GenerateSequence(1, 7); + + // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); diff --git a/Esiur.Analysis/Signals/Codes/Generators.cs b/Esiur.Analysis/Signals/Codes/Generators.cs index 91cd4c7..ff54ede 100644 --- a/Esiur.Analysis/Signals/Codes/Generators.cs +++ b/Esiur.Analysis/Signals/Codes/Generators.cs @@ -1,6 +1,7 @@ using Esiur.Data; using System; using System.Collections.Generic; +using System.Linq; using System.Text; namespace Esiur.Analysis.Signals.Codes @@ -8,6 +9,57 @@ namespace Esiur.Analysis.Signals.Codes public static class Generators { + public static void SetBit(ref this int target, int index, bool value) + { + if (value) + target |= 0x1 << index; + else if ((target & (0x1 << index)) != 0) + target ^= 0x1 << index; + } + + public static double[] GenerateSequence(int initialValue, uint octalPolynomialCoefficients) + { + // convert octal to uint + var bits = Convert.ToUInt32(octalPolynomialCoefficients.ToString(), 8); + var taps = new List(); + + // find maximum exponent + var maxExponent = 0; + for (var i = 31; i >= 0; i--) + { + var test = (uint)0x1 << i; + if ((bits & test) != 0) + { + taps.Add(test); + maxExponent = i; + break; + } + } + + var length = (int)(Math.Pow(2, maxExponent) - 1); + + var rt = new double[length]; + + var state = initialValue; + + for(var i = 0; i < length; i++) + { + //rt[i] = (state & 0x1) == 1 ? 1 : -1; + + var b = 0; + for (var j = 0; j < taps.Count; j++) + b = (b + ((taps[j] & state) > 0 ? 1 : 0)) % 2; + + state >>= 1; + + state.SetBit(maxExponent, b > 0); + + rt[i] = b == 0 ? -1 : 1; + } + + return rt; + } + //public double[][] GenerateMaximumLengthSequence(uint octalPolynomialCoefficients) //{ // // convert octal to uint @@ -38,7 +90,7 @@ namespace Esiur.Analysis.Signals.Codes // while (true) // { - + // } // var rt = new double[length][];