void MedianSeparator::convertToSpectrogram() { // create STFT object to perform FFT ScopedPointer<STFT> stft = new STFT(WINDOW_SIZE); stft->initWindow(1); // initialise hann window // 2d array to hold pointer to sample data float* bufferData[2]; // 2d array of complex floats to hold complex spectrogram data after fft std::complex<float>* spectrogramData[2]; for (int i = 0; i < 2; i++) { // initialise structures to hold audio data in different forms bufferData[i] = new float[WINDOW_SIZE]; spectrogram[i] = MatrixXcf::Zero((WINDOW_SIZE / 2) + 1, numCols); // holds entire spectrogram spectrogramData[i] = new std::complex<float>[(WINDOW_SIZE/2) + 1]; } // loop through each column of spectrogram for (int column = 0; column < numCols; column++) { // for each channel for (int i = 0; i < numChannels; i++) { // get pointer to sample data bufferData[i] = (float*)samples.getReadPointer(i, startSample); // perform FFT float* fftData = stft->performForwardTransform(bufferData[i]); // convert from real to complex spectum data spectrogramData[i] = stft->realToComplex(fftData, WINDOW_SIZE); // fill column in spectrogram with complex data from FFT for (int sample = 0; sample < 2049; sample++) { spectrogram[i](sample, column) = spectrogramData[i][sample]; } } // increment beginning sample by HOP_SIZE (1024) startSample += HOP_SIZE; } }