/// <summary>
        /// Based on article: http://mziccard.me/2015/05/28/beats-detection-algorithms-1/
        /// </summary>
        /// <param name="values"></param>
        private eRecognitionStatus Recognize(double[] values)   // ORG: PlotSignal()
        {
            eRecognitionStatus recognitionStatus = eRecognitionStatus.UnRecognized;
            double             energySum         = CalculateEnergy(values);

            // We let the blocks list number grow to collect better statistical information.
            if (mEnergyForBlocksList.Count > 900)
            {
                double avgEnergy      = mEnergyForBlocksList.Sum() / mEnergyForBlocksList.Count;
                double varianceEnergy = CalculateVariance(avgEnergy);
                //double factorC = -0.0025714 * varianceEnergy + 1.5142857; // this is the factorC from the original artical (not the same one as in the article above)
                double factorC = -0.0000015 * varianceEnergy + 1.5142857;     // this is the factorC we were using with the earlier records

                // In that case, pop is recognized.
                if (energySum > factorC * avgEnergy)
                {
                    if (mSampleCount % 5 == 0)
                    {
                        mRecordInfoDescriptor.AddRecognitionTime(mStopwatch.ElapsedMilliseconds / 1000.0);
                        recognitionStatus = eRecognitionStatus.Recognized;
                    }
                }

                mSampleCount++;
            }

            //new improvement:
            // Adds use only the first 2000 blocks, in order to reduce the influence of the many pops at the peak,
            // because when getting around 3000-3500 blocks, a small pop is to close to the avarage.
            if (mEnergyForBlocksList.Count < 2000)
            {
                mEnergyForBlocksList.Add(energySum);
            }

            /// Every <see cref="mIntervalsInSeconds"/> seconds sending test object to the KNN tester.
            if (mStopwatch.IsRunning && (mStopwatch.ElapsedMilliseconds / 1000.0) > 4 * mIntervalsInSeconds)
            {
                mIntervalsInSeconds++;
                mRecordInfoDescriptor.UpdateDurationAndLastSection(mStopwatch.ElapsedMilliseconds / 1000.0);

                RecordNeighbor testObject = mKnnTester.GenerateNeighborFromRecordInfoDescriptor(mRecordInfoDescriptor);
                if (mKnnTester.TestAndClassify(testObject, KNN_PARAMETER) == classificationA)
                {
                    Stop("Recognizer detected that the popcorn is ready");
                }
            }

            return(recognitionStatus);
        }
        private eRecognitionStatus Recognize()
        {
            eRecognitionStatus recognitionStatus = eRecognitionStatus.UnRecognized;

            if (mSubSoundsQueue.Count != 0)
            {
                IAudioFile subSound     = mSubSoundsQueue.Dequeue();
                bool       isMatchFound = mSoundFingerprintingUtility.IsAudioFileDetected(
                    subSound,
                    mAmplification,
                    mSecondsToAnalyzeAudioFiles);

                if (isMatchFound)
                {
                    recognitionStatus = eRecognitionStatus.Recognized;
                }
            }

            return(recognitionStatus);
        }
Ejemplo n.º 3
0
        private eRecognitionStatus Recognize()
        {
            eRecognitionStatus recognitionStatus = eRecognitionStatus.UnRecognized;

            if (mSubSoundsQueue.Count != 0)
            {
                IAudioFile subSound     = mSubSoundsQueue.Dequeue();
                bool       isMatchFound = SoundFingerprintingWrapper.FindMatchesForAudioFile(
                    subSound,
                    mAmplification,
                    mSecondsToAnalyzeAudioFiles);

                if (isMatchFound)
                {
                    recognitionStatus = eRecognitionStatus.Recognized;
                    SoundFingerprintingWrapper.StoreNewAudioFileData(subSound);
                }
            }

            return(recognitionStatus);
        }