Я знаю, что этот вопрос был задан, но на него нет четкого ответа.Итак, я нашел здесь пример: Анализ спектра БПФ Где я могу преобразовать свой массив двойников с классом БПФ
RealDoubleFFT transformer;
int blockSize= */2048;
short[] buffer = new short[blockSize];
double[] toTransform = new double[blockSize];
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);
, так что теперь я не знаю, какполучить частоту
Я написал такой метод:
public static int calculateFFTFrequency(double[] audioData){
float sampleRate = 44100;
int numSamples = audioData.length;
double max = Double.MIN_VALUE;
int index = 0;
for (int i = 0; i< numSamples -1; i++){
if (audioData[i] > max) {
max = audioData[i];
index = i;
}
}
float freq = (sampleRate / (float) numSamples * (float) index) * 2F;
return (int)freq;
}
Я пытаюсь реализовать формулу, но она не дает мне ничего хорошего - некоторые дикие числа
Iпопробовал также пройти ноль:
public static int calculateFrequency(short [] audioData){
int sampleRate = 44100;
int numSamples = audioData.length;
int numCrossing = 0;
for (int p = 0; p < numSamples-1; p++)
{
if ((audioData[p] > 0 && audioData[p + 1] <= 0) ||
(audioData[p] < 0 && audioData[p + 1] >= 0))
{
numCrossing++;
}
}
float numSecondsRecorded = (float)numSamples/(float)sampleRate;
float numCycles = numCrossing/2;
float frequency = numCycles/numSecondsRecorded;
return (int)frequency;
}
Но в методе обнуления, если я играю ноту "A" на пианино, она показывает мне 430 на мгновение (что близко к A), а затем начинает показывать какой-то дикийцифры, когда звук затухает - 800+, 1000+ и т. д.
Может кто-нибудь помочь мне получить более или менее актуальную частоту от микрофона?