// Copyright (C) 1999 Jean-Marc Valin #include "BufferedNode.h" #include "Buffer.h" #include "Vector.h" #include using namespace std; namespace FD { class TimeMedian; DECLARE_NODE(TimeMedian) /*Node * * @name TimeMedian * @category DSP:Filter * @description Performs median filtering across vectors (frames) * * @input_name INPUT * @input_type Vector * @input_description Input vectors (frames) * * @output_name OUTPUT * @output_type Vector * @output_description Median-filtered vectors * * @parameter_name LENGTH * @parameter_type int * @parameter_description Vector size * * @parameter_name LOOKAHEAD * @parameter_type int * @parameter_description Median look back (number of frames) * * @parameter_name LOOKBACK * @parameter_type int * @parameter_description Median look ahead (number of frames) * END*/ class TimeMedian : public BufferedNode { int inputID; int outputID; int length; int lookBack; int lookAhead; vector > data; public: TimeMedian(string nodeName, ParameterSet params) : BufferedNode(nodeName, params) { inputID = addInput("INPUT"); outputID = addOutput("OUTPUT"); length = dereference_cast (parameters.get("LENGTH")); lookBack = dereference_cast (parameters.get("LOOKBACK")); inputsCache[inputID].lookBack = lookBack; lookAhead = dereference_cast (parameters.get("LOOKAHEAD")); inputsCache[inputID].lookAhead = lookAhead; data.resize(length); for (int i = 0;i &output = *Vector::alloc(length); out[count] = &output; NodeInput input = inputs[inputID]; int i,j; for (j=0;jgetOutput(input.outputID, count + i); const Vector &in = object_cast > (inputValue); for (int i=0;i>1]; else output[i] = .5*(data[i][(nbValid>>1)-1]+data[i][nbValid>>1]); } } NO_ORDER_NODE_SPEEDUP(TimeMedian) }; }//namespace FD