//======================================================================= double OnsetDetectionFunction :: highFrequencySpectralDifferenceHWR() { double sum; double mag_diff; // perform the FFT performFFT(); sum = 0; // initialise sum to zero // compute phase values from fft output and sum deviations for (int i = 0;i < frameSize;i++) { // calculate magnitude value magSpec[i] = sqrt(pow(complexOut[i][0],2) + pow(complexOut[i][1],2)); // calculate difference mag_diff = magSpec[i] - prevMagSpec[i]; if (mag_diff > 0) { sum = sum + (mag_diff*((double) (i+1))); } // store values for next calculation prevMagSpec[i] = magSpec[i]; } return sum; }
//======================================================================= double OnsetDetectionFunction :: complexSpectralDifferenceHWR() { double phaseDeviation; double sum; double magnitudeDifference; double csd; // perform the FFT performFFT(); sum = 0; // initialise sum to zero // compute phase values from fft output and sum deviations for (int i = 0;i < frameSize;i++) { // calculate phase value phase[i] = atan2(complexOut[i][1],complexOut[i][0]); // calculate magnitude value magSpec[i] = sqrt(pow(complexOut[i][0],2) + pow(complexOut[i][1],2)); // phase deviation phaseDeviation = phase[i] - (2*prevPhase[i]) + prevPhase2[i]; // calculate magnitude difference (real part of Euclidean distance between complex frames) magnitudeDifference = magSpec[i] - prevMagSpec[i]; // if we have a positive change in magnitude, then include in sum, otherwise ignore (half-wave rectification) if (magnitudeDifference > 0) { // calculate complex spectral difference for the current spectral bin csd = sqrt(pow(magSpec[i], 2) + pow(prevMagSpec[i], 2) - 2 * magSpec[i] * prevMagSpec[i] * cos(phaseDeviation)); // add to sum sum = sum + csd; } // store values for next calculation prevPhase2[i] = prevPhase[i]; prevPhase[i] = phase[i]; prevMagSpec[i] = magSpec[i]; } return sum; }
//======================================================================= double OnsetDetectionFunction :: phaseDeviation() { double dev,pdev; double sum; // perform the FFT performFFT(); sum = 0; // initialise sum to zero // compute phase values from fft output and sum deviations for (int i = 0;i < frameSize;i++) { // calculate phase value phase[i] = atan2(complexOut[i][1],complexOut[i][0]); // calculate magnitude value magSpec[i] = sqrt(pow(complexOut[i][0],2) + pow(complexOut[i][1],2)); // if bin is not just a low energy bin then examine phase deviation if (magSpec[i] > 0.1) { dev = phase[i] - (2*prevPhase[i]) + prevPhase2[i]; // phase deviation pdev = princarg(dev); // wrap into [-pi,pi] range // make all values positive if (pdev < 0) { pdev = pdev*-1; } // add to sum sum = sum + pdev; } // store values for next calculation prevPhase2[i] = prevPhase[i]; prevPhase[i] = phase[i]; } return sum; }
//======================================================================= double OnsetDetectionFunction :: spectralDifferenceHWR() { double diff; double sum; // perform the FFT performFFT(); // compute first (N/2)+1 mag values for (int i = 0;i < (frameSize/2)+1;i++) { magSpec[i] = sqrt(pow(complexOut[i][0],2) + pow(complexOut[i][1],2)); } // mag spec symmetric above (N/2)+1 so copy previous values for (int i = (frameSize/2)+1;i < frameSize;i++) { magSpec[i] = magSpec[frameSize-i]; } sum = 0; // initialise sum to zero for (int i = 0;i < frameSize;i++) { // calculate difference diff = magSpec[i] - prevMagSpec[i]; // only add up positive differences if (diff > 0) { // add difference to sum sum = sum+diff; } // store magnitude spectrum bin for next detection function sample calculation prevMagSpec[i] = magSpec[i]; } return sum; }
//======================================================================= double OnsetDetectionFunction :: complexSpectralDifference() { double phaseDeviation; double sum; double csd; // perform the FFT performFFT(); sum = 0; // initialise sum to zero // compute phase values from fft output and sum deviations for (int i = 0;i < frameSize;i++) { // calculate phase value phase[i] = atan2(complexOut[i][1],complexOut[i][0]); // calculate magnitude value magSpec[i] = sqrt(pow(complexOut[i][0],2) + pow(complexOut[i][1],2)); // phase deviation phaseDeviation = phase[i] - (2*prevPhase[i]) + prevPhase2[i]; // calculate complex spectral difference for the current spectral bin csd = sqrt(pow(magSpec[i], 2) + pow(prevMagSpec[i], 2) - 2 * magSpec[i] * prevMagSpec[i] * cos(phaseDeviation)); // add to sum sum = sum + csd; // store values for next calculation prevPhase2[i] = prevPhase[i]; prevPhase[i] = phase[i]; prevMagSpec[i] = magSpec[i]; } return sum; }
// _______________________________________________________ void KeyWordDetector::getMFCCs() { // First perform the FFT performFFT(); // Try to reduce noise by estimated noise floor subtraction spectralNoiseGating(); // Only half of the powerSpec vector [0-FFT_SIZE/2] now contains relevant information // Calculate the power spectrum in place powerSpectrum(); // Calculate the log mel energies will be size of NUM_MEL_FILTER_BANKS melEnergy(logMelEn, powerSpec, FFT_SIZE/2, melBins, NUM_MEL_FILTER_BANKS+2); // Compute the 12 needed mfccs by the adjusted discrete cosine transformation for 26 performDCT26Unrolled12MFCCs(currentMFCCs, logMelEn, dctCoeff); //printV(logMelEn, 28, true); }