14 : m_numMelCoefficients(40), m_numMelCepstralCoefficients(13), m_spectralFrameSize(analysisFrameSize)
24 m_samplingFrequency = fs;
28 m_melFrequencySpectrum.setSamplingFrequency(m_samplingFrequency);
34 jassert(m_spectralFrameSize > -1);
36 m_numMelCoefficients = numcoeffs;
38 m_melFrequencySpectrum.setParameters(m_spectralFrameSize, m_numMelCoefficients);
44 jassert(m_spectralFrameSize > -1);
46 m_numMelCepstralCoefficients = numcoeffs;
48 m_dct.setInputOutputSize(m_numMelCoefficients, m_numMelCepstralCoefficients);
55 if (!m_freqVector.empty())
60 m_freqVector = freqVector;
67 jassert(m_samplingFrequency > -1);
68 return m_samplingFrequency;
74 return m_numMelCepstralCoefficients;
84 m_prevMagSpecSpectralFlux.resize(m_spectralFrameSize);
86 if (m_prevMagSpecSpectralFlux.size() > 0)
88 FloatVectorOperations::fill(&m_prevMagSpecSpectralFlux[0], 0.f, m_prevMagSpecSpectralFlux.size());
92 m_prevMagSpecCSD.resize(m_spectralFrameSize);
93 m_prevPhase1CSD.resize(m_spectralFrameSize);
94 m_prevPhase2CSD.resize(m_spectralFrameSize);
96 if (m_prevMagSpecCSD.size() > 0)
98 FloatVectorOperations::fill(&m_prevMagSpecCSD[0], 0.f, m_prevMagSpecCSD.size());
100 if (m_prevPhase1CSD.size() > 0)
102 FloatVectorOperations::fill(&m_prevPhase1CSD[0], 0.f, m_prevPhase1CSD.size());
104 if (m_prevPhase2CSD.size() > 0)
106 FloatVectorOperations::fill(&m_prevPhase2CSD[0], 0.f, m_prevPhase2CSD.size());
109 setNumberOfMelFrequencyCoefficients(m_numMelCoefficients);
111 setNumberOfMelFrequencyCepstralCoefficients(m_numMelCepstralCoefficients);
117 m_spectralFrame = spectralFrame;
123 jassert(m_samplingFrequency > -1);
125 float currentMax{0.0f};
126 int currentMaxIndex{0};
127 for (
int i = 0; i < m_spectralFrame.size(); i++)
129 if (std::fabsf(m_spectralFrame[i]) > currentMax)
131 currentMax = m_spectralFrame[i];
136 return (
float)currentMaxIndex * (float)m_samplingFrequency / (
float)m_spectralFrameSize;
142 return m_melFrequencySpectrum.calculateMelSpectrum(m_spectralFrame);
149 auto melSpec = m_melFrequencySpectrum.calculateMelSpectrum(m_spectralFrame);
152 for (
auto& value : melSpec)
153 value = std::logf(std::max(value, 1e-5f));
155 return m_dct.calculateDCT(melSpec);
161 jassert(m_samplingFrequency > -1);
163 float weightedSum = 0;
166 for (
int i = 0; i < m_spectralFrame.size(); i++)
168 float centreFrequency = m_freqVector[i];
170 weightedSum += centreFrequency * m_spectralFrame[i];
172 sum += m_spectralFrame[i];
181 return weightedSum / sum;
190 const float eps = 2.2204e-16f;
192 for (
int i = 0; i < m_spectralFrame.size(); i++)
196 float sample = m_spectralFrame[i] + eps;
198 logSum += logf(sample);
202 logSum = logSum / (float)m_spectralFrame.size();
203 sum = sum / (float)m_spectralFrame.size();
205 logSum = expf(logSum);
213 return logSum / (sum + eps);
220 jassert(m_samplingFrequency > -1);
222 float resolution = (float)m_samplingFrequency / (
float)m_spectralFrameSize;
223 float centroid = getSpectralCentroid();
226 float magnitudeSum = 0;
228 for (
int i = 0; i < m_spectralFrame.size(); i++)
230 float centreFrequency = resolution * (float)i;
231 float deviation = centreFrequency - centroid;
232 sum += deviation * deviation * m_spectralFrame[i];
234 magnitudeSum += m_spectralFrame[i];
237 if (magnitudeSum == 0.0)
243 float spread = std::sqrt(sum / magnitudeSum);
252 jassert(m_samplingFrequency > -1);
254 float resolution = (float)m_samplingFrequency / (
float)m_spectralFrameSize;
261 for (
int i = 0; i < m_spectralFrame.size(); i++)
263 float centreFrequency = resolution * (float)i;
264 float magnitude = m_spectralFrame[i];
266 sumXY += centreFrequency * magnitude;
267 sumX += centreFrequency;
269 sumX2 += centreFrequency * centreFrequency;
272 float n = (float)m_spectralFrame.size();
273 float slope = (n * sumXY - sumX * sumY) / ((n * sumX2 - sumX * sumX) * sumY);
282 float spectralSum = 0;
284 for (
int i = 0; i < m_spectralFrameSize; i++)
286 spectralSum += m_spectralFrame[i];
290 float rolloffThreshold = spectralSum * 0.85f;
293 float rolloffIndex = 0;
298 for (
int i = 0; i < m_spectralFrameSize; i++)
301 spectralSum += m_spectralFrame[i];
304 if (spectralSum > rolloffThreshold)
307 rolloffIndex = (float)i;
314 float spectralRolloff = rolloffIndex / (float)m_spectralFrameSize;
316 return spectralRolloff;
324 for (
int i = 0; i < m_spectralFrameSize; i++)
326 float difference = fabs(m_spectralFrame[i] - m_prevMagSpecSpectralFlux[i]);
330 m_prevMagSpecSpectralFlux[i] = m_spectralFrame[i];
341 for (
int i = 0; i < m_spectralFrameSize; ++i)
343 float amplitude = m_spectralFrame[i];
344 energy += amplitude * amplitude;
355 for (
int i = 0; i < m_spectralFrameSize; i++)
357 sum += (m_spectralFrame[i] * (float)i);
407 float denominatorSum = 0;
408 float numeratorSum = 0;
410 for (
int i = 0; i < m_spectralFrameSize; i++)
413 numeratorSum += powf(k,
static_cast<float>(n)) * m_spectralFrame[i];
415 denominatorSum += m_spectralFrame[i];
418 if (denominatorSum == 0)
424 return numeratorSum / denominatorSum;
431 float u1 = calculateSpectralMoment(1);
432 float u2 = calculateSpectralMoment(2);
433 float u3 = calculateSpectralMoment(3);
434 float u4 = calculateSpectralMoment(4);
436 float spread = sqrt(u2 - u1 * u1);
438 float x = -3 * powf(u1, 4) + 6 * u1 * u2 + 4 * u1 * u3 + u4;
439 float y = powf(spread, 4);
449 kurtosis = (x / y) - 3;
int getNumberOfMelFrequencyCepstralCoefficients()
Definition FrequencyDomainAnalysisFramework.cpp:72
float getHighFreqencyContentOnsetDectionFunction()
Definition FrequencyDomainAnalysisFramework.cpp:351
float getSpectralFlux()
Definition FrequencyDomainAnalysisFramework.cpp:320
void setNumberOfMelFrequencyCepstralCoefficients(int numCoeffs)
Definition FrequencyDomainAnalysisFramework.cpp:42
void setSamplingFrequency(int fs)
Definition FrequencyDomainAnalysisFramework.cpp:22
float getSpectralFlatness()
Definition FrequencyDomainAnalysisFramework.cpp:186
float getSpectralKurtosis()
Definition FrequencyDomainAnalysisFramework.cpp:429
std::vector< float > getMelSpectrum()
Definition FrequencyDomainAnalysisFramework.cpp:140
void setNumberOfMelFrequencyCoefficients(int numCoeffs)
Definition FrequencyDomainAnalysisFramework.cpp:32
int getSamplingFrequency()
Definition FrequencyDomainAnalysisFramework.cpp:65
float calculateSpectralMoment(int n)
Definition FrequencyDomainAnalysisFramework.cpp:405
float getSpectralRolloff()
Definition FrequencyDomainAnalysisFramework.cpp:279
FrequencyDomainAnalysisFramework(int analysisFrameSize, int sampleRate)
Definition FrequencyDomainAnalysisFramework.cpp:13
void setFrequencyVector(const std::vector< float > &freqVector)
Definition FrequencyDomainAnalysisFramework.cpp:52
float getSpectralSlope()
Definition FrequencyDomainAnalysisFramework.cpp:250
std::vector< float > getMFCC()
Definition FrequencyDomainAnalysisFramework.cpp:146
void initialiseSpectralAnalysisAlgorithms()
Definition FrequencyDomainAnalysisFramework.cpp:78
float getSpectralCentroid()
Definition FrequencyDomainAnalysisFramework.cpp:159
float getFreqOfLoudestPartial()
Definition FrequencyDomainAnalysisFramework.cpp:121
void setSpectralFrame(std::vector< float > spectralFrame)
Definition FrequencyDomainAnalysisFramework.cpp:115
float getFrameEnergy()
Definition FrequencyDomainAnalysisFramework.cpp:337
float getSpectralSpread()
Definition FrequencyDomainAnalysisFramework.cpp:218
bool isPositivePowerOfTwo(int x)
Definition Utilities.h:14