Android: fundamental frequency I want to find the fundamental frequency for human voice in an Android Application. I want to use autocorrelation method. My code is this:

public double calculateFFT(double[] signal)

     {
      final int mNumberOfFFTPoints =1024;

      double[] magnitude = new double[mNumberOfFFTPoints/2];
      DoubleFFT_1D fft = new DoubleFFT_1D(mNumberOfFFTPoints);
      double[] fftData = new double[mNumberOfFFTPoints*2];
      double max_index=-1;
      double max_magnitude=-1;


      final float sampleRate=44100;
      double frequency;

      for (int i=0;i&lt;mNumberOfFFTPoints;i++){

       //fftData[2 * i] = buffer[i+firstSample];
       fftData[2 * i] = signal[i];  //da controllare
       fftData[2 * i + 1] = 0;

       fft.complexForward(fftData);
      }

      for(int i = 0; i &lt; mNumberOfFFTPoints/2; i++){

       magnitude[i]=Math.sqrt((fftData[2*i] * fftData[2*i]) + (fftData[2*i + 1] * fftData[2*i + 1]));

       if (max_magnitude&lt;magnitude[i]){
        max_magnitude=magnitude[i];
        max_index=i;
       }
      }
      return frequency=sampleRate*(double)max_index/(double)mNumberOfFFTPoints;

 }


I used "edu.emory.mathcs.jtransforms.fft.DoubleFFT_1D;"
Is my "return"  the value of fundamental frequency or not? 

thanks



I changed my code in this mode:

    public double calculateFFT(double[] signal)

    {

        final int mNumberOfFFTPoints =1024;
        double[] magnitude = new double[mNumberOfFFTPoints/2];
        DoubleFFT_1D fft = new DoubleFFT_1D(mNumberOfFFTPoints);
        double[] fftData = new double[mNumberOfFFTPoints*2];

        double max_index=-1;
        double max_magnitude=-1;

        final float sampleRate=44100;
        double frequency;


        for (int i=0;i&lt;mNumberOfFFTPoints;i++){

            fftData[2 * i] = signal[i];  
            fftData[2 * i + 1] = 0;

            }

        fft.complexForward(fftData);

        for(int i = 0,j=0; i &lt; mNumberOfFFTPoints/2; i += 2,j++){

            magnitude[j]=Math.sqrt((fftData[2*i] * fftData[2*i]) + (fftData[2*i + 1] * fftData[2*i + 1]));

        }
         fft.complexInverse(fftData, false);

         for(int i=0;i&lt;magnitude.length;i++)

            if (max_magnitude&lt;magnitude[i]){
                max_magnitude=magnitude[i];
                max_index=i;
            }

            return frequency=sampleRate*(double)max_index/(double)mNumberOfFFTPoints;

}


in this mode I calculate autocorrelation thanks inverse transform "fft.complexInverse(fftData, false);"; isn't it? 
And also in this case isn't the "return" the fundamental frequency?
Very often not.  Your posted code is for finding an FFT magnitude, not an autocorrelation result, and thus likely to fail at estimating the fundamental pitch of sound/voice/music with typically high overtone or harmonic content.