32 "key",
"CepstralTransform",
33 "category",
"Analysis",
34 "description",
"CepstralTransform",
37 static FactoryRegistrator<ProcessingFactory, CepstralTransform>
reg =
metadata;
44 SetNumMelCoefficients(20);
45 SetNumCepstrumCoefficients(20);
50 : mIn(
"Mel Spectrum", this)
51 , mOut(
"Mel Cepstrum", this)
57 : mIn(
"Mel Spectrum", this)
58 , mOut(
"Mel Cepstrum", this)
67 mLogBuffer.
Resize(mConfig.GetNumMelCoefficients());
68 mLogBuffer.
SetSize(mConfig.GetNumMelCoefficients());
77 bool ok =
Do(spectrum, cepstrum);
92 const DataArray& melCoeffs = melSpec.GetCoefficients();
93 DataArray& cepstrumCoeffs = melCeps.GetCoefficients();
94 const TSize numMelCoefficients = melCoeffs.
Size();
95 const TSize numCepstrumCoeffs = mConfig.GetNumCepstrumCoefficients();
97 if ( cepstrumCoeffs.
Size() < numCepstrumCoeffs )
99 cepstrumCoeffs.
Resize(numCepstrumCoeffs);
100 cepstrumCoeffs.
SetSize(numCepstrumCoeffs);
103 melCeps.SetCenterTime(melSpec.GetCenterTime());
104 melCeps.SetLowCutoff(melSpec.GetLowCutoff());
105 melCeps.SetHighCutoff(melSpec.GetHighCutoff());
109 const TData melFloor = 1.0;
110 const bool useBase10 = mConfig.GetUseBase10();
112 if ( mLogBuffer.
Size()!=numMelCoefficients)
115 mLogBuffer.
Resize(numMelCoefficients);
116 mLogBuffer.
SetSize(numMelCoefficients);
118 for (
TIndex i=0; i<numMelCoefficients; i++) {
119 if (melCoeffs[i] < melFloor)
120 mLogBuffer[i] = useBase10 ? log10(melFloor) : log(melFloor);
122 mLogBuffer[i] = useBase10 ? log10(melCoeffs[i]) : log(melCoeffs[i]);
127 const TData scale = sqrt(2.0/(
TData)numMelCoefficients);
131 for (
TIndex i=1; i<numCepstrumCoeffs; i++)
134 cepstrumCoeffs[i] = 0.0;
135 for (
TIndex j=0; j<numMelCoefficients; j++)
136 cepstrumCoeffs[i] += mLogBuffer[j] * cos(freq*(j+1 - 0.5));
137 cepstrumCoeffs[i] *= scale;
141 for (
TIndex j=0; j<numMelCoefficients; j++)
142 cepstrumCoeffs[0] += mLogBuffer[j];
143 cepstrumCoeffs[0] *= scale;