bool MF0UA::initialise(size_t channels, size_t stepSize, size_t blockSize) { if (channels < getMinChannelCount() || channels > getMaxChannelCount()) return false; // Real initialisation work goes here! m_stepSize = stepSize; m_blockSize = blockSize; // Initialize spectruminfo initializeSpectrumInfo(); // Memory allocation for window window = (double*) malloc(sizeof(double)*(spectruminfo.winsize)); // Creation of the Hanning window Hanning(window,spectruminfo.N); // Bands generation (Only when the algorithm is onset-based) if (algorithm==2) { generatebands(spectruminfo.first_band_freq, spectruminfo.samplerate/2, spectralbands, spectruminfo.freq_resolution); spectruminfo.numbands=spectralbands.size(); // Do not compute differences for the first frame resolutiondiff=(getPreferredBlockSize()/2)/getPreferredStepSize(); } // This is the first frame firstframe=true; n_time=0; return true; }
bool IPLFFT::processInputData(IPLImage* image , int, bool) { // delete previous result delete _result; _result = NULL; int width = image->width(); int height = image->height(); int cWidth = IPLComplexImage::nextPowerOf2(width); int cHeight = IPLComplexImage::nextPowerOf2(height); int size = cHeight = cWidth = (cWidth>cHeight)? cWidth : cHeight; _result = new IPLComplexImage(cWidth, cHeight); // get properties int mode = getProcessPropertyInt("mode"); int progress = 0; int maxProgress = image->height() * image->getNumberOfPlanes(); // image center int dx = ( cWidth - width )/2; int dy = ( cHeight - height )/2; IPLImagePlane* plane = image->plane(0); for(int y=0; y<height; y++) { // progress notifyProgressEventHandler(100*progress++/maxProgress); for(int x=0; x<width; x++) { _result->c(x+dx, y+dy) = Complex(plane->p(x,y), 0.0); } } // windowing function switch(mode) { case 0: // rectangular break; case 1: // Hanning for( int y=0; y<size; y++ ) for( int x=0; x<size; x++ ) _result->c(x,y) *= Hanning(x, size) * Hanning(y, size); break; case 2: // Hamming for( int y=0; y<size; y++ ) for( int x=0; x<size; x++ ) _result->c(x,y) *= Hamming(x, size) * Hamming(y, size); break; case 3: // Blackman for( int y=0; y<size; y++ ) for( int x=0; x<size; x++ ) _result->c(x,y) *= Blackman(x, size) * Blackman(y, size); break; case 4: // Border only int border = size / 32; for( int y=0; y<border; y++ ) for( int x=0; x<size; x++ ) { double factor = (0.54 - 0.46 * cos( 2.0 * PI * y / border / 2.0 )); _result->c(x,y) *= factor; _result->c(x,size-y-1) *= factor; } for( int x=0; x<border; x++ ) for( int y=0; y<size; y++ ) { double factor = (0.54 - 0.46 * cos( 2.0 * PI * x / border / 2.0 )); _result->c(x,y) *= factor; _result->c(size-x-1,y) *= factor; } break; } _result->FFT(); return true; }