// Copyright (C) 1999 Jean-Marc Valin #include "BufferedNode.h" #include "Buffer.h" #include "Vector.h" #include #include using namespace std; namespace FD { class ILTF; DECLARE_NODE(ILTF) /*Node * * @name ILTF * @category DSP:Filter * @description Inverse (all-pole) long-term (comb) filter * * @input_name INPUT * @input_type Vector * @input_description Input frame * * @input_name FILTER * @input_type Vector * @input_description Filter params as [gain, period] * * @output_name OUTPUT * @output_type Vector * @output_description Filtered signal * END*/ class ILTF : public BufferedNode { int inputID; int outputID; int filterID; int noncausal; bool continuous; public: ILTF(string nodeName, ParameterSet params) : BufferedNode(nodeName, params) { inputID = addInput("INPUT"); filterID = addInput("FILTER"); outputID = addOutput("OUTPUT"); } virtual void initialize() { outputs[outputID].lookBack += 1; this->BufferedNode::initialize(); } void calculate(int output_id, int count, Buffer &out) { ObjectRef inputValue = getInput(inputID, count); ObjectRef filterValue = getInput(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 = this->getOutput(outputID, 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