// Copyright (C) 1999 Jean-Marc Valin #include "BufferedNode.h" #include "Buffer.h" #include "Vector.h" #include "vec.h" #ifdef HAVE_VALUES_H #include #endif #ifdef HAVE_FLOAT_H #include #endif using namespace std; namespace FD { class TimeEntropy; DECLARE_NODE(TimeEntropy) /*Node * * @name TimeEntropy * @category DSP:Misc * @description Non-stationnarity (pseudo-entropy) measure across vectors (frames) * * @input_name INPUT * @input_type Vector * @input_description Input vectors (frames) * * @output_name OUTPUT * @output_type Vector * @output_description Value of the non-stationnarity measure (as a vector of 1 component) * * @parameter_name LOOKAHEAD * @parameter_type int * @parameter_description Maximum forward (non-causal) delay * * @parameter_name LOOKBACK * @parameter_type int * @parameter_description Maximum backward (causal) delay * END*/ class TimeEntropy : public BufferedNode { int inputID; int outputID; int numberFrames; vector *> frames; vector min; public: TimeEntropy(string nodeName, ParameterSet params) : BufferedNode(nodeName, params) { inputID = addInput("INPUT"); outputID = addOutput("OUTPUT"); inputsCache[inputID].lookAhead = dereference_cast (parameters.get("LOOKAHEAD")); inputsCache[inputID].lookBack = dereference_cast (parameters.get("LOOKBACK")); numberFrames=inputsCache[inputID].lookBack+inputsCache[inputID].lookAhead+1; frames.resize(numberFrames); min.resize(numberFrames); } static inline float dist (float *in1, float *in2, int length) { int i; float sum=0; for (i=0;i &output = *Vector::alloc(1); out[count] = &output; if (count < inputsCache[inputID].lookBack) { output[0]=0.0; return; } NodeInput input = inputs[inputID]; int i, j; int inputLength; for (i = -inputsCache[inputID].lookBack, j=0; i <= inputsCache[inputID].lookAhead ; i++, j++) { //RCPtr > inputValue = input.node->getOutput(input.outputID, count + i); ObjectRef inputValue = input.node->getOutput(input.outputID, count + i); //frames[j] = inputValue.get(); frames[j] = object_ptr_cast *> (inputValue); inputLength = frames[j]->size(); } //cerr << numberFrames << " " << (*(frames[0]))[0] << " " ; for (i=0;i