public void AnalyzeSignal_KnownSignal_ReturnsExpectedValues()
        {
            var audioStream = new MemoryStream();

            var audioGenerator    = new AudioGenerator(audioStream);
            var fskAudioGenerator = new FskAudioGenerator(audioGenerator);

            fskAudioGenerator.GenerateAudio(_binaryFskAnalyzerSettings.BaudRate,
                                            _binaryFskAnalyzerSettings.SpaceFrequency, _binaryFskAnalyzerSettings.MarkFrequency,
                                            _bitManipulator.StringToBits(Resources.LoremIpsumTestString));

            var audioAnalyzer     = new AudioAnalyzer(audioStream, audioGenerator);
            var binaryFskAnalyzer = (IBinaryFskAnalyzer) new BinaryFskAnalyzer(audioAnalyzer, new ZeroCrossingsFrequencyDetector(), _binaryFskAnalyzerSettings);
            var results           = binaryFskAnalyzer.AnalyzeSignal();

            var result = binaryFskAnalyzer.AnalyzeSignal();
            var bits   = new List <bool>();

            foreach (var frame in result.AnalysisFrames)
            {
                if (frame.Bit.HasValue == true)
                {
                    bits.Add(frame.Bit.Value);
                }
            }

            var ascii = BitManipulator.BitsToString(bits);

            Assert.AreEqual(Resources.LoremIpsumTestString, ascii);
        }
Ejemplo n.º 2
0
        public void When_inserting_number_in_host(
            int host,
            int insert,
            int i,
            int j,
            int expectedAnswer)
        {
            var bitMan = new BitManipulator();
            var result = bitMan.InsertBinaryNumber(host, insert, i, j);

            Assert.Equal(expectedAnswer, result);
        }
        public void TestInitialize()
        {
            _audioAnalyzer     = new Mock <IAudioAnalyzer>();
            _frequencyDetector = new Mock <IFrequencyDetector>();
            _bitManipulator    = new BitManipulator();

            _binaryFskAnalyzerSettings = new BinaryFskAnalyzerSettings
            {
                BaudRate       = 300.0,
                SpaceFrequency = 1000,
                MarkFrequency  = 1500
            };
        }
Ejemplo n.º 4
0
        public TestRunner(BinaryFskAnalyzerSettings binaryFskAnalyzerSettings = null,
                          IFrequencyDetector frequencyDetector = null)
        {
            _audioStream               = new MemoryStream();
            _audioGenerator            = new AudioGenerator(_audioStream);
            _fskAudioGenerator         = new FskAudioGenerator(_audioGenerator);
            _binaryFskAnalyzerSettings = binaryFskAnalyzerSettings != null ? binaryFskAnalyzerSettings : new Bell103BinaryFskAnalyzerSettings();
            var bitManipulator = new BitManipulator();

            _fskAudioGenerator.GenerateAudio(_binaryFskAnalyzerSettings.BaudRate, _binaryFskAnalyzerSettings.SpaceFrequency,
                                             _binaryFskAnalyzerSettings.MarkFrequency, bitManipulator.StringToBits("Test string"));
            _audioAnalyzer     = new AudioAnalyzer(_audioStream, _audioGenerator);
            _frequencyDetector = frequencyDetector != null ? frequencyDetector : new ZeroCrossingsFrequencyDetector();
            FskAnalyzer        = new BinaryFskAnalyzer(_audioAnalyzer, _frequencyDetector, _binaryFskAnalyzerSettings);
        }
        public void Render(List <List <bool> > bytes)
        {
            foreach (var byteBlock in bytes)
            {
                if (byteBlock.Count < 8)
                {
                    break;
                }

                // var bits = ChangeBit(byteBlock, 8, 0);
                // bits.Reverse();
                Console.Write(BitManipulator.ByteToChar(byteBlock));
            }

            Console.WriteLine();
        }
