示例#1
0
文件: FFT.cpp 项目: BryanBo-Cao/grt
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;
}
示例#2
0
文件: FFT.cpp 项目: BryanBo-Cao/grt
bool FFT::setFFTWindowFunction(UINT fftWindowFunction){
    if( validateFFTWindowFunction( fftWindowFunction ) ){
        this->fftWindowFunction = fftWindowFunction;
        return true;
    }
    return false;
}
示例#3
0
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;
}