Mercurial > hg > qm-dsp
diff dsp/tonal/ChangeDetectionFunction.cpp @ 482:cbe668c7d724
Untabify, indent, tidy
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Fri, 31 May 2019 11:02:28 +0100 |
parents | d5014ab8b0e5 |
children | 7992d0923626 |
line wrap: on
line diff
--- a/dsp/tonal/ChangeDetectionFunction.cpp Fri May 31 10:54:02 2019 +0100 +++ b/dsp/tonal/ChangeDetectionFunction.cpp Fri May 31 11:02:28 2019 +0100 @@ -19,12 +19,10 @@ #define PI (3.14159265358979232846) #endif - - ChangeDetectionFunction::ChangeDetectionFunction(ChangeDFConfig config) : - m_dFilterSigma(0.0), m_iFilterWidth(0) + m_dFilterSigma(0.0), m_iFilterWidth(0) { - setFilterWidth(config.smoothingWidth); + setFilterWidth(config.smoothingWidth); } ChangeDetectionFunction::~ChangeDetectionFunction() @@ -33,112 +31,107 @@ void ChangeDetectionFunction::setFilterWidth(const int iWidth) { - m_iFilterWidth = iWidth*2+1; - - // it is assumed that the gaussian is 0 outside of +/- FWHM - // => filter width = 2*FWHM = 2*2.3548*sigma - m_dFilterSigma = double(m_iFilterWidth) / double(2*2.3548); - m_vaGaussian.resize(m_iFilterWidth); - - double dScale = 1.0 / (m_dFilterSigma*sqrt(2*PI)); - - for (int x = -(m_iFilterWidth-1)/2; x <= (m_iFilterWidth-1)/2; x++) - { - double w = dScale * std::exp ( -(x*x)/(2*m_dFilterSigma*m_dFilterSigma) ); - m_vaGaussian[x + (m_iFilterWidth-1)/2] = w; - } - + m_iFilterWidth = iWidth*2+1; + + // it is assumed that the gaussian is 0 outside of +/- FWHM + // => filter width = 2*FWHM = 2*2.3548*sigma + m_dFilterSigma = double(m_iFilterWidth) / double(2*2.3548); + m_vaGaussian.resize(m_iFilterWidth); + + double dScale = 1.0 / (m_dFilterSigma*sqrt(2*PI)); + + for (int x = -(m_iFilterWidth-1)/2; x <= (m_iFilterWidth-1)/2; x++) { + double w = dScale * std::exp ( -(x*x)/(2*m_dFilterSigma*m_dFilterSigma) ); + m_vaGaussian[x + (m_iFilterWidth-1)/2] = w; + } + #ifdef DEBUG_CHANGE_DETECTION_FUNCTION - std::cerr << "Filter sigma: " << m_dFilterSigma << std::endl; - std::cerr << "Filter width: " << m_iFilterWidth << std::endl; + std::cerr << "Filter sigma: " << m_dFilterSigma << std::endl; + std::cerr << "Filter width: " << m_iFilterWidth << std::endl; #endif } ChangeDistance ChangeDetectionFunction::process(const TCSGram& rTCSGram) { - ChangeDistance retVal; - retVal.resize(rTCSGram.getSize(), 0.0); - - TCSGram smoothedTCSGram; + ChangeDistance retVal; + retVal.resize(rTCSGram.getSize(), 0.0); + + TCSGram smoothedTCSGram; - for (int iPosition = 0; iPosition < rTCSGram.getSize(); iPosition++) - { - int iSkipLower = 0; - - int iLowerPos = iPosition - (m_iFilterWidth-1)/2; - int iUpperPos = iPosition + (m_iFilterWidth-1)/2; - - if (iLowerPos < 0) - { - iSkipLower = -iLowerPos; - iLowerPos = 0; - } - - if (iUpperPos >= rTCSGram.getSize()) - { - int iMaxIndex = rTCSGram.getSize() - 1; - iUpperPos = iMaxIndex; - } - - TCSVector smoothedVector; + for (int iPosition = 0; iPosition < rTCSGram.getSize(); iPosition++) { + + int iSkipLower = 0; + + int iLowerPos = iPosition - (m_iFilterWidth-1)/2; + int iUpperPos = iPosition + (m_iFilterWidth-1)/2; + + if (iLowerPos < 0) { + iSkipLower = -iLowerPos; + iLowerPos = 0; + } + + if (iUpperPos >= rTCSGram.getSize()) { + int iMaxIndex = rTCSGram.getSize() - 1; + iUpperPos = iMaxIndex; + } + + TCSVector smoothedVector; - // for every bin of the vector, calculate the smoothed value - for (int iPC = 0; iPC < 6; iPC++) - { - size_t j = 0; - double dSmoothedValue = 0.0; - TCSVector rCV; - - for (int i = iLowerPos; i <= iUpperPos; i++) - { - rTCSGram.getTCSVector(i, rCV); - dSmoothedValue += m_vaGaussian[iSkipLower + j++] * rCV[iPC]; - } + // for every bin of the vector, calculate the smoothed value + for (int iPC = 0; iPC < 6; iPC++) { - smoothedVector[iPC] = dSmoothedValue; - } - - smoothedTCSGram.addTCSVector(smoothedVector); - } + size_t j = 0; + double dSmoothedValue = 0.0; + TCSVector rCV; + + for (int i = iLowerPos; i <= iUpperPos; i++) { + rTCSGram.getTCSVector(i, rCV); + dSmoothedValue += m_vaGaussian[iSkipLower + j++] * rCV[iPC]; + } - for (int iPosition = 0; iPosition < rTCSGram.getSize(); iPosition++) - { - /* - TODO: calculate a confidence measure for the current estimation - if the current estimate is not confident enough, look further into the future/the past - e.g., High frequency content, zero crossing rate, spectral flatness - */ - - TCSVector nextTCS; - TCSVector previousTCS; - - int iWindow = 1; + smoothedVector[iPC] = dSmoothedValue; + } + + smoothedTCSGram.addTCSVector(smoothedVector); + } - // while (previousTCS.magnitude() < 0.1 && (iPosition-iWindow) > 0) - { - smoothedTCSGram.getTCSVector(iPosition-iWindow, previousTCS); - // std::cout << previousTCS.magnitude() << std::endl; - iWindow++; - } - - iWindow = 1; - - // while (nextTCS.magnitude() < 0.1 && (iPosition+iWindow) < (rTCSGram.getSize()-1) ) - { - smoothedTCSGram.getTCSVector(iPosition+iWindow, nextTCS); - iWindow++; - } + for (int iPosition = 0; iPosition < rTCSGram.getSize(); iPosition++) { + + /* + TODO: calculate a confidence measure for the current estimation + if the current estimate is not confident enough, look further into the future/the past + e.g., High frequency content, zero crossing rate, spectral flatness + */ + + TCSVector nextTCS; + TCSVector previousTCS; + + int iWindow = 1; - double distance = 0.0; - // Euclidean distance - for (size_t j = 0; j < 6; j++) - { - distance += std::pow(nextTCS[j] - previousTCS[j], 2.0); - } - - retVal[iPosition] = std::pow(distance, 0.5); - } + // while (previousTCS.magnitude() < 0.1 && (iPosition-iWindow) > 0) + { + smoothedTCSGram.getTCSVector(iPosition-iWindow, previousTCS); + // std::cout << previousTCS.magnitude() << std::endl; + iWindow++; + } + + iWindow = 1; + + // while (nextTCS.magnitude() < 0.1 && (iPosition+iWindow) < (rTCSGram.getSize()-1) ) + { + smoothedTCSGram.getTCSVector(iPosition+iWindow, nextTCS); + iWindow++; + } - return retVal; + double distance = 0.0; + // Euclidean distance + for (size_t j = 0; j < 6; j++) { + distance += std::pow(nextTCS[j] - previousTCS[j], 2.0); + } + + retVal[iPosition] = std::pow(distance, 0.5); + } + + return retVal; }