Ejemplo n.º 6
0
        public static void Main(string[] args)
        {
            var bitManipulator = new BitManipulator();
            var myBits         = bitManipulator.StringToBits(Resources.BigLebowskiQuote);

            Console.WriteLine($"Length of string in bits: {myBits.Count}");

            var audioStream = new MemoryStream();

            var binaryFskAnalyzerSettings = new Bell103BinaryFskAnalyzerSettings();

            var audioGenerator    = new AudioGenerator(audioStream);
            var fskAudioGenerator = new FskAudioGenerator(audioGenerator);

            fskAudioGenerator.GenerateAudio(binaryFskAnalyzerSettings.BaudRate,
                                            binaryFskAnalyzerSettings.SpaceFrequency, binaryFskAnalyzerSettings.MarkFrequency, myBits);

            var audioLengthInMicroseconds = (int)(myBits.Count * Math.Pow(10, 6) / binaryFskAnalyzerSettings.BaudRate);

            Console.WriteLine($"Length of audio in seconds: {audioLengthInMicroseconds / Math.Pow(10, 6):N1}");
            Console.WriteLine();

            Console.WriteLine(Resources.BigLebowskiQuote);
            Console.WriteLine();

            AudioAnalyzer.Play(audioStream, audioLengthInMicroseconds / 1000);

            audioGenerator    = new AudioGenerator(audioStream);
            fskAudioGenerator = new FskAudioGenerator(audioGenerator);
            fskAudioGenerator.GenerateAudio(binaryFskAnalyzerSettings.BaudRate,
                                            binaryFskAnalyzerSettings.SpaceFrequency, binaryFskAnalyzerSettings.MarkFrequency, myBits);

            var binaryFskAnalyzer = new BinaryFskAnalyzer(new AudioAnalyzer(audioStream, audioGenerator), new ZeroCrossingsFrequencyDetector(), binaryFskAnalyzerSettings);

            Console.WriteLine($"Window position start {binaryFskAnalyzerSettings.WindowPositionStartMicroseconds:N3} us, window position end {binaryFskAnalyzerSettings.WindowPositionEndMicroseconds:N3} us, window position increment {binaryFskAnalyzerSettings.WindowPositionIncrementMicroseconds:N3} us");
            Console.WriteLine($"Window length start {binaryFskAnalyzerSettings.WindowLengthStartMicroseconds:N3} us, window length end {binaryFskAnalyzerSettings.WindowLengthEndMicroseconds:N3} us, window length increment {binaryFskAnalyzerSettings.WindowLengthIncrementMicroseconds:N3} us");
            Console.WriteLine();

            var result = binaryFskAnalyzer.AnalyzeSignal();
            var bits   = new List <bool>();

            foreach (var frame in result.AnalysisFrames)
            {
                if (frame.Bit.HasValue == true)
                {
                    bits.Add(frame.Bit.Value);
                }
            }

            Console.WriteLine("Rendering bytes");
            Console.WriteLine();
            var renderer = (IRenderer) new RowRenderer();

            renderer.Render(BitManipulator.BitsToBytes(bits));
            Console.WriteLine();
            Console.WriteLine();

            Console.WriteLine("Rendering ASCII");
            Console.WriteLine();
            renderer = new AsciiRenderer();
            renderer.Render(BitManipulator.BitsToBytes(bits));
            Console.WriteLine();

            Console.WriteLine("Done");
            Console.ReadLine();
        }
