Detecting 49Hz through MAX4466 microphone + FFT

For a 120 Hz sample rate, you need to have a brick wall low pass filter on the input, with a cutoff at 60 Hz (very difficult to accomplish, especially if you are interested in a 49 Hz signal). Otherwise the aliasing artifacts will generally make the output uninterpretable. Look up "Sampling Theorem Aliasing" to see why.

As long as you are not memory limited, a much better approach is to sample at a much higher rate, for sufficiently large number of samples, and look only at the lowest frequency bins. In any case you will still want a very good low pass filter after the microphone.

For detecting a specific frequency, autocorrelation usually works better. You might try something like the following, which collects 16 samples of the input signal at 8 times the frequency of interest, then XORs the upper and lower bytes of the sample together. If the result is "mostly" zero, the sampling frequency is close to the target frequency or one of its harmonics. Still need a low pass filter on the input!

// fast audio tone detector, autocorrelation function.
// uses analog comparator module on the Arduino Uno as "input amplifier"
// pin D6 = capacitively coupled audio input, biased to Vcc/2
// pin D7 = reference voltage, Vcc/2 (e.g. 10K/10K voltage divider)

#define LED 13
float f0 = 1000.0; //target frequency in Hz
unsigned int p0 = 1.0E6 / (8.0 * f0); //sample delay in microseconds (8 samples per target cycle)

union i2b { //16 bit integer also referenced directly as two bytes
  unsigned int i;
  unsigned char b[2];
} val;

void setup ()
{
  Serial.begin (9600);
  Serial.print("Sample delay us ");
  Serial.println(p0);
  delay(500);
  pinMode(LED, OUTPUT); //on board LED
  digitalWrite(LED, 0);

  ADCSRB = 0;           // (Disable) ACME: Analog Comparator Multiplexer Enable
  DIDR1 = 3;            //disable digital inputs on D6/D7 (comparator AIN0/AIN1)
  ACSR = (1 << ACI); //clear Analog Comparator interrupt flag, just in case
}  // end of setup

void loop ()
{
  static unsigned char i, j, result, sum;
  sum = 0;
  for (j=0; j<10; j++) {  //sample input ten times
    
  
  val.i = 0;
  for (i = 0; i < 16; i++) {  //collect 16 bit sample
    if (ACSR & (1 << ACO)) val.i |= 1; //if input is HIGH, set bit in sample
    val.i <<= 1;
    delayMicroseconds(p0);
  } //loop i

  if ( (val.b[0] == 0) || (val.b[0] == 0xFF)) return; //no signal
  result = val.b[1] ^ val.b[0]; //compare the two one-byte samples

  if (result == 0 ) sum++;  //test the match, count zeros as success
  } // loop j
  
  if (sum > 7) digitalWrite(LED, 1); //7 out of 10 samples matched
  else digitalWrite(LED,0);
}  // end of loop