オーディオデータを取得するために、このクラスを作成しました。オーディオ入力を使用して、リアルタイムの RF 信号をサンプリングしたいと考えています。私は 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 ミリ秒の精度が必要です。より高い精度が達成可能であれば、より良い結果が得られます。このコードは単なる開始テストです。高精度を達成できるサンプルを数えている可能性がありますか?私の恐れは、処理時間のためにいくつかのサンプルを失う可能性があるということですか?