在android中,如何实时获得正确的频率值?

时间:2014-03-25 04:19:39

标签: android audio fft frequency

我在这里查看了每一个答案,我不理解它们......我能够获得图表,但我怎样才能获得当前频率的单一值...我很感激代码答案而不是数学答案。

 public class RecordAudio extends AsyncTask<Void, double[], Void> {

    @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);

            //  double[] audioDataDoubles = new double[(blockSize*2)]; // Same values as above, as doubles
            //   -----------------------------------------------
            double[] re = new double[blockSize];
            double[] im = new double[blockSize];
            double[] magnitude = new double[blockSize];
            int sampleRate = 8000;                             // Sample rate in Hz

            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) {
                int bufferReadResult = audioRecord.read(buffer, 0,
                        blockSize);

                 for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                    toTransform[i] = (double) buffer[i] / 32768.0; // signed
                    // 16
                }                                       // bit
                transformer.ft(toTransform);



                publishProgress(toTransform);



            }

            audioRecord.stop();

        } catch (Throwable t) {
            t.printStackTrace();
            Log.e("AudioRecord", "Recording Failed");
        }
        return null;
    }
    public   double Index2Freq(int i, double samples, int nFFT) {
        return (double) i * (samples / nFFT / 2.);
    }
    public   int calculateF(int sampleRate, double [] audioData){

        int numSamples = audioData.length;
        int numCrossing = 0;
        for (int p = 0; p < numSamples-1; p++)
        {
            if ((audioData[p] > 0 && audioData[p + 1] <= 0) ||
                    (audioData[p] < 0 && audioData[p + 1] >= 0))
            {
                numCrossing++;
            }
        }

        float numSecondsRecorded = (float)numSamples/(float)sampleRate;
        float numCycles = numCrossing/2;
        float frequency = numCycles/numSecondsRecorded;

        return (int)frequency;
    }

    @Override
    protected void onProgressUpdate(double[]... toTransform) {

        canvas.drawColor(Color.BLACK);

        for (int i = 0; i < toTransform[0].length; i++) {
            int x = i;
            int downy = (int) (100 - (toTransform[0][i] * 10));
            int upy = 100;



            canvas.drawLine(x, downy, x, upy, paint);
        }

        imageView.invalidate();

           TxtV.setText("Frequency = "+String.valueOf(calculateF(8000, toTransform[0])));

        // TODO Auto-generated method stub
        // super.onProgressUpdate(values);
    }

}

1 个答案:

答案 0 :(得分:0)

如果按当前频率,你的意思是捕获的音频,意识到现场声音由大量的频率组成,所以你永远不会得到一个频率结果。

即使对于单个音乐音调也是如此(除了可能是零噪声下的合成纯正弦测试数据)。