【发布时间】:2017-02-11 23:03:36
【问题描述】:
我正在开发 lumiere 应用程序。我有一个特定频率的载波信号(更准确地说是 19.2 kHz),我需要在播放音频时获取它的幅度。 我在 Google 上搜索了一些有关音频处理的信息,发现为了获得频谱,您必须使用 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 分贝 之后 - 10 分贝
对于 -36 dB 19.2kHz 音频文件: 之前:-75 分贝 之后:-46 分贝
对于 -60 dB 19.2kHz 音频文件: 之前:-97.7 分贝 之后:-69 分贝
现在结果是恒定的,不会随着时间或尝试而改变。 我们还可以看到结果中存在一定的模式。在 fft 之前,结果与正确的结果不同,为 -39 dBs,之后为 -10dBs。 所以问题是:为什么我们会犯这些错误?
【问题讨论】:
标签: java android audio fft tarsosdsp