Ejemplo n.º 7
0
        private static void RandomExercises()
        {
            int[] numValues = { 8, 1, 2, 2, 3 };
            ArrayExercises.SmallerNumbersThanCurrent(numValues);

            int[] FirstDuplicate = { 2, 1, 3, 5, 3, 2 };
            Console.WriteLine(string.Format("{0} is the first duplicate.", ArrayExercises.FindFirstDuplicate(FirstDuplicate)));

            BinaryTree <int> MyTree = new BinaryTree <int>();

            MyTree.Insert(6);
            MyTree.Insert(7);
            MyTree.Insert(8);
            MyTree.Insert(2);
            MyTree.Insert(7);
            MyTree.Insert(1);
            MyTree.Insert(3);
            MyTree.Insert(9);
            MyTree.Insert(1);
            MyTree.Insert(4);
            MyTree.Insert(5);

            MyTree.SumEvenGrandparent(MyTree.Find(6));

            long           binary_val = 100100111000000;
            BitManipulator x          = new BitManipulator();

            Console.WriteLine(x.GetDecimalValue(binary_val));

            int[] luis = ManyExercises.BeautifulArray(4);

            int[] arri = { 1, 1, 2, 3, 3, 4, 4, 8, 8 };

            int UniqueVal = ManyExercises.SingleNonDuplicate(arri);

            if (UniqueVal > -1)
            {
                Console.WriteLine(string.Format("Unique value is {0}.", UniqueVal));
            }
            else
            {
                Console.WriteLine("No unique value is found in given array.");
            }

            Console.WriteLine("\n");
            string a = "kqep";
            string b = "pekeq";

            CustomSortString.SortString(a, b);

            int[] Pancakes = { 3, 2, 4, 1 };
            ArrayExercises.PancakeSort(Pancakes);

            // [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]
            int[][] matrix = new int[5][] { new int[] { 11, 25, 66, 1, 69, 7 }, new int[] { 23, 55, 17, 45, 15, 52 }, new int[] { 75, 31, 36, 44, 58, 8 }, new int[] { 22, 27, 33, 25, 68, 4 }, new int[] { 84, 28, 14, 11, 5, 50 } };

            Console.WriteLine("Original Matrix:");
            PrintMatrix(matrix);
            JaggedArray.DiagonalSort(matrix);
            Console.WriteLine("\nDiagonally Sorted Matrix:");
            PrintMatrix(matrix);
            Console.ReadLine();

            int[] arr = { 8, 3, 2, 7, 9, 1, 4, 1 };

            Console.WriteLine("\n");
            Console.WriteLine("Before SelectionSort:");
            foreach (int i in arr)
            {
                Console.Write(i + ",");
            }
            Console.ReadLine();
            SelectionSortAlgorithm.SelectionSort(arr);

            Console.WriteLine("\n");
            Console.WriteLine("After SelectionSort:");
            foreach (int i in arr)
            {
                Console.Write(i + ",");
            }
            Console.WriteLine("\n");
            Console.ReadLine();

            Console.Write("Binary Search. Enter number to search for: ");
            int.TryParse(Console.ReadLine(), out int key);
            BinarySearchAlgorithm.BinarySearch(arr, key);
            arr = Sorting();

            int[] G = { 1, 2, 3, 3, 4, 5 };
            Console.WriteLine(OneDimensionalArray.FindDuplicate(G));
            Console.ReadLine();

            int[] arrX1 = { 3, 4, -7, 1, 3, 3, 1, -4 };
            OneDimensionalArray.FindSubarrayForGivenSum(arrX1, 7);

            var y1 = new int[] { 3, 1, 7, 5, 4, 9, 2 };

            InsertionSortAlgorithm.InsertionSortBitWise(y1);
            PrintResults(y1);

            //ArrayExercises.StoreElementsInArray();
            var x1 = new int[] { 1, 2, 3 };
            var x2 = new int[] { 1, 2, 3 };

            ArrayExercises.MergeToArraysSameSizeSorted(x1, x2);


            LeetCode lc         = new LeetCode();
            var      groupSizes = new int[] { 3, 3, 3, 3, 3, 1, 3 };
            var      List111    = OneDimensionalArray.GroupThePeople(groupSizes);

            int[][] indices = new int[3][] { new int[] { 0, 0, 0 }, new int[] { 0, 0, 0 }, new int[] { 0, 0, 0 } };
            lc.OddCells(2, 3, indices);
        }
