bool FFT::init(UINT fftWindowSize,UINT hopSize,UINT numDimensions,UINT fftWindowFunction,bool computeMagnitude,bool computePhase,DataType inputType,DataType outputType){ //Clear any previous setup clear(); if( !isPowerOfTwo(fftWindowSize) ){ errorLog << "init(UINT fftWindowSize,UINT hopSize,UINT numDimensions,UINT fftWindowFunction,bool computeMagnitude,bool computePhase) - fftWindowSize is not a power of two!" << std::endl; return false; } if( !validateFFTWindowFunction( fftWindowFunction ) ){ errorLog << "init(UINT fftWindowSize,UINT hopSize,UINT numDimensions,UINT fftWindowFunction,bool computeMagnitude,bool computePhase) - Unkown Window Function!" << std::endl; return false; } this->dataBufferSize = fftWindowSize; this->fftWindowSize = fftWindowSize; this->hopSize = hopSize; this->fftWindowFunction = fftWindowFunction; this->computeMagnitude = computeMagnitude; this->computePhase = computePhase; this->inputType = inputType; this->outputType = outputType; hopCounter = 0; featureDataReady = false; numInputDimensions = numDimensions; //Set the output size, the fftWindowSize is divided by 2 because the FFT is symmetrical so only half the actual FFT is returned numOutputDimensions = 0; if( computePhase ) numOutputDimensions += fftWindowSize/2 * numInputDimensions; if( computeMagnitude ) numOutputDimensions += fftWindowSize/2 * numInputDimensions; //Resize the output feature vector featureVector.resize( numOutputDimensions, 0); dataBuffer.resize( dataBufferSize ); tempBuffer.resize( dataBufferSize ); for(UINT i=0; i<dataBufferSize; i++){ dataBuffer[i].resize( numInputDimensions, 0 ); } for(UINT i=0; i<dataBufferSize; i++){ dataBuffer[i].resize( numInputDimensions, 0 ); } //Setup the fft for each dimension fft.resize(numInputDimensions); for(unsigned int i=0; i<numInputDimensions; i++){ if( !fft[i].init(fftWindowSize,fftWindowFunction,computeMagnitude,computePhase) ){ errorLog << "init(UINT fftWindowSize,UINT hopSize,UINT numDimensions,UINT fftWindowFunction,bool computeMagnitude,bool computePhase) - Failed to initialize fft!" << std::endl; clear(); return false; } } initialized = true; return true; }
bool FFT::setFFTWindowFunction(UINT fftWindowFunction){ if( validateFFTWindowFunction( fftWindowFunction ) ){ this->fftWindowFunction = fftWindowFunction; return true; } return false; }
bool FFT::init(UINT fftWindowSize,UINT hopSize,UINT numDimensions,UINT fftWindowFunction,bool computeMagnitude,bool computePhase){ initialized = false; if( !isPowerOfTwo(fftWindowSize) ){ errorLog << "init(UINT fftWindowSize,UINT hopSize,UINT numDimensions,UINT fftWindowFunction,bool computeMagnitude,bool computePhase) - fftWindowSize is not a power of two!" << endl; return false; } if( !validateFFTWindowFunction( fftWindowFunction ) ){ errorLog << "init(UINT fftWindowSize,UINT hopSize,UINT numDimensions,UINT fftWindowFunction,bool computeMagnitude,bool computePhase) - Unkown Window Function!" << endl; return false; } if( tempBuffer != NULL ){ delete[] tempBuffer; tempBuffer = NULL; } this->dataBufferSize = fftWindowSize; this->fftWindowSize = fftWindowSize; this->hopSize = hopSize; this->fftWindowFunction = fftWindowFunction; this->computeMagnitude = computeMagnitude; this->computePhase = computePhase; hopCounter = 0; featureDataReady = false; tempBuffer = new double[ dataBufferSize ]; numInputDimensions = numDimensions; //Set the output size, the fftWindowSize is divided by 2 because the FFT is symmetrical so only half the actual FFT is returned numOutputDimensions = 0; if( computePhase ) numOutputDimensions += fftWindowSize/2 * numDimensions; if( computeMagnitude ) numOutputDimensions += fftWindowSize/2 * numDimensions; //Resize the output feature vector featureVector.clear(); featureVector.resize( numOutputDimensions, 0); dataBuffer.clear(); dataBuffer.resize(dataBufferSize,vector< double >(numDimensions,0)); fft.clear(); fft.resize(numDimensions); for(unsigned int i=0; i<numDimensions; i++){ if( !fft[i].init(fftWindowSize,fftWindowFunction,computeMagnitude,computePhase) ){ errorLog << "init(UINT fftWindowSize,UINT hopSize,UINT numDimensions,UINT fftWindowFunction,bool computeMagnitude,bool computePhase) - Failed to initialize fft!" << endl; return false; } } initialized = true; return true; }