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

标签 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);
    }

}

最佳答案

如果以当前频率来表示捕获的音频,请意识到实况声音是由大量频率组成的,因此您将永远不会仅获得一个频率结果。

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

关于android - 在android中,如何实时获取正确的频率值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22625366/

相关文章:

android - 不幸的是 "appname"已经停止工作

loops - 为什么不能在Scratch中循环播放音乐?

python - 在 FFT 频率下计算 dFT

android - 任何 Android 都支持麦克风类吗?

audio - 使用 ffmpeg 顺序添加多个音轨并将特定音轨固定到末尾

fft - 如何修改 FFT 结果以均衡音乐样本

c++ - 在短时傅里叶变换中获取特定频率的值

android - 我刚刚在 Eclipse 中创建了一个小的 android 项目,我应该将哪些文件添加到版本控制中?

android - 在android中无间断地播放连续视频流

android - 使用 cordova/phonegap 获取用户电话号码