// Copyright (C) 1999 Jean-Marc Valin #include "BufferedNode.h" #include "Vector.h" using namespace std; namespace FD { class GCMS; DECLARE_NODE(GCMS) /*Node * * @name GCMS * @category DSP:TimeFreq * @description Growing-Window Cepstral Mean Subtraction * * @input_name INPUT * @input_type Vector * @input_description Input frames * * @output_name OUTPUT * @output_type Vector * @output_description CMS output * * @parameter_name LENGTH * @parameter_type int * @parameter_description Frame lentgh (features) * END*/ class GCMS : public BufferedNode { protected: /**Length of input frames*/ int length; /** inputID*/ int inputID; /** outputID */ int outputID; /** sum for the running average */ vector sum; /** number of frames accumulated */ int accumCount; public: GCMS(string nodeName, const ParameterSet ¶ms) : BufferedNode(nodeName, params) , accumCount(0) { outputID = addOutput ("OUTPUT"); inputID = addInput("INPUT"); length = dereference_cast (parameters.get("LENGTH")); sum.resize(length); inOrder = true; } void initialize() { //cerr << "GCMS initialize...\n"; BufferedNode::initialize(); for (int i=0;i &cms = object_cast > (out[count]); Vector &output = *Vector::alloc(length); out[count] = &output; Vector &in = object_cast > (inputValue); accumCount++; float inv_accum=1.0/accumCount; for (i=0;i