可以使用FFT (Fast Fourier Transformation)算法来计算音频数据的频率幅度。以下是一个简单的示例代码:
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
sampleRate, channelConfig,
audioFormat, bufferSize,
AudioTrack.MODE_STREAM);
// generate audio data
byte[] audioData = generateAudioData();
audioTrack.write(audioData, 0, audioData.length);
// calculate the frequency spectrum of the audio data
double[] magnitude = new double[bufferSize / 2];
FFT fft = new FFT(bufferSize);
fft.forward(audioData);
fft.magnitude(magnitude);
// find the maximum magnitude
double maxMagnitude = -1;
for (int i = 0; i < magnitude.length; i++) {
if (magnitude[i] > maxMagnitude) {
maxMagnitude = magnitude[i];
}
}
// convert magnitude to decibels
double magnitudeDB = 20 * Math.log10(maxMagnitude);
Log.d(TAG, "Magnitude in dB: " + magnitudeDB);
在这个例子中,我们使用FFT算法计算音频数据的频率幅度。我们基本上使用FFT来将时域信号转换为频域信号。首先,我们生成一些音频数据,并将其写入AudioTrack。然后,我们使用FFT将音频数据转换为频域数据。我们使用magnitude()函数来计算幅度。最后,我们找到幅值中的最大值,并将其转换为分贝(dB)格式,以便更好地比较。
请注意,此方法仅适用于单频音频信号。在包含多个频率的信号的情况下,FFT将显示多个幅度值。在这种情况下,您需要解决谁是主导频率的问题。