// Copyright (C) 1999 Jean-Marc Valin #include "BufferedNode.h" #include "Buffer.h" #include "Vector.h" #include #include using namespace std; namespace FD { class LTF; DECLARE_NODE(LTF) /*Node * * @name LTF * @category DSP:Filter * @description Long-term (comb) filter * * @input_name INPUT * @input_description No description available * * @input_name FILTER * @input_description No description available * * @output_name OUTPUT * @output_description No description available * END*/ class LTF : public BufferedNode { int inputID; int filterID; int outputID; int noncausal; bool continuous; public: LTF(string nodeName, ParameterSet params) : BufferedNode(nodeName, params) { inputID = addInput("INPUT"); filterID = addInput("FILTER"); outputID = addOutput("OUTPUT"); inputsCache[inputID].lookBack=1; } void calculate(int output_id, int count, Buffer &out) { ObjectRef inputValue = getInput(inputID, count); ObjectRef filterValue = getOutput(filterID, count); const Vector &in = object_cast > (inputValue); int length = in.size(); const Vector &filter = object_cast > (filterValue); const Vector *past; bool can_look_back = false; out[count] = Vector::alloc(length); Vector &output = object_cast > (out[count]); if (count > 0) { ObjectRef pastInputValue = getInput(inputID, count-1); can_look_back=true; past = &object_cast > (pastInputValue); } //int size = filter.size(); int delay = int(floor(.5+filter[1])); //filter[0]=1; for (int i=0;i