私はAndroidプラットフォームを使用していますが、次の参照質問から、生データを返すAudioRecordクラスを使用すると、必要に応じて可聴周波数の範囲をフィルタリングできることがわかりましたが、そのためにはアルゴリズムが必要です。誰かが私を見つけるのを手伝ってくれますか?範囲b/w14,400bphおよび16,200bphをフィルタリングするアルゴリズム。
「JTransform」を試しましたが、JTransformで実現できるかわかりません。現在、私は「jfftpack」を使用して非常にうまく機能する視覚効果を表示していますが、これを使用してオーディオフィルターを実現することはできません。
よろしくお願いします。以下は、上記の私のコードです。「jfftpack」ライブラリを使用して表示しています。コード内にこのライブラリ参照が含まれている可能性があります。混乱しないでください。
private class RecordAudio extends AsyncTask<Void, double[], Void> {
@Override
protected Void doInBackground(Void... params) {
try {
final AudioRecord audioRecord = findAudioRecord();
if(audioRecord == null){
return null;
}
final short[] buffer = new short[blockSize];
final double[] toTransform = new double[blockSize];
audioRecord.startRecording();
while (started) {
final int bufferReadResult = audioRecord.read(buffer, 0, blockSize);
for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
toTransform[i] = (double) buffer[i] / 32768.0; // signed 16 bit
}
transformer.ft(toTransform);
publishProgress(toTransform);
}
audioRecord.stop();
audioRecord.release();
} catch (Throwable t) {
Log.e("AudioRecord", "Recording Failed");
}
return null;
/**
* @param toTransform
*/
protected void onProgressUpdate(double[]... toTransform) {
canvas.drawColor(Color.BLACK);
for (int i = 0; i < toTransform[0].length; i++) {
int x = i;
int downy = (int) (100 - (toTransform[0][i] * 10));
int upy = 100;
canvas.drawLine(x, downy, x, upy, paint);
}
imageView.invalidate();
}