【发布时间】:2019-05-20 01:10:26
【问题描述】:
我知道有人问过这个问题,但没有明确的答案。 所以,我在这里找到了一些例子:FFT spectrum analysis 我可以在哪里使用 FFT 类转换我的双打数组
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;
}
我尝试实现一个公式,但它并没有给我带来任何好处——一些疯狂的数字
我也尝试过零传递:
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+、等等
有人可以帮我如何从麦克风获得更多或更少的实际频率吗?
【问题讨论】:
标签: java android fft android-audiorecord