FFT spectrogram using ofxMaximilian not showing bass frequencies

Hi, I’m a beginner using the Maximillian library to write a spectogram script using fft (from line-in input). I’m using the octave analyser bit of the library and have got a script which is basically working except for one problem- despite fiddling with the various input numbers quite a lot, the script doesn’t display lower frequencies (as I discovered when playing Aphex Twin’s [Equation] through it to look at the face in the track- he’s got no shoulders!) and I can’t really work out why.

pertinent bits of my header file:

#define BUFFER_SIZE 256
#define HISTORY_SIZE 1280
#define N_AVERAGES 150

class testApp : public ofBaseApp{
    private:
        float lAudio[BUFFER_SIZE];
        float rAudio[BUFFER_SIZE];
    
        ofxMaxiFFT fft;
        ofxMaxiFFTOctaveAnalyzer oct;
    
        float averages[HISTORY_SIZE][N_AVERAGES]; 
        int cindex;
        int dindex;
        int full;
};

and the main file:

void testApp::setup(){
ofSoundStreamSetup(0, 2, this, 44100, BUFFER_SIZE, 4);
ofBackground(50, 50, 50);

fft.setup(8192, 4096, 256);  
oct.setup(44100, 8192, 20);

void testApp::draw(){
    int windowWidth = 1200;
    float segWidth = windowWidth / BUFFER_SIZE;
    if(full < HISTORY_SIZE) { // circular buffer stuff
        dindex = 0;
    }
    else{
        dindex = cindex;
    }
    
    for(int i = 0; i < full; i++) {
        
        for(int j = 0; j < N_AVERAGES; j++) {
            float x = ofMap(averages[dindex][j], 0, N_AVERAGES, 0, 255); // map values to a colour value
            //printf("%f \n", averages[i][j]);
            
            ofColor c = ofColor::fromHsb(x, 255, 200);
            
            ofSetColor(c);
            ofCircle(i, N_AVERAGES*3 - j*3, 1);
        }
        dindex++;
        
        if(dindex == HISTORY_SIZE){
            dindex = 0;
        }
void testApp::audioIn(float *input, int bufferSize, int nChannels){
    for (int i = 0; i < bufferSize; i++){
        lAudio[i] = input[i*2];
        rAudio[i] = input[i*2+1];
        
        if (fft.process(input[i])) {  
            fft.magsToDB(); // calculate all the DBs  
            oct.calculate(fft.magnitudesDB); // this will store the DBs of each octave range  
            
            
        }  
    }
        
    for(int i = 0; i < N_AVERAGES; i++) {
        averages[cindex][i] = oct.averages[i];
    }
    
    cindex++;
    
    if (cindex == HISTORY_SIZE) {
        cindex = 0;
    }
    if (full < HISTORY_SIZE) {
        full++; // full is counter of how full the array is- needed for retrieving data from the array
    }

any help much appreciated- thanks!

Few ideas, (not super sound savvy, so take with a grain of salt). I think the oct should get 1/2 the value passed to fft size, in your case:

oct.setup(44100, 4096, 20);

If that’s not it, I’d try increasing the FFT size and the number of hops and decreasing the window size, maybe like:

fft.setup(16384, 1024, 512);

You also might want to try decresing the number of averages in the ofxMaxiFFTOctaveAnalyzer, like:

oct.setup(44100, 1024, 10);

Just some thoughts.