// Copyright (C) 1999 Jean-Marc Valin #include "BufferedNode.h" #include "Buffer.h" #include "Vector.h" #include #include "window.h" #include "mdct.h" using namespace std; namespace FD { class MDCT; DECLARE_NODE(MDCT) /*Node * * @name MDCT * @category DSP:TimeFreq * @require MDCT * @description MDCT implementation (taken from Vorbis) * * @input_name INPUT * @input_type Vector * @input_description Input frame * * @output_name OUTPUT * @output_type Vector * @output_description MDCT result * * @parameter_name LENGTH * @parameter_type int * @parameter_description Frame (not window) size * END*/ class MDCT : public BufferedNode { int inputID; int outputID; int length; vector buffer; vector pcm; double *window; mdct_lookup m_look; public: MDCT(string nodeName, ParameterSet params) : BufferedNode(nodeName, params) , window(NULL) { inputID = addInput("INPUT"); outputID = addOutput("OUTPUT"); length = dereference_cast (parameters.get("LENGTH")); buffer.resize(length*2); pcm.resize(length*2); for (int i=0;iBufferedNode::initialize(); } void calculate(int output_id, int count, Buffer &out) { ObjectRef inputValue = getInput(inputID, count); const Vector &in = object_cast > (inputValue); out[count] = Vector::alloc(length); Vector &output = object_cast > (out[count]); for (int i=0;i