我写了这个类来获取音频数据。我想使用音频输入来采样实时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的精度,如果可以实现更高的精度,那就更好了。 这段代码只是一个开始测试。我可以计算样品,我可以实现高精度吗?我担心由于处理时间会丢失一些样品吗?
答案 0 :(得分:0)
根据设备硬件的设置方式,您可能需要使用两个异步时钟来测量时间。
音频编解码器很可能使用自己的本地振荡器作为采样音频的字时钟,并将以此速率传送采样。同时nanoTime()
来自CPU时钟。两者都不是一个非常精确的定时参考。