我正在开发 lumiere 应用程序。我有一个特定频率的载波信号(更准确地说是 19.2 kHz),我需要在播放音频时获取它的幅度。我搜索了一些有关音频处理的信息,发现为了获得频谱,您必须使用 FFT 算法。
我已经尝试过 TarsosDSP 库及其 FFT 类。
TarsosDSPAudioFormat format = new TarsosDSPAudioFormat((float) SAMPLE_RATE, 16, 1, true, false);
TarsosDSPAudioFloatConverter converter = TarsosDSPAudioFloatConverter.getConverter(format);
float[] buff = new float[bufferFloatSize];
final float[] amps = new float[fftSize];
converter.toFloatArray(tmpBuffer, buff);
FFT fft = new FFT(bufferFloatSize, new HannWindow());
fft.forwardTransform(buff);
fft.modulus(buff, amps);
然后我得到频带索引并计算它的幅度
int amp = (int) (10 * Math.log10(amps[index]);
但我得到错误的幅度。我有一个 19.2kHz 信号的音频文件,其振幅恒定为 0 dB,但 19207 Hz 振幅的结果值在 -39 dB 到 -46 dB 之间变化。我检查了相邻的频率,可能其中一些有 0 dB,但没有。我还检查了 -36 dB 和 -60 dB 的文件,但结果分别为 -39 到 -48 dB 和 -44 到 - 61 dB。
正如我们可以看到的最后一个文件,它很接近,但它不是恒定的,我无法预测它何时正确,何时错误。
如果有人遇到这个问题,请帮助我。如果您知道任何其他肯定可行的好的 FFT 库 - 告诉我
更新:好的,我已经添加了 TSG 的函数并在我的 fft.forwardTransform() 之前和之后调用它来比较结果;结果是:对于 0 dB 19.2kHz 音频文件:之前:-39 dB 之后 - 10 dB
对于 -36 dB 19.2kHz 音频文件:之前:-75 dB 之后:-46 dB
对于 -60 dB 19.2kHz 音频文件:之前:-97.7 dB 之后:-69 dB
现在结果是恒定的,不会随着时间或尝试而改变。我们还可以看到结果中存在一定的模式。在 fft 之前,结果与正确的结果不同,为 -39 dBs,之后为 -10dBs。所以问题是:为什么我们会犯这些错误?