31 "key",
"MelFilterBank",
32 "category",
"Analysis",
33 "description",
"MelFilterBank",
36 static FactoryRegistrator<ProcessingFactory, MelFilterBank>
reg =
metadata;
46 SetSpectralRange(22050);
52 : mIn(
"Spectrum", this)
53 , mOut(
"Mel Spectrum", this)
59 : mIn(
"Spectrum", this)
60 , mOut(
"Mel Spectrum", this)
73 bool ok =
Do(spectrum,melSpectrum);
83 const DataArray& specMag = spec.GetMagBuffer();
86 "Spectrum doesn't have the expected size!" );
87 CLAM_ASSERT( spec.GetSpectralRange() == mConfig.GetSpectralRange(),
88 "Spectrum doesn't have the expected frequency range!" );
90 "Spectrum is not in linear scale!" );
92 const TSize numBands = mConfig.GetNumBands();
94 melSpec.SetNumBands(numBands);
95 melSpec.SetLowCutoff(mConfig.GetLowCutoff());
96 melSpec.SetHighCutoff(mConfig.GetHighCutoff());
97 melSpec.SetSpectralRange(spec.GetSpectralRange());
99 DataArray& melCoeffs = melSpec.GetCoefficients();
101 if ( melCoeffs.
Size() != numBands ) {
102 melCoeffs.
Resize( numBands );
105 for(
int i = 0; i < numBands; i++)
108 const bool usePower = mConfig.GetUsePower();
110 for (
TIndex i=mLowIdx; i<=mHighIdx; i++) {
113 TData mag = specMag[i];
114 if (usePower) mag *=mag;
117 TIndex bandIdx = mMelBand[i];
120 TData weightedMag = mFilterWeights[i] * mag;
124 melCoeffs[bandIdx] += weightedMag;
127 if ((bandIdx+1) < numBands) {
128 melCoeffs[bandIdx+1] += mag - weightedMag;
150 return 1127.0*log(1.0 + linFreq/700.0);
157 const TData lowCutoff = mConfig.GetLowCutoff();
158 const TData highCutoff = mConfig.GetHighCutoff();
161 const TData melLowCutoff =
Mel(lowCutoff);
162 const TData melHighCutoff =
Mel(highCutoff);
163 const TData melFreqRange = melHighCutoff - melLowCutoff;
166 const TSize specSize = mConfig.GetSpectrumSize();
167 const TData specRange = mConfig.GetSpectralRange();
169 const TData deltaFreq = specRange/specSize;
174 mLowIdx = (
TIndex)(lowCutoff/deltaFreq + 1.5);
177 if (mLowIdx < 1) mLowIdx = 1;
181 mHighIdx = (
TIndex)(highCutoff/deltaFreq - 0.5);
183 if (mHighIdx >= specSize) mHighIdx = specSize-1;
187 const TSize maxBands = mConfig.GetNumBands() + 1;
191 for (
TIndex i=0; i<maxBands; i++) {
192 centreFreq[i] = ((i+1)/(
TData)maxBands)*melFreqRange + melLowCutoff;
197 mMelBand.
Resize( specSize );
202 for (
TIndex i=0; i<specSize; i++) {
204 if (i<mLowIdx || i>mHighIdx) {
217 while (centreFreq[bandIdx]<melFreq && bandIdx<maxBands) bandIdx++;
218 mMelBand[i] = bandIdx-1;
225 mFilterWeights.
Resize( specSize );
226 mFilterWeights.
SetSize( specSize );
228 for (
TIndex i=0; i<specSize; i++) {
229 bandIdx = mMelBand[i];
231 if (i<mLowIdx || i>mHighIdx) {
232 mFilterWeights[i] = 0.0;
236 mFilterWeights[i] = (centreFreq[bandIdx+1] -
Mel((
TData)i*deltaFreq))
237 / (centreFreq[bandIdx+1] - centreFreq[bandIdx]);
240 mFilterWeights[i] = (centreFreq[0] -
Mel((
TData)i*deltaFreq))
241 / (centreFreq[0] - melLowCutoff);
248 delete [] centreFreq;