Android实时音频采集 - 丢失一些样品?

时间:2013-10-28 22:14:31

标签: android audio real-time sampling elapsedtime

我写了这个类来获取音频数据。我想使用音频输入来采样实时RF信号。我采样@ 44kHz,我希望通过测量采集的总采样数知道经过的时间,知道采样频率。

我不知道为什么我发现system.nanoTime测量的经过时间与采集的样本除以频率之间的增量时间。为什么每次开始/停止采集时这个大约170ms的增量会发生变化?我是否会从获得的信号中丢失样本?

基本上,我所做的是将started布尔值设置为true来调用此类,然后在几秒钟之后将此布尔值设置为false,然后该类退出while循环,然后我测量经过的时间并提取delta。

这是我的测试代码:

 public class RecordAudio extends AsyncTask<Void, Long, Void> {

    @Override
    protected Void doInBackground(Void... arg0) {

        try {
            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
            double aquiredSignalLen=0;
            long elapsedTime = System.nanoTime();

            while (started) {
                int bufferReadResult = audioRecord.read(buffer, 0,blockSize);

                double tmpElTime1=(double)bufferReadResult/(double)44000;
                aquiredSignalLen=aquiredSignalLen+tmpElTime1;
            }

            //when i stop the acquisition, i calculate the elapsed time,
            //and i compare the result with the elapsed time measured counting
            //the total number of samples

            elapsedTime = System.nanoTime() - elapsedTime;
            double elapsedTimeDouble=(double)elapsedTime/1000000000;
            double delta=elapsedTimeDouble-aquiredSignalLen;
            audioRecord.stop();


        } catch (Throwable t) {
            t.printStackTrace();
            Log.e("AudioRecord", "Recording Failed");
        }
        return null;
    }

我问了这个问题,解决了这个问题: 我需要计算在麦克风输入上接收的2个特定信号波形之间的精确经过时间。 我想要至少1mS的精度,如果可以实现更高的精度,那就更好了。 这段代码只是一个开始测试。我可以计算样品,我可以实现高精度吗?我担心由于处理时间会丢失一些样品吗?

1 个答案:

答案 0 :(得分:0)

根据设备硬件的设置方式,您可能需要使用两个异步时钟来测量时间。

音频编解码器很可能使用自己的本地振荡器作为采样音频的字时钟,并将以此速率传送采样。同时nanoTime()来自CPU时钟。两者都不是一个非常精确的定时参考。