Ejemplo n.º 8
0
        public AnalysisResult AnalyzeSignal(string testString = null)
        {
            var baudRateIncrementMicroseconds = 1.0 / _settings.BaudRate * Math.Pow(10, 6);
            var windowPositionEndMicroseconds = _audioAnalyzer.FileLengthInMicroseconds;

            var frequencyDifferences    = new List <int>();
            int numberOfZeroFrequencies = 0;

            var analysisFrames = new List <AnalysisFrame>();
            var i = 0;

            for (var currentWindowPositionMicroseconds = 0.0; currentWindowPositionMicroseconds < windowPositionEndMicroseconds; currentWindowPositionMicroseconds += baudRateIncrementMicroseconds)
            {
                // Debug.WriteLine($"Current pos: {currentWindowPositionMicroseconds:N1}, increment: {baudRateIncrementMicroseconds:N1}, end: {windowPositionEndMicroseconds :N1}");

                i++;

                var samplingResult = _audioAnalyzer.GetSamples(currentWindowPositionMicroseconds, currentWindowPositionMicroseconds + baudRateIncrementMicroseconds);

                // TODO: How to set this threshold?
                var targetNumberOfSamples = _audioAnalyzer.SampleRate / Math.Pow(10, 6) * baudRateIncrementMicroseconds;
                var sampleThreshold       = 0.9;
                if (samplingResult.Samples.Count() < (targetNumberOfSamples * sampleThreshold))
                {
                    continue;
                }

                var frequency           = _frequencyDetector.DetectFrequency(samplingResult.Samples);
                var frequencyDifference = FrequencyDifference(frequency, _settings.SpaceFrequency, _settings.MarkFrequency);
                var markOrSpace         = MarkOrSpace(frequency, _settings.SpaceFrequency, _settings.MarkFrequency);

                if (frequency <= 0)
                {
                    numberOfZeroFrequencies++;
                }

                if (frequencyDifference > _settings.FrequencyDeviationTolerance)
                {
                    Debug.WriteLine($"WARN: @ {currentWindowPositionMicroseconds / Math.Pow(10, 6):N3} seconds (Baud rate {_settings.BaudRate}) [{i}] outside of tolerance (frequency {frequency} Hz, difference {frequencyDifference} Hz, tolerance {_settings.FrequencyDeviationTolerance} Hz)");

                    frequencyDifferences.Add(frequencyDifference);
                }

                // Debug.WriteLine($"[{currentWindowStart:N3} us to {currentWindowStart + currentWindowLength:N3} us ({(currentWindowStart + currentWindowLength) - currentWindowStart:N3} us)] {frequency:N0} Hz average (+/- {frequencyDifference:N0} Hz) [Want {_settings.MarkFrequency:N0} Hz / {_settings.SpaceFrequency:N0} Hz] -> bit {bits.Count}: {markOrSpace}");

                analysisFrames.Add(
                    new AnalysisFrame
                {
                    Bit           = (frequency > 0 && frequencyDifference <= _settings.FrequencyDeviationTolerance) ? (markOrSpace == 0 ? false : true) : (bool?)null,
                    Frequency     = frequency,
                    DecodeFailure = frequency > _settings.FrequencyDeviationTolerance ? true : false,
                    DifferenceFromExpectedFrequencies = frequencyDifference,
                    TimeOffsetMicroseconds            = currentWindowPositionMicroseconds
                }
                    );
            }

            var analysisResult = new AnalysisResult
            {
                AnalysisFrames = analysisFrames,
                NumberOfFrequencyDifferences = frequencyDifferences.Count(),
                NumberOfZeroFrequencies      = numberOfZeroFrequencies,
                MinimumFrequencyDifference   = frequencyDifferences.Count() > 0 ? frequencyDifferences.Min() : 0,
                MaximumFrequencyDifference   = frequencyDifferences.Count() > 0 ? frequencyDifferences.Max() : 0,
                AverageFrequencyDifference   = frequencyDifferences.Count() > 0 ? frequencyDifferences.Average() : 0
            };

            bool?  match           = null;
            string resultingString = null;

            if (testString != null)
            {
                var bits = new List <bool>();
                analysisFrames.Where(x => x.Bit.HasValue == true).Select(x => x).ForEach(x => bits.Add(x.Bit.Value));

                resultingString = BitManipulator.BitsToString(bits);
                match           = false;
                if (resultingString == testString)
                {
                    match = true;
                }
            }

            // Debug.WriteLine($"Boost freq.: {_audioAnalyzer.BoostFrequencyAmount} Hz, avg. freq. diff.: {averageFrequencyDifference}, # missed freqs.: {missedFrequencies}");

            AnalysisComplete((int)_settings.BaudRate, _audioAnalyzer.BoostFrequencyAmount, analysisResult, resultingString, match);

            return(analysisResult);
        }
