// Copyright (C) 1999 Jean-Marc Valin #include "BufferedNode.h" #include "Buffer.h" #include "Vector.h" #include using namespace std; namespace FD { class Mel; DECLARE_NODE(Mel) /*Node * * @name Mel * @category DSP:TimeFreq * @description calculates Mel-scale channel energies from power-spectrum * * @input_name INPUT * @input_type Vector * @input_description Input power-spectrum * * @output_name OUTPUT * @output_type Vector * @output_description Mel-scale channel energies * * @parameter_name INPUTLENGTH * @parameter_type int * @parameter_description Power-spectrum size * * @parameter_name OUTPUTLENGTH * @parameter_type int * @parameter_description Number of channel energies * * @parameter_name SAMPLING * @parameter_type int * @parameter_description Sampling rate used (used for power-spectrum range) * * @parameter_name LOW * @parameter_type int * @parameter_description Lowest frequency * * @parameter_name HIGH * @parameter_type int * @parameter_description Highest frequency * END*/ class Mel : public BufferedNode { int inputID; int outputID; int inputLength; int outputLength; vector > filters; vector filterStart; public: Mel(string nodeName, ParameterSet params) : BufferedNode(nodeName, params) { inputID = addInput("INPUT"); outputID = addOutput("OUTPUT"); inputLength = dereference_cast (parameters.get("INPUTLENGTH")); outputLength = dereference_cast (parameters.get("OUTPUTLENGTH")); filters.resize(outputLength); filterStart.resize(outputLength); } virtual void initialize() { this->BufferedNode::initialize(); float niquist = dereference_cast (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(outputLength+2); int i; for (i=0;i &in = object_cast > (inputValue); if (in.size() != inputLength) throw new NodeException(this, "Input size mismatch", __FILE__, __LINE__); Vector &output = *Vector::alloc(outputLength); out[count] = &output; int i; int nbFilters = filters.size(); for (i = 0 ; i < nbFilters ; i++) { int j; output[i]=0; int filterSize = filters[i].size(); int filtStart = filterStart[i]; for (j=0;j