title: Get the frequency of an audio file in every 1/4 seconds in android
body: <p>I have a sound file (.3gp) and its about ~1 min. I would like to get the frequency of this sound file in every 1/4 seconds.  My idea is to receive samples in every 1/4 seconds from the audio file and using FFT I might get the frequency values. Is there any way to do this?</p>
  
  <p>Actually I would split the sound file into 1/4sec samples sound files (alwyas overwriting the preveious one), then using FFT algorithm and detect the frequency where the magintude is the bigggest. But there might be easier solutions however I dont have a clue how to do this either.</p>
  
  <p>***UPDATE 2 - new code</p>
  
  <p>I use this code so far:</p>
  
  <pre><code>public class RecordAudio extends AsyncTask&lt;Void, double[], Void&gt; {
  
      @Override
      protected Void doInBackground(Void... arg0) {
  
          try {
               int bufferSize = AudioRecord.getMinBufferSize(frequency,
               AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
  
  
              //int bufferSize = AudioRecord.getMinBufferSize(frequency, 
                    //  channelConfiguration, audioEncoding); 
  
              AudioRecord audioRecord = new AudioRecord( 
                      MediaRecorder.AudioSource.MIC, frequency, 
                      channelConfiguration, audioEncoding, bufferSize); 
  
              short[] buffer = new short[blockSize];
              //double[] toTransform = new double[blockSize];
  
  
              audioRecord.startRecording();
  
  
              // started = true; hopes this should true before calling
              // following while loop
  
              while (started) {
                 sampling++;
  
                 double[] re = new double[blockSize];
                 double[] im = new double[blockSize];
  
                 double[] newArray = new double[blockSize*2];
                 double[] magns = new double[blockSize];
  
                 double MaxMagn=0;
                 double pitch = 0;
  
                 int bufferReadResult = audioRecord.read(buffer, 0,
                          blockSize);
  
  
                 for (int i = 0; i &lt; blockSize &amp;&amp; i &lt; bufferReadResult; i++) {
                     re[i] = (double) buffer[i] / 32768.0; // signed   16bit
                     im[i] = 0;
                 }    
  
                 newArray = FFTbase.fft(re, im,true);
  
                 for (int i = 0; i &lt; newArray.length; i+=2) {
  
                     re[i/2]=newArray[i];
                     im[i/2]=newArray[i+1];
                     magns[i/2] = Math.sqrt(re[i/2]*re[i/2]+im[i/2]*im[i/2]);
                 }
  
                // I only need the first half      
  
                for (int i = 0; i &lt; (magns.length)/2; i++) {
                     if (magns[i]&gt;MaxMagn)
                     {
                         MaxMagn = magns[i];
                         pitch=i;
                     }
                 }                                           
                   if (sampling &gt; 50) {
                     Log.i("pitch and magnitude", "" + MaxMagn + "   " + pitch*15.625f);
                     sampling=0;
                     MaxMagn=0;pitch=0;
                     }                   
  
  
              }
  
              audioRecord.stop();
  
          } catch (Throwable t) {
              t.printStackTrace();
              Log.e("AudioRecord", "Recording Failed");
          }
          return null;
      }
  </code></pre>
  
  <p>I use this: <a href="http://www.wikijava.org/wiki/The_Fast_Fourier_Transform_in_Java_%28part_1%29" rel="nofollow noreferrer">http://www.wikijava.org/wiki/The_Fast_Fourier_Transform_in_Java_%28part_1%29</a></p>
  
  <p>Guitar strings seem correct, but my own sound is not good because of this:</p>
  
  <p><img src="https://i.stack.imgur.com/ZegAg.png" alt="enter image description here"></p>
  
  <p>The magnitude of the two peaks change most of the time and I always find the biggest to get the fundamental frequency.</p>