56 assert(magnitudeSpectrum.size() == m_magnitudeSpectrumSize);
58 std::vector<float> melSpectrum;
60 for (
int m = 0; m < m_numCoefficients; m++)
64 for (
int k = 0; k < magnitudeSpectrum.size(); k++)
66 melValue += (magnitudeSpectrum[k] * magnitudeSpectrum[k]) * m_melFilterBank[m][k];
69 melSpectrum.push_back(melValue);
79 float highFreq = ((float)m_samplingFrequency) / 2.f;
81 float lowMelFrequency = m_hertzToMel(lowFreq);
82 float highMelFrequency = m_hertzToMel(highFreq);
84 m_melFilterBank.resize(m_magnitudeSpectrumSize);
86 for (
int i = 0; i < m_numCoefficients; i++)
88 m_melFilterBank[i].resize(m_magnitudeSpectrumSize);
90 for (
auto& mel : m_melFilterBank)
94 FloatVectorOperations::fill(&mel[0], 0.f, mel.size());
99 std::vector<float> melPoints;
101 float melRange = highMelFrequency - lowMelFrequency;
103 float stepSize = melRange / ((float)m_numCoefficients + 1);
105 melPoints.push_back(lowMelFrequency);
106 for (
int i = 0; i < m_numCoefficients; i++)
108 melPoints.push_back(lowMelFrequency + ((i + 1) * stepSize));
110 melPoints.push_back(highMelFrequency);
112 std::vector<int> melFilterBins;
114 for (
int i = 0; i < melPoints.size(); i++)
116 float h = m_melToHertz(melPoints[i]);
118 int k =
static_cast<int>(((float)m_fftSize) * (h / ((float)m_samplingFrequency)));
120 melFilterBins.push_back(k);
123 for (
int m = 0; m < m_numCoefficients; m++)
131 assert(melFilterBins[m] < melFilterBins[m + 1]);
133 for (
int k = 0; k < m_magnitudeSpectrumSize; k++)
135 if ((k >= melFilterBins[m]) && (k <= melFilterBins[m + 1]))
137 float t1 = (float)(k - melFilterBins[m]);
138 float t2 = (float)(melFilterBins[m + 1] - melFilterBins[m]);
140 m_melFilterBank[m][k] = t1 / t2;
142 else if ((k >= melFilterBins[m + 1]) && (k <= melFilterBins[m + 2]))
144 float t1 = (float)(melFilterBins[m + 2] - k);
145 float t2 = (float)(melFilterBins[m + 2] - melFilterBins[m + 1]);
147 m_melFilterBank[m][k] = t1 / t2;
151 m_melFilterBank[m][k] = 0.0;