私は、特定の周波数(1000Hz〜1500Hz)のホイッスルを検出することができるアプリケーションを実装しようとしています。環境的な背景雑音があっても、マイクから取り込まれた最大振幅がホイッスルの周波数に対応しているかどうかを調べるためにFFTメソッドを試してみました。Androidのホイッスル検出とマイク
public void run() {
if (ar == null) {
bufferSize = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
ar = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,bufferSize);
audioBuffer = new short[bufferSize];
ar.startRecording();
ar.read(audioBuffer, 0, bufferSize);
//Conversion from short to double
double[] micBufferData = new double[bufferSize];//size may need to change
final int bytesPerSample = 2; // As it is 16bit PCM
final double amplification = 1.0; // choose a number as you like
for (int index = 0, floatIndex = 0; index < (byte) bufferSize - bytesPerSample + 1; index += bytesPerSample, floatIndex++) {
double sample = 0;
for (int b = 0; b < bytesPerSample; b++) {
int v = audioBuffer[index + b];
if (b < bytesPerSample - 1 || bytesPerSample == 1) {
v &= 0xFF;
}
sample += v << (b * 8);
}
double sample32 = amplification * (sample/32768.0);
micBufferData[floatIndex] = sample32;
}
//Create Complex array for use in FFT
Complex[] fftTempArray = new Complex[bufferSize];
for (int i=0; i< (byte) bufferSize; i++)
{
fftTempArray[i] = new Complex(micBufferData[i], 0);
}
//Obtain array of FFT data
final Complex[] fftArray = FFT.fft(fftTempArray);
//final Complex[] fftInverse = FFT.ifft(fftTempArray);
//Create an array of magnitude of fftArray
double[] magnitude = new double[fftArray.length];
for (int i=0; i<fftArray.length; i++){
magnitude[i]= fftArray[i].abs();
}
double maxVal = -1.0;
int maxIndex = 1;
for(int j=0; j < fftArray.length/2; ++j) {
double v = magnitude[2*j] * magnitude[2*j] + magnitude[2*j+1] * magnitude[2*j+1];
if(v > maxVal) {
maxVal = v;
maxIndex = j;
}
}
maxFrequency = ((1.0 * 44100)/(1.0 * bufferSize)) * maxIndex;
}
runOnUiThread(new Runnable() {
@Override
public void run() {
if (isRunning) {
tv2.setText("Frequency Detected: " + maxFrequency);
}
}
});
}
私はすでになどマイク録音を設定しているが、私はコードがやっていると私は私のfftarrayが負であることを言っていくつかのエラーを取得していますかを理解することはできません。誰かが私が正しい方向を指すのを助けることができますか?またはホイッスル検出を実装するためのより良い方法はありますか?私はhereのコードを使用しています。私は2つの例外がスローされるのではなく、Nを得ています。
コードが何をしているのか分かりませんが、どういう意味ですか?あなたのものではありませんか? – stackoverflowuser2010
特定の周波数がサウンドに含まれているかどうかを確認する場合は、FFTを使用するのが適切です。あなたの質問は何ですか? – stackoverflowuser2010
コードを実行しようとするとエラーが発生します。私はjava.lang.RuntimeExceptionを取得します:Nは2の累乗ではありません最終複合体[] fftArray = FFT.fft(fftTempArray); –