提高从AudioRecord获取样本的速率

时间:2016-07-05 13:52:43

标签: java android audiorecord

嘿所以我正在尝试从音频设备录制数据并绘制图表。它是从压电器录制的,输出功率在16khz到19khz之间。下面我将有相关的代码。我目前的问题是数据不能以足够快的速度计算或读取。我不是音响工程师,很多FFT工作都来自多个资源。

这是我正在谈论的图片。正如您所看到的,我从qrs复合体中的第一个R波获得1个数据点。起初我得到了一个。然后我改变了我的最小缓冲区大小* 500,这似乎给了我两个数据点。我希望在很短的时间内有几个能够获得准确的读数。

TLDR:我要改变的是,我每秒可以获得更多的频率读数。

https://dl2.pushbulletusercontent.com/mugoZmNLGtbCta4Si5Pu4RUdJOgMqILK/Screenshot_20160705-094146.png

和我的代码...... 缓冲区正被添加到已声明的列表中。我正在使用的FFT方法需要一个简短的[]

public int audioSource = MediaRecorder.AudioSource.MIC;
public int channelConfig = AudioFormat.CHANNEL_IN_MONO;
public int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
public AudioRecord audioRecord = null;
public int blockSize = 256;                               // deal with this many samples at a time
public int sampleRate = 44100;                             // Sample rate in Hz

    public void audioRecordLoop() throws Exception {
    new Thread(new Runnable() {
        @Override
        public void run() {
            Log.e(TAG, "start audioRecordLoop");

            int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioEncoding);
            audioRecord = new AudioRecord(audioSource, sampleRate, channelConfig, audioEncoding, bufferSize * 500);

            if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
                Log.e(TAG, "AudioRecord init failed");
                return;
            }
            final short[] buffer = new short[blockSize];
            audioRecord.startRecording();
            int len = 0;
            while (isRecording == true) {
                len = audioRecord.read(buffer, 0, blockSize);
                shortList.add(buffer);
                if (len < 0) {
                    Log.e(TAG, "read error " + len);
                    return;
                }
            }
            if (audioRecord != null)
                audioRecord.release();
        }
    }).start();

}

计算

 public void calcFrequency() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            FrequencyScanner frequencyScanner = new FrequencyScanner();
            while (isRecording) {
                if (shortList != null && shortList.size() > 0) {
                    short[] shorts = shortList.get(0);
                    final double frequencys = frequencyScanner.extractFrequency(shorts, sampleRate);
                    frequencyList.add(frequencys);
                }
            }
        }
    }).start();
}

然后绘制图表

public void graphFrequenecy() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            while (isRecording) {
                try {
                    if (frequencyList != null && frequencyList.size() > 0) {
                        final double frequency = frequencyList.get(0);
                        if (frequency > 13000) {
                            Log.d(TAG, "run: " + frequency);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    series.appendData(new DataPoint(series.getHighestValueX() + 1, frequency), true, 3000);
                                }
                            });
                        }
                        frequencyList.remove(0);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}

0 个答案:

没有答案