Ejemplo n.º 9
0
        public void Run(TestRunnerArguments arguments)
        {
            var fileTimestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");

            var bitManipulator = new BitManipulator();
            var bits           = bitManipulator.StringToBits(arguments.TestString);

            for (var baudRate = arguments.BaudStart; baudRate <= arguments.BaudEnd; baudRate += arguments.BaudIncrement)
            {
                for (var loopBoostFrequency = arguments.BoostStart; loopBoostFrequency <= arguments.BoostEnd;
                     loopBoostFrequency += arguments.BoostIncrement)
                {
                    _binaryFskAnalyzerSettings = new Bell103BinaryFskAnalyzerSettings
                    {
                        SpaceFrequency = arguments.SpaceFrequency,
                        MarkFrequency  = arguments.MarkFrequency,
                        BaudRate       = baudRate,
                        FrequencyDeviationTolerance = arguments.Tolerance
                    };

                    _audioStream = new MemoryStream();

                    _audioGenerator    = new AudioGenerator(_audioStream);
                    _fskAudioGenerator = new FskAudioGenerator(_audioGenerator);
                    _fskAudioGenerator.GenerateAudio(_binaryFskAnalyzerSettings.BaudRate,
                                                     _binaryFskAnalyzerSettings.SpaceFrequency, _binaryFskAnalyzerSettings.MarkFrequency, bits);

                    var audioLengthInMicroseconds = (int)(bits.Count * Math.Pow(10, 6) / _binaryFskAnalyzerSettings.BaudRate);

                    _audioStream       = new MemoryStream();
                    _audioGenerator    = new AudioGenerator(_audioStream);
                    _fskAudioGenerator = new FskAudioGenerator(_audioGenerator);
                    var samples = _fskAudioGenerator.GenerateAudio(_binaryFskAnalyzerSettings.BaudRate,
                                                                   _binaryFskAnalyzerSettings.SpaceFrequency, _binaryFskAnalyzerSettings.MarkFrequency, bits);

                    SignalGenerationComplete(bits.Count, audioLengthInMicroseconds, samples, _audioAnalyzer.SampleRate);

                    if (arguments.WriteFaveFiles == true)
                    {
                        using (var file = File.Create($"{fileTimestamp}_{baudRate}_baud.wav"))
                        {
                            var previousPosition = _audioStream.Position;
                            _audioStream.Position = 0;
                            _audioStream.CopyTo(file);
                            _audioStream.Position = previousPosition;
                        }
                    }

                    _binaryFskAnalyzerSettings = new Bell103BinaryFskAnalyzerSettings
                    {
                        SpaceFrequency = (int)(arguments.SpaceFrequency + loopBoostFrequency),
                        MarkFrequency  = (int)(arguments.MarkFrequency + loopBoostFrequency),
                        BaudRate       = baudRate,
                        FrequencyDeviationTolerance = arguments.Tolerance
                    };

                    _audioAnalyzer = new AudioAnalyzer(_audioStream, _audioGenerator, (int)loopBoostFrequency);

                    FskAnalyzer.Initialize(_audioAnalyzer, new ZeroCrossingsFrequencyDetector(), _binaryFskAnalyzerSettings);
                    FskAnalyzer.AnalyzeSignal(arguments.TestString);

                    if (arguments.PlayAudio == true)
                    {
                        AudioAnalyzer.Play(_audioStream, (int)Math.Ceiling((audioLengthInMicroseconds / Math.Pow(10, 3))));
                    }
                }
            }
        }