Mercurial > hg > btrack
diff src/OnsetDetectionFunction.cpp @ 72:f4d9410f187e
flow: Merged <release> '1.0.0' to <master> ('master').
author | Adam Stark <adamstark@users.noreply.github.com> |
---|---|
date | Tue, 08 Jul 2014 12:32:27 +0100 |
parents | b387d8327729 |
children | 5eeabb24d677 |
line wrap: on
line diff
--- a/src/OnsetDetectionFunction.cpp Tue Jan 21 01:45:36 2014 +0000 +++ b/src/OnsetDetectionFunction.cpp Tue Jul 08 12:32:27 2014 +0100 @@ -20,247 +20,232 @@ //======================================================================= #include <math.h> -#include <iostream> #include "OnsetDetectionFunction.h" -using namespace std; -//------------------------------------------------------------------------------- -// Constructor -OnsetDetectionFunction :: OnsetDetectionFunction() + +//======================================================================= +OnsetDetectionFunction::OnsetDetectionFunction(int hopSize_,int frameSize_) : onsetDetectionFunctionType(ComplexSpectralDifferenceHWR), windowType(HanningWindow) +{ + // indicate that we have not initialised yet + initialised = false; + + // set pi + pi = 3.14159265358979; + + // initialise with arguments to constructor + initialise(hopSize_,frameSize_,ComplexSpectralDifferenceHWR,HanningWindow); +} + +//======================================================================= +OnsetDetectionFunction::OnsetDetectionFunction(int hopSize_,int frameSize_,int onsetDetectionFunctionType_,int windowType_) : onsetDetectionFunctionType(ComplexSpectralDifferenceHWR), windowType(HanningWindow) { // indicate that we have not initialised yet - initialised = 0; - - // set pi - pi = 3.14159265358979; - - // initialise with hopsize = 512, framesize = 1024, complex spectral difference DF and hanning window - initialise(512,1024,6,1); -} - - -//------------------------------------------------------------------------------- -// Constructor (with arguments) -OnsetDetectionFunction :: OnsetDetectionFunction(int arg_hsize,int arg_fsize,int arg_df_type,int arg_win_type) -{ - // indicate that we have not initialised yet - initialised = 0; + initialised = false; // set pi pi = 3.14159265358979; // initialise with arguments to constructor - initialise(arg_hsize,arg_fsize,arg_df_type,arg_win_type); + initialise(hopSize_,frameSize_,onsetDetectionFunctionType_,windowType_); } -//-------------------------------------------------------------------------------------- -// Destructor -OnsetDetectionFunction :: ~OnsetDetectionFunction() +//======================================================================= +OnsetDetectionFunction::~OnsetDetectionFunction() { - // destroy fft plan - fftw_destroy_plan(p); - fftw_free(in); - fftw_free(out); - - // deallocate memory - delete [] frame; - frame = NULL; - delete [] window; - window = NULL; - delete [] wframe; - wframe = NULL; - delete [] mag; - mag = NULL; - delete [] mag_old; - mag_old = NULL; - delete [] phase; - phase = NULL; - delete [] phase_old; - phase_old = NULL; - delete [] phase_old_2; - phase_old_2 = NULL; + if (initialised) + { + // destroy fft plan + fftw_destroy_plan(p); + fftw_free(complexIn); + fftw_free(complexOut); + } } -//------------------------------------------------------------------------------- -// Initialisation -void OnsetDetectionFunction :: initialise(int arg_hsize,int arg_fsize,int arg_df_type,int arg_win_type) +//======================================================================= +void OnsetDetectionFunction::initialise(int hopSize_,int frameSize_) { - if (initialised == 1) // if we have already initialised some buffers and an FFT plan + // use the already initialised onset detection function and window type and + // pass the new frame and hop size to the main initialisation function + initialise(hopSize_, frameSize_, onsetDetectionFunctionType, windowType); +} + +//======================================================================= +void OnsetDetectionFunction::initialise(int hopSize_,int frameSize_,int onsetDetectionFunctionType_,int windowType_) +{ + if (initialised) // if we have already initialised FFT plan { - ////////////////////////////////// - // TIDY UP FIRST - If initialise is called after the class has been initialised - // then we want to free up memory and cancel existing FFT plans - // destroy fft plan fftw_destroy_plan(p); - fftw_free(in); - fftw_free(out); - - - // deallocate memory - delete [] frame; - frame = NULL; - delete [] window; - window = NULL; - delete [] wframe; - wframe = NULL; - delete [] mag; - mag = NULL; - delete [] mag_old; - mag_old = NULL; - delete [] phase; - phase = NULL; - delete [] phase_old; - phase_old = NULL; - delete [] phase_old_2; - phase_old_2 = NULL; - - ////// END TIDY UP /////////////// - ////////////////////////////////// + fftw_free(complexIn); + fftw_free(complexOut); + } - hopsize = arg_hsize; // set hopsize - framesize = arg_fsize; // set framesize + hopSize = hopSize_; // set hopsize + frameSize = frameSize_; // set framesize - df_type = arg_df_type; // set detection function type + onsetDetectionFunctionType = onsetDetectionFunctionType_; // set detection function type + windowType = windowType_; // set window type // initialise buffers - frame = new double[framesize]; - window = new double[framesize]; - wframe = new double[framesize]; - - mag = new double[framesize]; - mag_old = new double[framesize]; - - phase = new double[framesize]; - phase_old = new double[framesize]; - phase_old_2 = new double[framesize]; + frame.resize(frameSize); + window.resize(frameSize); + magSpec.resize(frameSize); + prevMagSpec.resize(frameSize); + phase.resize(frameSize); + prevPhase.resize(frameSize); + prevPhase2.resize(frameSize); // set the window to the specified type - switch (arg_win_type){ - case 0: - set_win_rectangular(); // Rectangular window + switch (windowType){ + case RectangularWindow: + calculateRectangularWindow(); // Rectangular window break; - case 1: - set_win_hanning(); // Hanning Window + case HanningWindow: + calculateHanningWindow(); // Hanning Window break; - case 2: - set_win_hamming(); // Hamming Window + case HammingWindow: + calclulateHammingWindow(); // Hamming Window break; - case 3: - set_win_blackman(); // Blackman Window + case BlackmanWindow: + calculateBlackmanWindow(); // Blackman Window break; - case 4: - set_win_tukey(); // Tukey Window + case TukeyWindow: + calculateTukeyWindow(); // Tukey Window break; default: - set_win_hanning(); // DEFAULT: Hanning Window + calculateHanningWindow(); // DEFAULT: Hanning Window } - - - // initialise previous magnitude spectrum to zero - for (int i = 0;i < framesize;i++) + for (int i = 0;i < frameSize;i++) { - mag_old[i] = 0.0; - phase_old[i] = 0.0; - phase_old_2[i] = 0.0; + prevMagSpec[i] = 0.0; + prevPhase[i] = 0.0; + prevPhase2[i] = 0.0; frame[i] = 0.0; } - energy_sum_old = 0.0; // initialise previous energy sum value to zero + prevEnergySum = 0.0; // initialise previous energy sum value to zero /* Init fft */ - in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * framesize); // complex array to hold fft data - out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * framesize); // complex array to hold fft data - p = fftw_plan_dft_1d(framesize, in, out, FFTW_FORWARD, FFTW_ESTIMATE); // FFT plan initialisation + complexIn = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * frameSize); // complex array to hold fft data + complexOut = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * frameSize); // complex array to hold fft data + p = fftw_plan_dft_1d(frameSize, complexIn, complexOut, FFTW_FORWARD, FFTW_ESTIMATE); // FFT plan initialisation - initialised = 1; + initialised = true; } -//-------------------------------------------------------------------------------------- -// set the detection function type to that specified by the argument -void OnsetDetectionFunction :: set_df_type(int arg_df_type) +//======================================================================= +void OnsetDetectionFunction :: setOnsetDetectionFunctionType(int onsetDetectionFunctionType_) { - df_type = arg_df_type; // set detection function type + onsetDetectionFunctionType = onsetDetectionFunctionType_; // set detection function type } - -//-------------------------------------------------------------------------------------- -// calculates a single detection function sample from a single audio frame. -double OnsetDetectionFunction :: getDFsample(double inputbuffer[]) +//======================================================================= +double OnsetDetectionFunction :: calculateOnsetDetectionFunctionSample(double *buffer) { - double df_sample; + double odfSample; // shift audio samples back in frame by hop size - for (int i = 0; i < (framesize-hopsize);i++) + for (int i = 0; i < (frameSize-hopSize);i++) { - frame[i] = frame[i+hopsize]; + frame[i] = frame[i+hopSize]; } // add new samples to frame from input buffer int j = 0; - for (int i = (framesize-hopsize);i < framesize;i++) + for (int i = (frameSize-hopSize);i < frameSize;i++) { - frame[i] = inputbuffer[j]; + frame[i] = buffer[j]; j++; } - switch (df_type){ - case 0: - df_sample = energy_envelope(); // calculate energy envelope detection function sample - break; - case 1: - df_sample = energy_difference(); // calculate half-wave rectified energy difference detection function sample + switch (onsetDetectionFunctionType){ + case EnergyEnvelope: + { + // calculate energy envelope detection function sample + odfSample = energyEnvelope(); break; - case 2: - df_sample = spectral_difference(); // calculate spectral difference detection function sample + } + case EnergyDifference: + { + // calculate half-wave rectified energy difference detection function sample + odfSample = energyDifference(); break; - case 3: - df_sample = spectral_difference_hwr(); // calculate spectral difference detection function sample (half wave rectified) + } + case SpectralDifference: + { + // calculate spectral difference detection function sample + odfSample = spectralDifference(); break; - case 4: - df_sample = phase_deviation(); // calculate phase deviation detection function sample (half wave rectified) + } + case SpectralDifferenceHWR: + { + // calculate spectral difference detection function sample (half wave rectified) + odfSample = spectralDifferenceHWR(); break; - case 5: - df_sample = complex_spectral_difference(); // calcualte complex spectral difference detection function sample + } + case PhaseDeviation: + { + // calculate phase deviation detection function sample (half wave rectified) + odfSample = phaseDeviation(); break; - case 6: - df_sample = complex_spectral_difference_hwr(); // calcualte complex spectral difference detection function sample (half-wave rectified) + } + case ComplexSpectralDifference: + { + // calcualte complex spectral difference detection function sample + odfSample = complexSpectralDifference(); break; - case 7: - df_sample = high_frequency_content(); // calculate high frequency content detection function sample + } + case ComplexSpectralDifferenceHWR: + { + // calcualte complex spectral difference detection function sample (half-wave rectified) + odfSample = complexSpectralDifferenceHWR(); break; - case 8: - df_sample = high_frequency_spectral_difference(); // calculate high frequency spectral difference detection function sample + } + case HighFrequencyContent: + { + // calculate high frequency content detection function sample + odfSample = highFrequencyContent(); break; - case 9: - df_sample = high_frequency_spectral_difference_hwr(); // calculate high frequency spectral difference detection function (half-wave rectified) + } + case HighFrequencySpectralDifference: + { + // calculate high frequency spectral difference detection function sample + odfSample = highFrequencySpectralDifference(); break; + } + case HighFrequencySpectralDifferenceHWR: + { + // calculate high frequency spectral difference detection function (half-wave rectified) + odfSample = highFrequencySpectralDifferenceHWR(); + break; + } default: - df_sample = 1.0; + { + odfSample = 1.0; + } } - return df_sample; + return odfSample; } -//-------------------------------------------------------------------------------------- -// performs the fft, storing the complex result in 'out' -void OnsetDetectionFunction :: perform_FFT() +//======================================================================= +void OnsetDetectionFunction :: performFFT() { - int fsize2 = (framesize/2); + int fsize2 = (frameSize/2); // window frame and copy to complex array, swapping the first and second half of the signal for (int i = 0;i < fsize2;i++) { - in[i][0] = frame[i+fsize2] * window[i+fsize2]; - in[i][1] = 0.0; - in[i+fsize2][0] = frame[i] * window[i]; - in[i+fsize2][1] = 0.0; + complexIn[i][0] = frame[i+fsize2] * window[i+fsize2]; + complexIn[i][1] = 0.0; + complexIn[i+fsize2][0] = frame[i] * window[i]; + complexIn[i+fsize2][1] = 0.0; } // perform the fft @@ -271,16 +256,15 @@ //////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////// Methods for Detection Functions ///////////////////////////////// -//-------------------------------------------------------------------------------------- -// calculates an energy envelope detection function sample -double OnsetDetectionFunction :: energy_envelope() +//======================================================================= +double OnsetDetectionFunction :: energyEnvelope() { double sum; sum = 0; // initialise sum // sum the squares of the samples - for (int i = 0;i < framesize;i++) + for (int i = 0;i < frameSize;i++) { sum = sum + (frame[i]*frame[i]); } @@ -288,9 +272,8 @@ return sum; // return sum } -//-------------------------------------------------------------------------------------- -// calculates a half-wave rectified energy difference detection function sample -double OnsetDetectionFunction :: energy_difference() +//======================================================================= +double OnsetDetectionFunction :: energyDifference() { double sum; double sample; @@ -298,14 +281,14 @@ sum = 0; // initialise sum // sum the squares of the samples - for (int i = 0;i < framesize;i++) + for (int i = 0;i < frameSize;i++) { sum = sum + (frame[i]*frame[i]); } - sample = sum - energy_sum_old; // sample is first order difference in energy + sample = sum - prevEnergySum; // sample is first order difference in energy - energy_sum_old = sum; // store energy value for next calculation + prevEnergySum = sum; // store energy value for next calculation if (sample > 0) { @@ -317,33 +300,32 @@ } } -//-------------------------------------------------------------------------------------- -// calculates a spectral difference detection function sample -double OnsetDetectionFunction :: spectral_difference() +//======================================================================= +double OnsetDetectionFunction :: spectralDifference() { double diff; double sum; // perform the FFT - perform_FFT(); + performFFT(); // compute first (N/2)+1 mag values - for (int i = 0;i < (framesize/2)+1;i++) + for (int i = 0;i < (frameSize/2)+1;i++) { - mag[i] = sqrt(pow(out[i][0],2) + pow(out[i][1],2)); + 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++) + for (int i = (frameSize/2)+1;i < frameSize;i++) { - mag[i] = mag[framesize-i]; + magSpec[i] = magSpec[frameSize-i]; } sum = 0; // initialise sum to zero - for (int i = 0;i < framesize;i++) + for (int i = 0;i < frameSize;i++) { // calculate difference - diff = mag[i] - mag_old[i]; + diff = magSpec[i] - prevMagSpec[i]; // ensure all difference values are positive if (diff < 0) @@ -355,39 +337,38 @@ sum = sum+diff; // store magnitude spectrum bin for next detection function sample calculation - mag_old[i] = mag[i]; + prevMagSpec[i] = magSpec[i]; } return sum; } -//-------------------------------------------------------------------------------------- -// calculates a spectral difference detection function sample -double OnsetDetectionFunction :: spectral_difference_hwr() +//======================================================================= +double OnsetDetectionFunction :: spectralDifferenceHWR() { double diff; double sum; // perform the FFT - perform_FFT(); + performFFT(); // compute first (N/2)+1 mag values - for (int i = 0;i < (framesize/2)+1;i++) + for (int i = 0;i < (frameSize/2)+1;i++) { - mag[i] = sqrt(pow(out[i][0],2) + pow(out[i][1],2)); + 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++) + for (int i = (frameSize/2)+1;i < frameSize;i++) { - mag[i] = mag[framesize-i]; + magSpec[i] = magSpec[frameSize-i]; } sum = 0; // initialise sum to zero - for (int i = 0;i < framesize;i++) + for (int i = 0;i < frameSize;i++) { // calculate difference - diff = mag[i] - mag_old[i]; + diff = magSpec[i] - prevMagSpec[i]; // only add up positive differences if (diff > 0) @@ -399,39 +380,38 @@ // store magnitude spectrum bin for next detection function sample calculation - mag_old[i] = mag[i]; + prevMagSpec[i] = magSpec[i]; } return sum; } -//-------------------------------------------------------------------------------------- -// calculates a phase deviation detection function sample -double OnsetDetectionFunction :: phase_deviation() +//======================================================================= +double OnsetDetectionFunction :: phaseDeviation() { double dev,pdev; double sum; // perform the FFT - perform_FFT(); + performFFT(); sum = 0; // initialise sum to zero // compute phase values from fft output and sum deviations - for (int i = 0;i < framesize;i++) + for (int i = 0;i < frameSize;i++) { // calculate phase value - phase[i] = atan2(out[i][1],out[i][0]); + phase[i] = atan2(complexOut[i][1],complexOut[i][0]); // calculate magnitude value - mag[i] = sqrt(pow(out[i][0],2) + pow(out[i][1],2)); + 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 (mag[i] > 0.1) + if (magSpec[i] > 0.1) { - dev = phase[i] - (2*phase_old[i]) + phase_old_2[i]; // phase deviation + dev = phase[i] - (2*prevPhase[i]) + prevPhase2[i]; // phase deviation pdev = princarg(dev); // wrap into [-pi,pi] range // make all values positive @@ -445,16 +425,15 @@ } // store values for next calculation - phase_old_2[i] = phase_old[i]; - phase_old[i] = phase[i]; + prevPhase2[i] = prevPhase[i]; + prevPhase[i] = phase[i]; } return sum; } -//-------------------------------------------------------------------------------------- -// calculates a complex spectral difference detection function sample -double OnsetDetectionFunction :: complex_spectral_difference() +//======================================================================= +double OnsetDetectionFunction :: complexSpectralDifference() { double dev,pdev; double sum; @@ -462,32 +441,32 @@ double value; // perform the FFT - perform_FFT(); + performFFT(); sum = 0; // initialise sum to zero // compute phase values from fft output and sum deviations - for (int i = 0;i < framesize;i++) + for (int i = 0;i < frameSize;i++) { // calculate phase value - phase[i] = atan2(out[i][1],out[i][0]); + phase[i] = atan2(complexOut[i][1],complexOut[i][0]); // calculate magnitude value - mag[i] = sqrt(pow(out[i][0],2) + pow(out[i][1],2)); + magSpec[i] = sqrt(pow(complexOut[i][0],2) + pow(complexOut[i][1],2)); // phase deviation - dev = phase[i] - (2*phase_old[i]) + phase_old_2[i]; + dev = phase[i] - (2*prevPhase[i]) + prevPhase2[i]; // wrap into [-pi,pi] range pdev = princarg(dev); // calculate magnitude difference (real part of Euclidean distance between complex frames) - mag_diff = mag[i] - mag_old[i]; + mag_diff = magSpec[i] - prevMagSpec[i]; // calculate phase difference (imaginary part of Euclidean distance between complex frames) - phase_diff = -mag[i]*sin(pdev); + phase_diff = -magSpec[i]*sin(pdev); @@ -500,17 +479,16 @@ // store values for next calculation - phase_old_2[i] = phase_old[i]; - phase_old[i] = phase[i]; - mag_old[i] = mag[i]; + prevPhase2[i] = prevPhase[i]; + prevPhase[i] = phase[i]; + prevMagSpec[i] = magSpec[i]; } return sum; } -//-------------------------------------------------------------------------------------- -// calculates a complex spectral difference detection function sample (half-wave rectified) -double OnsetDetectionFunction :: complex_spectral_difference_hwr() +//======================================================================= +double OnsetDetectionFunction :: complexSpectralDifferenceHWR() { double dev,pdev; double sum; @@ -518,35 +496,35 @@ double value; // perform the FFT - perform_FFT(); + performFFT(); sum = 0; // initialise sum to zero // compute phase values from fft output and sum deviations - for (int i = 0;i < framesize;i++) + for (int i = 0;i < frameSize;i++) { // calculate phase value - phase[i] = atan2(out[i][1],out[i][0]); + phase[i] = atan2(complexOut[i][1],complexOut[i][0]); // calculate magnitude value - mag[i] = sqrt(pow(out[i][0],2) + pow(out[i][1],2)); + magSpec[i] = sqrt(pow(complexOut[i][0],2) + pow(complexOut[i][1],2)); // phase deviation - dev = phase[i] - (2*phase_old[i]) + phase_old_2[i]; + dev = phase[i] - (2*prevPhase[i]) + prevPhase2[i]; // wrap into [-pi,pi] range pdev = princarg(dev); // calculate magnitude difference (real part of Euclidean distance between complex frames) - mag_diff = mag[i] - mag_old[i]; + mag_diff = magSpec[i] - prevMagSpec[i]; // if we have a positive change in magnitude, then include in sum, otherwise ignore (half-wave rectification) if (mag_diff > 0) { // calculate phase difference (imaginary part of Euclidean distance between complex frames) - phase_diff = -mag[i]*sin(pdev); + phase_diff = -magSpec[i]*sin(pdev); // square real and imaginary parts, sum and take square root value = sqrt(pow(mag_diff,2) + pow(phase_diff,2)); @@ -556,63 +534,60 @@ } // store values for next calculation - phase_old_2[i] = phase_old[i]; - phase_old[i] = phase[i]; - mag_old[i] = mag[i]; + prevPhase2[i] = prevPhase[i]; + prevPhase[i] = phase[i]; + prevMagSpec[i] = magSpec[i]; } return sum; } -//-------------------------------------------------------------------------------------- -// calculates a high frequency content detection function sample -double OnsetDetectionFunction :: high_frequency_content() +//======================================================================= +double OnsetDetectionFunction :: highFrequencyContent() +{ + 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 magnitude value + magSpec[i] = sqrt(pow(complexOut[i][0],2) + pow(complexOut[i][1],2)); + + + sum = sum + (magSpec[i]*((double) (i+1))); + + // store values for next calculation + prevMagSpec[i] = magSpec[i]; + } + + return sum; +} + +//======================================================================= +double OnsetDetectionFunction :: highFrequencySpectralDifference() { double sum; double mag_diff; // perform the FFT - perform_FFT(); + performFFT(); sum = 0; // initialise sum to zero // compute phase values from fft output and sum deviations - for (int i = 0;i < framesize;i++) + for (int i = 0;i < frameSize;i++) { // calculate magnitude value - mag[i] = sqrt(pow(out[i][0],2) + pow(out[i][1],2)); - - - sum = sum + (mag[i]*((double) (i+1))); - - // store values for next calculation - mag_old[i] = mag[i]; - } - - return sum; -} - -//-------------------------------------------------------------------------------------- -// calculates a high frequency spectral difference detection function sample -double OnsetDetectionFunction :: high_frequency_spectral_difference() -{ - double sum; - double mag_diff; - - // perform the FFT - perform_FFT(); - - 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 - mag[i] = sqrt(pow(out[i][0],2) + pow(out[i][1],2)); + magSpec[i] = sqrt(pow(complexOut[i][0],2) + pow(complexOut[i][1],2)); // calculate difference - mag_diff = mag[i] - mag_old[i]; + mag_diff = magSpec[i] - prevMagSpec[i]; if (mag_diff < 0) { @@ -622,32 +597,31 @@ sum = sum + (mag_diff*((double) (i+1))); // store values for next calculation - mag_old[i] = mag[i]; + prevMagSpec[i] = magSpec[i]; } return sum; } -//-------------------------------------------------------------------------------------- -// calculates a high frequency spectral difference detection function sample (half-wave rectified) -double OnsetDetectionFunction :: high_frequency_spectral_difference_hwr() +//======================================================================= +double OnsetDetectionFunction :: highFrequencySpectralDifferenceHWR() { double sum; double mag_diff; // perform the FFT - perform_FFT(); + performFFT(); sum = 0; // initialise sum to zero // compute phase values from fft output and sum deviations - for (int i = 0;i < framesize;i++) + for (int i = 0;i < frameSize;i++) { // calculate magnitude value - mag[i] = sqrt(pow(out[i][0],2) + pow(out[i][1],2)); + magSpec[i] = sqrt(pow(complexOut[i][0],2) + pow(complexOut[i][1],2)); // calculate difference - mag_diff = mag[i] - mag_old[i]; + mag_diff = magSpec[i] - prevMagSpec[i]; if (mag_diff > 0) { @@ -655,7 +629,7 @@ } // store values for next calculation - mag_old[i] = mag[i]; + prevMagSpec[i] = magSpec[i]; } return sum; @@ -666,76 +640,70 @@ //////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////// Methods to Calculate Windows //////////////////////////////////// -//-------------------------------------------------------------------------------------- -// HANNING: set the window in the buffer 'window' to a Hanning window -void OnsetDetectionFunction :: set_win_hanning() +//======================================================================= +void OnsetDetectionFunction :: calculateHanningWindow() { double N; // variable to store framesize minus 1 - N = (double) (framesize-1); // framesize minus 1 + N = (double) (frameSize-1); // framesize minus 1 // Hanning window calculation - for (int n = 0;n < framesize;n++) + for (int n = 0;n < frameSize;n++) { window[n] = 0.5*(1-cos(2*pi*(n/N))); } } -//-------------------------------------------------------------------------------------- -// HAMMING: set the window in the buffer 'window' to a Hanning window -void OnsetDetectionFunction :: set_win_hamming() +//======================================================================= +void OnsetDetectionFunction :: calclulateHammingWindow() { double N; // variable to store framesize minus 1 double n_val; // double version of index 'n' - N = (double) (framesize-1); // framesize minus 1 + N = (double) (frameSize-1); // framesize minus 1 n_val = 0; // Hamming window calculation - for (int n = 0;n < framesize;n++) + for (int n = 0;n < frameSize;n++) { window[n] = 0.54 - (0.46*cos(2*pi*(n_val/N))); n_val = n_val+1; } } -//-------------------------------------------------------------------------------------- -// BLACKMAN: set the window in the buffer 'window' to a Blackman window -void OnsetDetectionFunction :: set_win_blackman() +//======================================================================= +void OnsetDetectionFunction :: calculateBlackmanWindow() { double N; // variable to store framesize minus 1 double n_val; // double version of index 'n' - N = (double) (framesize-1); // framesize minus 1 + N = (double) (frameSize-1); // framesize minus 1 n_val = 0; // Blackman window calculation - for (int n = 0;n < framesize;n++) + for (int n = 0;n < frameSize;n++) { window[n] = 0.42 - (0.5*cos(2*pi*(n_val/N))) + (0.08*cos(4*pi*(n_val/N))); n_val = n_val+1; } } -//-------------------------------------------------------------------------------------- -// TUKEY: set the window in the buffer 'window' to a Tukey window -void OnsetDetectionFunction :: set_win_tukey() +//======================================================================= +void OnsetDetectionFunction :: calculateTukeyWindow() { double N; // variable to store framesize minus 1 double n_val; // double version of index 'n' double alpha; // alpha [default value = 0.5]; - int lim1,lim2; - alpha = 0.5; - N = (double) (framesize-1); // framesize minus 1 + N = (double) (frameSize-1); // framesize minus 1 // Tukey window calculation - n_val = (double) (-1*((framesize/2)))+1; + n_val = (double) (-1*((frameSize/2)))+1; - for (int n = 0;n < framesize;n++) // left taper + for (int n = 0;n < frameSize;n++) // left taper { if ((n_val >= 0) && (n_val <= (alpha*(N/2)))) { @@ -755,12 +723,11 @@ } -//-------------------------------------------------------------------------------------- -// RECTANGULAR: set the window in the buffer 'window' to a Rectangular window -void OnsetDetectionFunction :: set_win_rectangular() +//======================================================================= +void OnsetDetectionFunction :: calculateRectangularWindow() { // Rectangular window calculation - for (int n = 0;n < framesize;n++) + for (int n = 0;n < frameSize;n++) { window[n] = 1.0; } @@ -772,23 +739,22 @@ //////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// Other Handy Methods ////////////////////////////////////////// -//-------------------------------------------------------------------------------------- -// set phase values to the range [-pi,pi] -double OnsetDetectionFunction :: princarg(double phaseval) +//======================================================================= +double OnsetDetectionFunction :: princarg(double phaseVal) { // if phase value is less than or equal to -pi then add 2*pi - while (phaseval <= (-pi)) + while (phaseVal <= (-pi)) { - phaseval = phaseval + (2*pi); + phaseVal = phaseVal + (2*pi); } // if phase value is larger than pi, then subtract 2*pi - while (phaseval > pi) + while (phaseVal > pi) { - phaseval = phaseval - (2*pi); + phaseVal = phaseVal - (2*pi); } - return phaseval; + return phaseVal; }