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