【问题标题】:Android realtime audio acquisition - losing some samples?Android 实时音频采集 - 丢失一些样本?
【发布时间】:2013-10-28 22:14:31
【问题描述】:

我写了这个类,来获取音频数据。我想使用音频输入来采样实时射频信号。我以 44kHz 的频率进行采样,并且我希望通过测量获得的总样本数知道经过的时间,知道采样频率。

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

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

这是我的测试代码:

 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 个特定信号波形之间的精确经过时间。 我希望至少有 1 毫秒的精度,如果可以实现更高的精度就更好了。 这段代码只是一个开始测试。可以计算我可以达到高精度的样本吗?我担心我会因为处理时间而丢失一些样品?

【问题讨论】:

    标签: android audio real-time sampling elapsedtime


    【解决方案1】:

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

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

    【讨论】:

    • wait @marko,我需要计算在麦克风输入上接收到的 2 个特定信号波形之间的精确经过时间。如果您的假设是正确的,那么样本数应该是一个非常准确的时序参考。我唯一担心的是,在一个块和下一个块之间,一些样本会丢失(原因现在我不知道,例如由于信号处理程序较长)。我编辑了我的问题,你能更新你的答案吗?
    • 是的。您绝对应该使用采样时钟来执行此操作。如果您想验证您没有丢弃样本(这可能是由于缓冲区溢出而发生的),请记录一个纯正弦曲线并分析记录的信号是否不连续 - 或者简单地举例它的频谱图并查找除您发送到输入的一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2011-04-29
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多