// Copyright (C) 1999 Jean-Marc Valin #include "BufferedNode.h" #include "Buffer.h" #include "Vector.h" #include #include "FFTWrap.h" #ifdef HAVE_FLOAT_H #include #endif using namespace std; namespace FD { class MFCC; DECLARE_NODE(MFCC) /*Node * * @name MFCC * @category ZDeprecated * @description Calculates MFCC coefficients from an audio frame (all in one) * * @input_name INPUT * @input_description No description available * * @output_name OUTPUT * @output_description No description available * * @parameter_name INPUTLENGTH * @parameter_description No description available * * @parameter_name OUTPUTLENGTH * @parameter_description No description available * * @parameter_name WINDOW * @parameter_description No description available * * @parameter_name SAMPLING * @parameter_description No description available * * @parameter_name LOW * @parameter_description No description available * * @parameter_name HIGH * @parameter_description No description available * END*/ class MFCC : public BufferedNode { int inputID; int outputID; int inputLength; int outputLength; vector > filters; vector filterStart; vector window; int psLength; int melLength; float *inputCopy; float *outputCopy; float *tmpBuffer1; float *tmpBuffer2; float *rNormalize; float *iNormalize; public: MFCC(string nodeName, ParameterSet params) : BufferedNode(nodeName, params) { try { inputID = addInput("INPUT"); outputID = addOutput("OUTPUT"); inputLength = dereference_cast (parameters.get("INPUTLENGTH")); outputLength = dereference_cast (parameters.get("OUTPUTLENGTH")); psLength = inputLength/2; melLength = outputLength; filters.resize(outputLength); filterStart.resize(outputLength); window.resize(inputLength); } catch (BaseException *e) { throw e->add(new NodeException (NULL, "Exception caught in MFCC constructor", __FILE__, __LINE__)); } } ~MFCC() { delete [] inputCopy; delete [] outputCopy; delete [] rNormalize; delete [] iNormalize; delete [] tmpBuffer1; delete [] tmpBuffer2; } virtual void initialize() { int i; this->BufferedNode::initialize(); String type = object_cast (parameters.get("WINDOW")); if (type == "HANNING") { for (i=0;i (parameters.get("SAMPLING")) / 2.0; float high = dereference_cast (parameters.get("HIGH")); float low = dereference_cast (parameters.get("LOW")); float highMel = 1000*log(1+high/700)/log(1+1000.0/700); float lowMel = 1000*log(1+low/700)/log(1+1000.0/700); vector centers(melLength+2); for (i=0;i &in = object_cast > (inputValue); if (in.size() != inputLength) throw new NodeException(this, "Size of input != size of window", __FILE__, __LINE__); Vector &output = *Vector::alloc(outputLength); out[count] = &output; int i,j; for (i=0;i=0 ; i-=2, j++) inputCopy[j]=log(tmpBuffer1[i]+FLT_MIN); FFTWrap.rfft(inputCopy, outputCopy, melLength); for (i=1;i